拿捏Java:进阶集合

25 阅读4分钟

体系结构

一、单列集合(collection是单列接口,全部单列集合都可以继承使用):一次添加一个

image.png

List:有序(存取顺序一致),可重复,有索引

Set:无序,不重复, 无索引

image.png

image.png

image.png

image.png

image.png image.png

collection的遍历方法:

1、迭代器遍历(Interator,集合专用)

迭代器不依赖索引

image.png

image.png

细节:1、如果指针指向没有元素的地方,仍然强行调用next()方法,那么会报错NoSuchElementException

image.png

2、增强for遍历

image.png image.png image.png

3、Lambda表达式遍历

image.png

Consumer是一个函数类接口
Lambda表达式:()->{}
()匹配方法的形参,{}匹配方法体

image.png image.png

String可以省略,省略后为 image.png

List集合的特有方法

list集合有索引,所以多了很多索引操作的方法
image.png image.png

list集合的遍历方式

1、迭代器遍历

2、列表迭代器遍历 image.png

hasPrevious()
previous():指针从后往前遍历 

image.png

3、增强for遍历

4、Lambda表达式遍历

5、普通for循环

LinkedList集合

image.png

首尾操作的特有API image.png

泛型深入

泛型只支持引用数据类型,不能写基本数据类型
<数据类型>,统一数据类型

泛型类

image.png image.png image.png

image.png

E...e是可变参数,大小不确定

泛型接口

image.png

泛型的继承和通配符

 泛型不具备继承性(泛型里面写的什么数据类型就只能传递什么类型的数据,继承的类都不行),但是数据具备继承性

image.png

image.png

表示method里面传递的集合的类型是任意的,但是必须是继承自Ye的

image.png

数据结构(树)

image.png

度:每一个节点的子节点数量
二叉树:任意节点的度小于等于2    

image.png

平衡二叉树:任意节点的左右子树高度差不超过1
旋转机制:左旋,右旋

image.png

从添加的节点开始,不断地向父节点找不平衡的节点    

image.png

image.png

复杂情况

image.png

image.png

image.png

需要旋转的四种情况:

image.png

image.png

 这种情况 需要局部左旋,变成左左情况,再整体右旋
 

image.png

image.png

这种情况 需要局部右旋,变成右右情况,再整体左旋 

数据结构(红黑树)

image.png

image.png

image.png

image.png

Nil相当于叶子节点
简单路径:只能往前,不能回头

image.png

添加的节点默认是红色的
增删改查的性能很好

image.png

Set集合

image.png

image.png

image.png

HashSet

image.png

image.png

image.png

JDK8以前:底层是链表+数组
JDK8以后:底层是链表+数组+红黑树
当加入的数据是16*0.75=12时,会对数组进行扩容,数组变成32

image.png

LinkedHashSet

有序,不重复,无索引

image.png

第一个元素(头结点)会记录第二个元素的地址值,第二个元素也会记录第一个元素的地址值,形成双向链表,以此类推,
若第三个元素的存储位置和第二个元素一样,那么第三个元素会跟在第二个元素后面,并且两者会相互记住对方的地址值
遍历时是遍历双向链表,与HashSet从数组的0索引开始遍历不同

image.png

image.png

TreeSet

不重复,无索引,可排序
底层结构是红黑树

image.png

TreeSet的比较方式:

image.png

在实现类中继承Comparable接口,并实现接口中的抽象方法

image.png

image.png

使用TreeSet时不需要额外重写HashCode和equals方法,因为HashCode和equals方法和哈希表有关
TreeSet的底层是红黑树,需要重写compareTo方法

image.png

image.png

和方式一不一样,方式二是在实现对象定义的时候实现Comparator接口

image.png

image.png

ps:最后一点重要
 

image.png

二、双列集合:一次添加两个

image.png

红色是接口,蓝色是实现类
键值对,一一对应

特点:
image.png

Map是顶层接口,只能创建其实现类的对象

Map接口里的方法:

Map.getOrDefault(Object key, V defaultValue)方法的作用是:
当Map集合中有这个key时,就使用这个key值;
如果没有就使用默认值defaultValue

image.png

image.png

Map遍历方式:1、键找值;2、键值对;3、Lamda表达式

1、键找值

image.png

2、键值对

image.png

entry是Map接口里面的子接口,所以需要Map.entry

3、Lambda表达式

image.png

image.png

image.png

HashMap

image.png

底层原理:创建数组,确定哈希值,插入新元素时,如果要插入的位置已经有键值对了,那么比较两个键值对的键,如果键一样,那么新的键值对会覆盖掉原来的键值对

image.png

image.png

image.png

image.png

image.png

image.png

LinkedHashMap

image.png

TreeMap

image.png

按照id的降序排序:

image.png

键存储自定义对象:实现comparable接口,重写CompareTo方法

image.png

image.png

image.png

三、可变参数

image.png image.png image.png

四、Collections

image.png

image.png

五、创建不可变的集合

不想让别人改变集合的内容

image.png

image.png

image.png

若要创建超过十个键值对的map的不可变集合,则使用下面方法:

1、ofEntries方法:

image.png

2、copyof方法:

image.png