Java集合¶
List¶
- ArrayList
- ArrayList是List接口的主要实现类,底层使用Object数组实现。
- ArrayList中的数据是按顺序存储的,可以通过索引快速访问,时间复杂度为O(1)。
- ArrayList插入或删除元素的开销为O(n),因为要移动后面的元素,无论是否使用Iterator。
- ArrayList是线程不安全的,即多线程访问时需要使用同步锁。
- ArrayList的初始容量为10,每当容量不足时,容量会自动扩充为原来的1.5倍,扩容性能差。
- 适用场景:元素个数相对固定,需要快速随机访问元素,并且不需要频繁的插入和删除元素时。
- LinkedList
- LinkedList是List接口的主要实现类,底层使用双向链表实现。
- LinkedList随机访问元素开销是O(n)。
- LinkedList使用下标插入和删除元素的性能是O(n),使用Iterator插入和删除元素性能是O(1)。
- 适用场景:只顺序访问元素,并使用迭代器进行插入或删除。
Map¶
- HashTable
- 线程安全,所有方法都是synchronized,性能低下
- 访问元素的时间复杂度是O(1),不允许null值或null键
- HashMap
- HashMap访问元素的时间复杂度是O(1),允许null值和null键。
- HashMap对迭代顺序绝对没有保证。当添加新元素时,顺序会完全改变。
- 非线程安全
- TreeMap
- TreeMap使用红黑树(Red-black Truee)实现,访问,插入和删除元素开销都是O(log(n)),不允许null键,只允许null值。
- TreeMap将根据键的“自然顺序”基于它们的compareTo方法(或外部提供的Comparator)进行迭代。
- LinkedHashMap
- LinkedHashMap访问元素的时间复杂度是O(1),允许null值和null键。
- LinkedHashMap迭代顺序和插入顺序一致。
- ConcurrentHashMap
- ConcurrentHashMap是线程安全的,不允许null值和null键。
- ConcurrentHashMap实现原理:分段锁,分段加锁,分段CAS,并使用volatile来提高内部字段的可见性。默认使用16个分段,即其Concurrency Level是16。可以通过构造函数更改这个值。
- ConcurrentHashMap访问元素性能比HashMap低。
- ConcurrentSkipListMap
- ConcurrentSkipListMap是线程安全
- ConcurrentSkipListMap使用跳表(SkipList)实现,是sorted的,查询,插入和删除的时间复杂度都是O(log(n))。
- ConcurrentSkipListMap性能比ConcurrentHashMap低。
Set¶
和Map相仿。