集合

发布时间 2023-08-21 11:14:08作者: lwx_R


1.List

1.1 ArrayList

内部数组实现,可以快速随机访问。数组大小不满足时,已有数组复制到新的空间中。适合查找遍历。
线性安全 Collections.synchronizedList

List synchronizedList = Collections.synchronizedList(new ArrayList<>());

1.2 Vector

数组实现,支持线程同步,因此访问慢

1.3 LinkedList

链表结构,适合插入删除,有操作表头,表尾的方法,当做栈,队列,双向队列使用

2.Set

对象相等性是对象hashCode值(根据内存地址计算),俩个对象相同,必须覆盖hashCode和equals方法

2.1 HashSet

HashSet 首先判断两个元素的哈希值,如果哈希值一样,接着会比较
equals 方法 如果 equls 结果为true ,HashSet 就视为同一个元素。如果equals 为false 就不是同一个元素。

2.2 TreeSet

  • 按照二叉树原理对add新对象排序
  • 自定义对象必须实现Comparable接口且覆盖compareTo函数

2.3 LinkedHashSet

使用LinkedHashMap保存元素,继承HashSet,方法上与其相同

3.Map

3.1 HashMap

  • 根据键的hashCode 值存储数据
  • 非线程安全,使用Collections 的synchronizedMap或ConcurrentHashMap

3.1.1 Java 7实现

整体是数组,数组中每个元素是单向链表,扩容后为当前2倍
根据hash值定位到数组下标,但是需要顺着链表一个个比较下去才能找到我们需要的,时间复杂度取决于链表的长度,为 O(n)

3.1.2 Java 8实现

链表元素超过8个,将链表转化为红黑树。O(logN)

3.2 ConcurrentHashMap

整个 ConcurrentHashMap 由一个个 Segment 组成,Segment 代表”部分“或”一段“的意思,所以很多地方都会将其描述为分段锁。

3.2.1 线程安全

Segment 通过继承ReentrantLock 来进行加锁,所以每次需要加锁的操作锁住的是一个 segment,这样只要保证每个Segment 是线程安全的,也就实现了全局的线程安全。

3.2.2 Java7

  • 并行度concurrencyLevel:默认16,有16个segments段,最多支持同时16个线程并行写,该参不可扩容

3.2.3 Java8

引入红黑树

3.3 HashTable

遗留类

3.4 TreeMap