Java集合(List篇)

List

a.使用List

i.最基础的一种集合,是一种有序列表,内部按照放入元素的先后顺序存放,每个元素都可以通过索引确定自己的位置。

ii.数组的删除和新增

iii.ArrayList集合的新增和删除。

iv.LinkedList(链表式集合)

1.内部的每个元素都指向下一个元素。

2.比较一下ArrayList和LinkedList,优先使用ArrayList。

b.特点

i.允许重复添加。

ii.允许添加null。

c.创建List

i.除了使用ArrayList和LinkedList,还可通过List接口提供of()方法,不可以添加null值,会报空指针异常。

d.遍历List

i.使用for循环,get(索引)方法只有ArrayList的实现是高效的,换成LinkedList后,索引越大,访问速度越慢。

ii.始终坚持使用Iterator(迭代器)来访问List。Iterator本身也是一个对象,但它是由List的实例调用iterator()方法的时候创建的。Iterator对象知道如何遍历List,并且不同的List类型,返回的Iterator对象也是不同的,但总是拥有最高的访问效率。

iii.Iterator对象有两个方法:hashNext()判断是否有下一个元素,next()返回下一个元素。由于Iterator遍历很常用,所以Java的for each循环本身就可以帮我们使用Iterator遍历。直接使用Iterator遍历编译器会提示使用foreach。

iv.只要实现了Iterable接口的集合类都可以直接使用for each循环来遍历,Java编译器本身不知道如何遍历集合对象,但它会自动把for each循环变成Iterator的调用,原因在于Iterable接口中定义了一个Iterator<E> iterator()方法,强迫集合类必须返回一个 Iterator对象。

e.List和Array转换

i.List转换成Array,三种方式。

1.调用toArray()方法直接返回一个Object\[\]数组,会丢失类型信息,应用很少。

2.给toArray(T\[\])传入一个类型相同的Array,List内部自动把元素复制到传入的Array中。

3.简洁写法,函数式,是通过List接口定义的T\[\] toArray(IntFunction<T\[\]> generator)方法。

ii.Array转换成List,由于返回的不确定是哪个具体的集合类,是一个List接口,所以List是只读的。

1.List.of(E... elements)

2.Arrays.asList(T... a)

编写equals方法

a.contains(Object o)和indexOf(Object o)方法

i.两个不同的实例,比较的是引用类型的值。

ii.List内部并不是通过==判断两个元素是否相等,而是使用equals()判断。因此要正确使用List的contains(),indexOf()这些方法,放入的实例必须正确覆写equals()方法,否则放进去的实例查找不到。可以正常放入String,Integer这些对象,是因为Java标准库已经正确实现了equals()方法。

iii.自己编写Person实例,没有重写equals方法,直接使用这两个方法。

2.编写equals方法

i.条件

1.自反性(Reflexive):对于非null的x来说,x.equals(x)必须返回true;

2.对称性(Symmetric):对于非null的x和y来说,如果x.equals(y)为true,则y.equals(x)也必须为true;

3.传递性(Transitive):对于非null的x,y,z来说,如果x.equals(y)为true,y.equals(z)也为true,那x.equals(z)也必须为true;

4.一致性(Consistent):对于非null的x,y来说,只要x,y状态都不变,则x.equals(y)总是一致的返回true和false;

5.对null的比较:x.equals(null)永远返回false。

ii.样例

iii.总结

1.先确定实例"相等"的逻辑,即哪些字段相等,就认为实例相等。

2.用instanceof判断传入的待比较Object是不是当前类型,如果是,比较字段,否则,返回false。

3.引用类型用Objects.equals()比较,基本类型直接用==比较。

4.两个引用类型都是nul时它们也是相等的。

相关推荐
Scott9999HH4 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
腻害兔4 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社5 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海5 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖6 小时前
JDK 26 新特性详解
java·开发语言
马优晨6 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区8 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大9 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai9 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
维天说9 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json