集合进阶
单列集合
Collection
List set



Add clear remove contains isempty size

Add方法可能也会添加失败

同理,可能删除失败

Contains细节

为什么要重写equals?
因为contains底层用的是object类中的equals方法,比较的是地址值,这样即使元素相同,也会返回false,所以要重写equals方法
![]()
Collection遍历方式

迭代器遍历 iterator

获取迭代器,是调用.iterator方法,不是new,获取一个迭代器对象

迭代器遍历时,不依赖索引,利用指针和移动的方式获取集合中的元素
遍历完毕后,指针不会复位,会一直指向最后没有元素的位置
如果再想遍历,只能再次获取一个新的迭代器

第三点的意思主要是每次使用next都会移动指针,循环中多次使用next可能会指向没有元素的位置。

要删除,得用迭代器的remove方法删除;添加暂时没有办法
增强for遍历
JDK5之后出现,原理就是迭代器,简化迭代器代码

s表示第三方变量,依次表示每一个数据
细节:修改s,不会改变集合中的数据

Lambda表达式遍历
JDK8开始有
.forEach


只有迭代器可以删除掉collection的元素

List集合

删除remove 注意的细节

这里的1表示的是索引,而不是元素1
会优先调用实参和形参类型一致的方法

如果一定要删掉元素1
需要手动装箱,把1变成integer类型

List遍历
列表迭代器 也是一个接口,是iterator的子接口
在遍历的过程中,可以增删元素

迭代器可以删(用的是迭代器的remove方法,而不是集合的remove方法)
列表迭代器同时可以增删(用的也是迭代器的方法)

数据结构

栈
后进先出,先进后出
队列
先进先出,后进后出
数组 (在内存中是一片连续的空间)
查询快,增删慢

链表
增删快,查询慢


只需要改变地址
双向列表

Arraylist
扩容机制

添加第一个元素的源码

添加第11个元素(或一次性加很多个元素)的源码

Linkedlist集合
双向列表

Linkedlist 添加元素过程的底层源码

Iterator源码
调用.iterator()方法,就是创建一个内部类的对象

泛型
JDK5开始的
只支持引用数据类型

没有泛型的时候,集合怎么存数据的?
直接add皆可,都会被看成是object类型
但是就不能使用集合里元素类型的子类特有方法

泛型好处
泛型其实是伪泛型
Java文件里有写泛型,但是到编译时,即编译成class文件时,集合里面的数还是会被当成object类型处理,只不过,底层还是会将object类型根据泛型强转成对应的类型。
这就是泛型的擦除。

原因:泛型是JDK5才出现的,为了向下兼容,才这样做。

为什么不能写基本数据类型?
因为基本数据类型没得转成object类型,只有写他的包装类,才能转成object类型编译
泛型的使用场景

泛型类
类型不确定时,在定义一个类时就可使用


泛型方法

Public static都是修饰符



E...e是可变参数,用来表示一个或者多个变量,此时e就是一个数组,可以遍历获取里面每一个元素
泛型接口

第一种

第二种

泛型的继承


<>里写什么类型,只能添加什么类型的对象,即使是子类也是不行,泛型没得继承
但是数据是具备继承性的

泛型的通配符
?表示

可以接受Ye Fu,不能接受Zi

总结

