集合进阶
单列集合
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
总结