java学习--集合(大写一.1)

看尚硅谷视频做的笔记

1.集合框架概述

1.1生活中的容器

首先知道集合是来解决什么问题的?
在这里插入图片描述

1.1.1内存层面需要针对于多个数据进行存储,此时,可以考虑的容器有:数组、集合类

对于内存层面的来说,断电后数据就不复存在,内存层面的数据都是一些临时性处理的数据。跟数据库的数据不是一个维度。
在这里插入图片描述

就相当于数据是先从数据库读到内存中,数据库的数据可以用数组去存、也可以用集合去存储。
在这里插入图片描述

1.2 数组的特点、弊端

1.2.1数组存储多个数据方面的特点

①数组一旦初始化,长度就确定了。
②存储的数据有相关特点:依次紧密排列,并且是有序、可重复的
③优点:数组一旦初始化完成,其元素的的类型就是确定的,不是此类型的元素,就不能添加到此数组中。

声明int类型,就只能是int类型,声明是String类型,就只能是String类型

在这里插入图片描述

int [ ] arr=new int[10];
arr[0]=1;
arr[1]=‘AA’//编译报错;
在这里插入图片描述
在这里插入图片描述
想体现更灵活的用户,就声明为Object类型数组
Object obj=new Object[];
obj[0]=‘AA’;
obj[1]=1;
obj[2]=new String();
obj[3]=new Date();
在这里插入图片描述
在这里插入图片描述

④优点:元素的类型即可以是基本数据类型,也可以引用数据类型。

集合中的元素存放只能是基本数据类型,不能是引用数据类型。若你集合中有基本类型的需求那只能用包装类的对象往里放,就只能放对象特征。
对集合来讲,其实对类型没有什么要求,可以随便往里放数据类型。不会对类型进行检查,这样就会使得容器里的东西比较杂,不安全,怎么办?下一章会讲1泛型,性新特性。泛型就专门限制往集合里放的类型。
泛型类型,写的是String,就只往里放String,其他类型就放不进去。
泛型就可以达到跟数组一样的特征。

在这里插入图片描述

1.2.2数组存储多个数据方面的弊端

①数组一旦初始化,长度就不可变了。

在这里插入图片描述
数组new的时候在堆空间是一整块空间

在这里插入图片描述
1和1就可以看成是可以重复的
在这里插入图片描述

在这里插入图片描述

②数组中存储数据特点的单一性、对于无序、不可重复的常见的多个数据就无能为力了
③数组中可用的方法、属性都极少,具体的需求,都需要自己组织相关的代码逻辑。

在这里插入图片描述

④针对于数组中的元素的删除、插入操作、性能较差,原因是因为:存储的数据、依次紧密排列,

在这里插入图片描述

1.3Java集合框架体系

在这里插入图片描述

这章整体是从接口体系出发的
像之前讲异常体系都是从类出发threable \errable\exception

比较典型的接口有两个:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.3.1 java.util.Collection接口:存储一个一个的数据

在这里插入图片描述

①------List子接口:有序可以重复的数据
List子接口下面具体的实现类:ArrayList(主要的实现类)、LinkedList、Vector
②------Set子接口:无序不可重复的数据
Set子接口下面具体的实现类:HashSet(主要的实现类)、LinkedHashSet、TreeSet

1.3.2 java.util.Map接口:存储一对一对的数据(key-value,一个key对应一个value,键值对数据)

在这里插入图片描述

一个x1对应一个y1,一个x2对应一个y2,综合就相当于是函数y=f(x)

Map会有针对于key、value的要求,不同的key可以指向同一个value,一个key不能指向多个value
y=x ^2

x=-1,x=1,y=1

Map这里也是一样,不同key可以指向同一个value,同一个key不能指向多个value

在这里插入图片描述在这里插入图片描述
跟Collection并列的接口Map,Map没有子接口

①直接提供的具体的实现类HashMap(主要的实现类)、LinkedHashMap、TreeMap、Hashtable、Properties

HashSet的底层就是HashMap
LinkedHashSet的底层是LinkedHashMap
TreeSet的底层是TreeMap
在这里插入图片描述
在这里插入图片描述

1.3.3怎么理解List存储有序可以重复的数据?

List跟前面的数组有些类似:称为动态数组,可以动态扩展底层数组的长度。
其实List就可以替换以前的数组,具体用的话就是实现类,ArrayList是作为主要的实现类

在这里插入图片描述

我们要做的就是具体的实现类是谁,怎么创建对象?怎么用常用的方法完成项目的需求

1.4集合的使用场景

1.4.1无序不可重复的使用场景:黑名单、手机骚扰电话拦截

黑名单其实就是一个Set集合,加进黑名单后,就没有必要再加一份

在这里插入图片描述
红色圈住的都是可以理解为对象,这里面就有多个对象,多个对象就考虑容器去装,上下是有顺序讲究,以前是数组,现在可以用集合List实现类,ArrayList去装数据即可
在这里插入图片描述
这一项可以用对象去封装数据,也可以不用对象去封装,可以用一个Map容器
Map容器是一个键值对
在这里插入图片描述
下面圈住的红色结构
里面都是key,key可以理解成一个标签
在这里插入图片描述
key在这里是image,imagepath对应的是url地址,即就是键值
多个Map构成List
在这里插入图片描述
安卓或者pc客户端发送请求到服务端,服务端可以用java代码去编写逻辑,java可以去访问数据库
数据库返回的是数据是结果集给java层面的代码最后再响应给客户端即就是看到的页面数据
本质上页面的数据都是来自数据库,java的作用就是根据用户的个性化请求访问数据库返回给客户端,在服务器的层面写的都是java代码,针对于数据可以使用List、Map进行去装数据,至于返回到客户端是什么样的格式,暂时不多说。
在这里插入图片描述

1.5学习的程度把握

1.5.1 层次一:针对于具体特点的多个数据,知道选择相应的适合的接口主要实现类,会实例化,会调用常用的方法。

在这里插入图片描述

1.5.2 层次二:区分接口中不同的实现类的区别

在这里插入图片描述

1.5.3 层次三:①针对于常用的实现类,需要熟悉底层源码。②熟悉常见的数据结构(第14章讲)

后面就先讲Collection,再讲Map
在这里插入图片描述

2.collection接口及方法

jdk8里有一些默认的方法,更多的是体现的是一种规范,规范更多关注的是一些抽象方法。
看接口里面的抽象方法,选一个具体的实现类。
测试collection的方法,存储一个一个数据都有哪些功能方法可以进行调。
因为是接口,想演示接口中的方法,就需要先声明Collection
在这里插入图片描述

右边一定要选一个实现类,即就用ArrayList
此处就使用了多态
在这里插入图片描述

多态
场景时调的时候.
coll.时候只能调出Collection接口里面声明的方法
在这里插入图片描述
所以借着右边ArrayList看左边Collection接口的方法
具体执行还是右边ArrayList中的方法,那右边执行方法就等于左边Collection方法吗?(虽然接口中的方法么没有方法体,方法的用途是确定的,所以此处不影响去理解Collection接口中的方法)
在这里插入图片描述
COllection用ctrl+c,再打开API
在这里插入图片描述

在jdk8加了静态方法和默认方法,现在暂时不关注,后面String的Api再关注
在这里插入图片描述
现在关注的都是抽象方法,15个抽象方法
在这里插入图片描述
如果自己设计一个Collection,去存储一个一个的数据,会设计哪些方法?

2.1 添加

2.1.1add(E obj)添加元素对象到当前集合中,一个一个添加元素

在这里插入图片描述
在这里插入图片描述
123基本数据类型,此处是自动装箱操作在这里插入图片描述
在这里插入图片描述
造一个自定义类的对象Person
在这里插入图片描述
提供name,age,再提供空参构造器
在这里插入图片描述
再提供带参构造器
在这里插入图片描述
get,set方法省略,提供toString方法
在这里插入图片描述
new一个Tom
在这里插入图片描述
以上就添加了5个对象

此处打印的时候里面也调了toString方法d在这里插入图片描述
就将对象打印了出来
在这里插入图片描述

2.1.2addAll(Collection other):添加other集合中的所有元素对象到当前集合中,即this=this U other

(将参数中的元素都加到当前集合中coll)
在这里插入图片描述

新建coll1
在这里插入图片描述
对coll1加点数据,加完后进行调用addAll方法,再进行打印
在这里插入图片描述
在原有的数据上又加了两个数据,原先是5个元素,现在加了两个数据后是7个元素
在这里插入图片描述
size获取集合中元素个数的方法
在这里插入图片描述
在这里插入图片描述

2.1.3注意:add和addAll的区别

coll.add是将coll1集合看成是整体的一个元素
在这里插入图片描述
此时再查询集合元素的个数就是6
在这里插入图片描述
整个coll1集合中的元素充当了一个元素
在这里插入图片描述

在这里插入图片描述

2.2判断

2.2.1 int size()获取当前集合中实际存储的元素个数

2.2.2 boolean isEmpty()获取当前集合中是否为空集合

判断集合是否为空,false
在这里插入图片描述
在这里插入图片描述

2.2.3 boolean contains(Object obj)判断当前集合中是否存在一个与obj对象equals返回true的元素

判断是否包含AA
在这里插入图片描述
返回值为true
在这里插入图片描述
coll.contains(128),返回的结果为true
coll.contains(128)此处是自动装箱,128此处已经超出了数组的范围,这就是新new的,
在这里插入图片描述

在这里插入图片描述
这个包含的128是新new的,此处比较的不是==,不是比地址,
在这里插入图片描述

举例说一下,此处new的是一个String在这里插入图片描述
判断是否包含,此处返回也是true,比较的不是地址,而是比较的是内容
在这里插入图片描述
调的是equals方法,String和Integer都重写过,即都是true
在这里插入图片描述

此处这样是true
在这里插入图片描述

此处运行返回后,是false
System.out.println(coll.contains(new Person(“Tom”,12)));此处按理说调的还是equals方法-再去看Person类的代码,Person类的代码里没有重写equals方法,用的是Object里的equals方法就是==,进行地址比较

在这里插入图片描述
在这里插入图片描述
这两个地址相比显然不一样,即就是false
在这里插入图片描述
在这里插入图片描述
一般调contains时都是调的是equals方法,就是比内容,对于自定义对象的这种想往集合里放元素,都要求在自定义类中重写equals方法alt+insert 在这里插入图片描述

在这里插入图片描述
hashcode代码用不着可以进行注释
在这里插入图片描述
可以发现调用了几次
在这里插入图片描述
调用了四次
在这里插入图片描述

contains若添加的是自定义的类的对象,就需要在自定义类中加上重写的equals方法

2.2.4 boolean containsAll(Object obj)判断coll集合中的元素是否在当前集合中都存在,即coll集合中的元素是否在集合中的子集。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.2.5 boolean equals(Object obj):判断当前集合与obj是否相等

在这里插入图片描述
在这里插入图片描述

2.3删除

在这里插入图片描述

2.3.1 void clear():从当前集合中删除第一个找到的与obj对象equals返回true的元素

在这里插入图片描述
在这里插入图片描述
打印size为0,不是空指针的原因是test3方法里有Collection p1=new ArrayList()对象
在这里插入图片描述
在这里插入图片描述
clear方法的原理
Collection p1=new ArrayList(),ArrayList集合底层也是数组
此处只能是放对象,都是Object,此处都是放的地址值(因为是引用类型)
在这里插入图片描述

在这里插入图片描述
地址值再指向new的对象
在这里插入图片描述

一个一个进行清理掉(而不是size为0,防止内存泄漏)
在这里插入图片描述

2.3.2 boolean remove(Object obj):删除指定元素。从当前集合中删除所有与coll集合中相同的元素,即this=this-this交集 coll

在这里插入图片描述
在这里插入图片描述
此处new一个person,能否删掉
在这里插入图片描述
此处删掉了,删的话判断有新new的对象就会进行删除,判断有没有时调的是equals方法(肯定有啊),有就会进行删除,remove是一旦找到了想要删除的元素就会停止进行操作

在这里插入图片描述

2.3.3 boolean removeAll(Collection coll):删除集合中的所有元素。从当前集合中删除两个集合中不同的元素,使得当前集合仅留与coll集合中的元素相同的元素,即当前集合中仅保留两个集合的交集。即this=this交集 coll

coll.removeAll(coll1)删除coll1所有元素
差集的意思
在这里插入图片描述

2.3.4boolean retainAll(Collection coll):从当前集合中仅保留与coll集合中的元素相同的元素、即当前集合中仅保留两个集合的交集,即this=this交集coll

即是交集
在这里插入图片描述

2.4其他在这里插入图片描述

2.4.1Object[] toArray():返回包含当前集合中所有元素的数组,集合—>数组

在这里插入图片描述
先整一个集合过来
在这里插入图片描述
集合怎么转换成数组
在这里插入图片描述
返回值是用Object类型数组进行装(因为添加的时候都是Object)
在这里插入图片描述
看一下数组具体的元素都有哪些?此处有一个简便的方法
在这里插入图片描述
这就是数组中的元素
在这里插入图片描述

2.4.2hashcode[]:获取集合对象的哈希值

在这里插入图片描述

2.4.2iterator:返回迭代器对象,用于集合遍历

2.5总结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.5.1.常用方法:Collection中定义了15个抽象方法

add(Obj obj)
addAll(Collection coll)
size()
isEmpty()
contains(Object obj)
cotainsAll(Collection coll)
retainAll(Collection coll)
hashCode()
remove(Object obj)
removeAll(Collecion coll)
clear()
Iterator()
toArray()

2.5.1.集合与数组之间的相互转换

2.5.1.1 集合---->数组:toArray()方法,返回类型是一个Object类型的数组Object[]

在这里插入图片描述
在这里插入图片描述

2.5.1.2 数组---->集合:调用Arrays的静态方法asList(Object …obj)

在这里插入图片描述

数组转集合,首先要有数组,数组有一个工具类Arrays
在这里插入图片描述
Arrays有一个方法asList(T…a),形参是一个可变形参,此处就可以放可变数组
在这里插入图片描述
假设有一个数组arr,形参就是arr数组

在这里插入图片描述
返回值就是一个集合

alt+回车自动生成返回类型
在这里插入图片描述
泛型暂时没见过,先删除
List是Collection的子接口,即就是collection
在这里插入图片描述
即就转换成了collection
在这里插入图片描述

打印list
在这里插入图片描述
在这里插入图片描述
这种写法也是可以的
在这里插入图片描述
在这里插入图片描述

2.5.1.3 注意
① 场景1

此处有一个小细节,此时的代码是自动装箱
在这里插入图片描述
在这里插入图片描述
此处有多少个元素?
在这里插入图片描述

② 场景2

问下面的size是多少?
在这里插入图片描述asList只能放对象,不能放基本数据类型,只能将整个数组看成是一个对象,即就是一个元素,而对于Integer他是自动装箱后的对象
在这里插入图片描述

在这里插入图片描述

打印一下list、list1的元素的情况
在这里插入图片描述
第二个[[I@1888ff2c]是int类型的一维数组在这里插入图片描述

2.5.1.向Collection中添加元素的要求:要求元素所属的类一定要重写equals方法

在这里插入图片描述
在这里插入图片描述
因为调contains或者remove方法时,他要去调obj所属类的equals方法,调equals比较的是内容,若不重写的话会去调用Object中的==不太合适
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/727119.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python和OpenCV图像分块之图像边长缩小比率是2

import cv2 import numpy as npimg cv2.imread("F:\\mytupian\\xihuduanqiao.jpg") # 低反光 cv2.imshow(image, img) # # 图像分块 # dst np.zeros(img.shape, img.dtype) ratio 2 #图像边长缩小比率是2,也就是一张图片被分割成四份 height, wi…

模型预测控制MPC详解(附带案例实现)

模型预测控制MPC详解(附带案例实现) 文章目录 模型预测控制MPC详解(附带案例实现)1. 最优控制问题2. 什么是MPC3. 二次规划Quadratic Programming4. MPC为什么可以转换成QP问题(推导过程)5. MPC总结5.1 MPC…

希喂、K9、弗列加特主食冻干测评:这次,我们去了美国的实验室

主食冻干你有喂过吗? 作为有七年养猫经验的铲屎官,我强烈推荐,真的值得一试! 在宠物经济蓬勃发展的今天,养猫已经成为了一门学问。人们开始追求更加科学、健康的养猫方式。大量喂养案例表明,传统的商业猫粮…

【ARMv8/v9 GIC 系列 2.1 -- GIC SPI 中断的 pending 和 clear pending 配置】

文章目录 GIC Pending 和 Clear PendingGICD_ISPENDR<n>GICD_ICPENDR<n>参数<n>编号解释使用举例设置中断ID 100为挂起状态清除中断ID 100的挂起状态 代码实现小结 GIC Pending 和 Clear Pending 在ARMv8体系结构中&#xff0c;GICD_ISPENDR<n> 和 GI…

C# WPF入门学习番外篇——C#使用WPF连接MySQL数据库

在 C# 中使用 WPF 连接 MySQL 数据库涉及几个步骤&#xff0c;包括安装必要的库&#xff0c;配置连接字符串&#xff0c;编写代码以执行数据库操作等。下面是一个详细的入门教程&#xff0c;帮助你理解如何在 WPF 应用程序中使用 MySQL 数据库。 1. 安装 MySQL 数据库连接器 …

两个方法,批量替换PPT中的字体

经常制作ppt的朋友可能会遇到需要批量替换字体的情况&#xff0c;如果我们想要更换ppt中的字体&#xff0c;今天分享PPT批量替换字体的两个方法。 方法一&#xff1a; 找到功能栏中的编辑选项卡&#xff0c;点击替换 – 替换字体&#xff0c;在里面选择我们想要替换的字体就可…

Humanize,一个很有人情味的 Python 库

目录 01初识 Humanize 为什么选择 Humanize&#xff1f; 安装 Humanize 02时间与日期的处理 时间差的展示 日期的展示 03数字的处理 数字的单位转换 数字的精确度控制 数字的千位分隔符 04文件大小的处理 文件…

JAVA语言开发的一套(智慧工地监管系统源码)让工地变得更加“聪明”

JAVA语言开发的一套&#xff08;智慧工地监管系统源码&#xff09;让工地变得更加“聪明” 数字智慧工地是指利用物联网、大数据、云计算、人工智能等先进技术&#xff0c;对工地进行全面数字化改造和智能化升级&#xff0c;实现工地管理的精细化、高效化和智能化。它通过实时…

ETO MARKETS:美债高额利息——美国财政的不可承受之重

摘要 2024年&#xff0c;美国联邦政府债务的利息支出预计将达到8920亿美元&#xff0c;这一数字比国防开支还要多&#xff0c;凸显了政府债务和利率上升的双重压力。国会预算办公室&#xff08;CBO&#xff09;预测&#xff0c;利息支出占GDP的比例将继续上升&#xff0c;这意…

Apple Phone Memory

Apple Phone Memory 苹果手机内存查询&#xff0c;哪些应用程序&#xff08;app&#xff09;占用内存&#xff1a; 设置 通用 iPhone储存空间 清理下QQ音乐&#xff1a;

远程桌面无法连接,远程桌面连接登录没有成功

在信息技术领域&#xff0c;远程桌面连接作为一种便捷的管理和操作工具&#xff0c;对于企业和个人用户而言都具有极其重要的价值。然而&#xff0c;在实际使用过程中&#xff0c;远程桌面无法连接的问题时常出现&#xff0c;这不仅影响了工作效率&#xff0c;还可能对数据安全…

Matlab数学建模实战应用:案例2 - 传染病传播

目录 前言 一、问题分析 二、模型建立 三、Matlab代码实现 四、模型验证 灵敏度分析 五、模型应用 实例总结 总结 前言 传染病传播模型是公共卫生和流行病学的重要研究内容&#xff0c;通过数学建模可以帮助我们理解传染病的传播规律和趋势&#xff0c;以便制定有效的…

多组学双疾病串扰怎么做?PAN-AD九个机器学习+MR+单细胞,工作量不少

说在前面 “串扰”这个名词听起来高级了一个level&#xff0c;其实就是MR-通路的双疾病联合分析。虽然是筛选标志物的思路&#xff0c;但是工作量不小&#xff0c;作者还收集了13个不同AD自身免疫疾病数据集用于验证自己的机器学习模型&#xff0c;分析就是一些常规的WGCNA、P…

VMware虚拟机三种网络模式设置 - NAT(网络地址转换模式)

一、前言 在前一篇《Bridged&#xff08;桥接模式&#xff09;》中&#xff0c;我详细介绍了虚拟机网络模式设置中的桥接模式。今天详细讲解一下NAT&#xff08;网络地址转换模式&#xff09;。 在虚拟机&#xff08;VM&#xff09;中&#xff0c;NAT&#xff08;Network Addre…

CSS--解决图片变形的方法

原文网址&#xff1a;CSS--解决图片变形的方法_IT利刃出鞘的博客-CSDN博客 简介 本文介绍html文件中图片变形的解决方法。 问题描述 我们经常需要指定所有图片的大小&#xff0c;让它们排列起来时看起来更整齐。但是&#xff0c;如果我们指定了width和height&#xff0c;那…

使用Harbor搭建局域网私有docker镜像库

说明&#xff1a;本文只介绍使用http的方式访问Harbor镜像库&#xff0c;https访问的方式请自行查询。 一、安装harbo 前提条件&#xff1a;已安装好docker。 1.1、安装docker-compose sudo apt install docker-compose1.2、下载Harbor 从Harbor的官方github&#xff0c;下载…

聊聊探索性测试

探索性测试定义及来源&#xff1a;​ 特意度娘了一下&#xff0c;探索性测试的定义&#xff1a; 探索性测试可以说是一种测试思维技术。它没有很多实际的测试方法、技术和工具&#xff0c;但是却是所有测试人员都应该掌握的一种测试思维方式。探索性强调测试人员的主观能动性…

使用opencv合并两个图像

本节的目的 linear blending&#xff08;线性混合&#xff09;使用**addWeighted()**来添加两个图像 原理 (其实我也没太懂&#xff0c;留个坑&#xff0c;感觉本科的时候线代没学好。不对&#xff0c;我本科就没学线代。) 源码分析 源码链接 #include "opencv2/imgc…

Python-gui开发之Pycharm+pyside6/Pyqt6环境搭建

Python-gui开发之Pycharm+pyside6/Pyqt6环境搭建 软件版本一、软件安装1、Python安装2、Pycharm安装3、pyside6或pyqt6安装①安装pyside6②安装PyQt6和pyqt6-tools二、Pycharm项目配置1、插件安装2、新建项目以及环境配置3、包管理安装三、在Pycharm中配置PySide61、pyside6 Qt…

MySQL功能测试-之应用工程

MySQL功能测试-之应用工程 前言pom.xmlapplication.yml 文件common.vo 包ResultVO config 包properties 包DruidConfigPropertyDruidMonitorProperty AutoFillMetaObjectHandlerDruidConfigFluxConfigurationMyBatisPlusConfig controller 包ClientControllerDruidControllerWe…