体系结构
一、单列集合(collection是单列接口,全部单列集合都可以继承使用):一次添加一个
List:有序(存取顺序一致),可重复,有索引
Set:无序,不重复, 无索引
collection的遍历方法:
1、迭代器遍历(Interator,集合专用)
迭代器不依赖索引
细节:1、如果指针指向没有元素的地方,仍然强行调用next()方法,那么会报错NoSuchElementException
2、增强for遍历
3、Lambda表达式遍历
Consumer是一个函数类接口
Lambda表达式:()->{}
()匹配方法的形参,{}匹配方法体
String可以省略,省略后为
List集合的特有方法
list集合有索引,所以多了很多索引操作的方法
list集合的遍历方式
1、迭代器遍历
2、列表迭代器遍历
hasPrevious()
previous():指针从后往前遍历
3、增强for遍历
4、Lambda表达式遍历
5、普通for循环
LinkedList集合
首尾操作的特有API
泛型深入
泛型只支持引用数据类型,不能写基本数据类型
<数据类型>,统一数据类型
泛型类
E...e是可变参数,大小不确定
泛型接口
泛型的继承和通配符
泛型不具备继承性(泛型里面写的什么数据类型就只能传递什么类型的数据,继承的类都不行),但是数据具备继承性
表示method里面传递的集合的类型是任意的,但是必须是继承自Ye的
数据结构(树)
度:每一个节点的子节点数量
二叉树:任意节点的度小于等于2
平衡二叉树:任意节点的左右子树高度差不超过1
旋转机制:左旋,右旋
从添加的节点开始,不断地向父节点找不平衡的节点
复杂情况
需要旋转的四种情况:
这种情况 需要局部左旋,变成左左情况,再整体右旋
这种情况 需要局部右旋,变成右右情况,再整体左旋
数据结构(红黑树)
Nil相当于叶子节点
简单路径:只能往前,不能回头
添加的节点默认是红色的
增删改查的性能很好
Set集合
HashSet
JDK8以前:底层是链表+数组
JDK8以后:底层是链表+数组+红黑树
当加入的数据是16*0.75=12时,会对数组进行扩容,数组变成32位
LinkedHashSet
有序,不重复,无索引
第一个元素(头结点)会记录第二个元素的地址值,第二个元素也会记录第一个元素的地址值,形成双向链表,以此类推,
若第三个元素的存储位置和第二个元素一样,那么第三个元素会跟在第二个元素后面,并且两者会相互记住对方的地址值
遍历时是遍历双向链表,与HashSet从数组的0索引开始遍历不同
TreeSet
不重复,无索引,可排序
底层结构是红黑树
TreeSet的比较方式:
在实现类中继承Comparable接口,并实现接口中的抽象方法
使用TreeSet时不需要额外重写HashCode和equals方法,因为HashCode和equals方法和哈希表有关
TreeSet的底层是红黑树,需要重写compareTo方法
和方式一不一样,方式二是在实现对象定义的时候实现Comparator接口
ps:最后一点重要
二、双列集合:一次添加两个
红色是接口,蓝色是实现类
键值对,一一对应
特点:
Map是顶层接口,只能创建其实现类的对象
Map接口里的方法:
Map.getOrDefault(Object key, V defaultValue)方法的作用是:
当Map集合中有这个key时,就使用这个key值;
如果没有就使用默认值defaultValue
Map遍历方式:1、键找值;2、键值对;3、Lamda表达式
1、键找值
2、键值对
entry是Map接口里面的子接口,所以需要Map.entry
3、Lambda表达式
HashMap
底层原理:创建数组,确定哈希值,插入新元素时,如果要插入的位置已经有键值对了,那么比较两个键值对的键,如果键一样,那么新的键值对会覆盖掉原来的键值对
LinkedHashMap
TreeMap
按照id的降序排序:
键存储自定义对象:实现comparable接口,重写CompareTo方法
三、可变参数
四、Collections
五、创建不可变的集合
不想让别人改变集合的内容
若要创建超过十个键值对的map的不可变集合,则使用下面方法:
1、ofEntries方法:
2、copyof方法: