Java常用集合

151 阅读4分钟

collection接口

图片.png collection接口继承了Iterable接口因此可以使用迭代器遍历

1. List接口(列表)

特点:

  • 元素有序、可重复
  • 每个元素都有对应的顺序索引,支持索引取出

实现类:

1.ArrayList

  • 底层:数组
  • 线程不安全

底层:
底层维护了一个transient Object[] elementData数组

扩容机制:
1、无参构造器创建对象,初始elementData容量为10,扩容1.5倍
2、指定大小构造器创建大小,初始容量为指定大小,扩容1.5倍

2.LinkedList

  • 底层:双向链表
  • 可添加任意元素,可重复,可添加null
  • 线程不安全的

底层:
双向链表 Node节点(pre,element,next)

3.Vector

  • 底层:数组(Object[])
  • 线程安全的(Vector的操作方法带有synchronized)

底层:
底层维护了一个Protected Object[] elementData数组

扩容机制:
无参构造器创建对象,初始elementData容量为10,扩容2倍
指定大小构造器创建大小,初始容量为指定大小,扩容2倍

2.Set接口(集合)

1.HashSet

  • 无序,没有索引
  • 不可以重复,只能有一个null

HashSet

  • 底层:哈希表(数组 + 链表),HashSet底层通过HashMap实现
  • 无序,不重复
  • 允许null元素(1.8以后)

LinkedHashSet

  • 底层:哈希表(数组 + 链表) + 双向链表
  • 有序、不重复

底层:
hash表 + 双向链表
hash表存储的是LinkendHashMapEntry类型的节点该节点继承了HashMapNode,增加了before和after来完成有序的其他和HashMap一样

添加元素时,求hash值,再求索引,然后在哈希表中查找到对应的双向链表 有则不添加,没有则添加到该双向链表的尾部

2.TreeSet

  • 底层:红黑树
  • 有序、不重复

底层:

  1. TreeSet 内部维护了一个红黑树,根据元素的值进行排序。
  2. 当添加元素到 TreeSet 中时,根据元素的值的大小将其插入到红黑树中适当的位置。
  3. 插入操作通过比较元素的值来确定元素的插入位置,并保持红黑树的平衡性。
  4. 在红黑树中,每个节点存储了一个元素,并引用了两个子节点、父节点,以及额外的颜色信息(红色或黑色)。
  5. 通过红黑树的结构和节点之间的链接关系,TreeSet 可以高效地进行元素的查找、插入、删除和遍历操作。
  6. TreeSet 中的元素是有序的,根据元素的自然顺序或使用 Comparator 接口来定义的比较器来进行排序。

Map接口(K-V)

  • Key-Value(键值对)
  • key的唯一性,Value可重复
  • 无序

图片.png

实现类

1.HashMap

  • 底层:数组 + 单向链表 + 红黑树
  • 线程不安全

底层:

  1. 添加元素、进行hash运算得到索引值
  2. 查看哈希表中有没有该元素
  3. 没有直接加入(创建节点Node(key,value,next,hash,.....))
  4. 存在元素使用equasl方法(可以自定义重写)比较链表每个元素,相同放弃,不同则添加到链表后

扩容机制:
第一次16,当元素达到16*0.75(负载因子loadFactor = 0.75)个时进行扩容,扩容为原来的2倍,并将元素重新分配到新数组
当表的链表超过八个 先判断表容量<64,表扩容
表容量>=64,将链表转换为红黑树(JDK8)

2.LinkedHashMap

  • 底层是:哈希表(数组 + 链表) + 双向链表
  • 线程不安全
  • HashMap的有序版

3.Hashtable

  • 底层是:数组(Entry table[]) + 链表
  • 键值不能为null
  • 线程安全的(synchronized)

底层:
根据Key得到hash值,计算得到再table[]的索引
封装成Entry放入table[]表中

扩容机制:
初始大小为11,加载因子(0.75)
扩容11*2+1

4.TreeMap

  • 底层:红黑树
  • 键值不能为null
  • 线程不安全的

底层:

  1. 初始时,创建一个空的红黑树。
  2. 当向 TreeMap 中添加键值对时,首先根据键进行比较找到插入位置。
  3. 如果红黑树为空,则直接将该键值对作为根节点插入红黑树。
  4. 如果红黑树不为空,则按照以下规则进行插入:

如果键小于当前节点的键,则继续在左子树中插入。 如果键大于当前节点的键,则继续在右子树中插入。 如果键等于当前节点的键,则更新当前节点的值。

插入完成后,根据红黑树的性质进行平衡操作,以确保树的平衡性和性能。