2.2说说java中常见的集合类
重要的集合接口以及实现类参考下图
classDiagram
class Collection {<>} class List {<>} class Set{<>} class Map{
<>
entrySet0
keySet0
values0*
Collection <|--List Collection <|--Set List <..ArrayList List <..LinkedList List <..Vector Set <|..HashSet Map <..HashMap Map <..TreeMap Map <..Hashtable
Map <..ConcurrentHashMap HashMap <.LinkedHashMap Set <--Map
Collection <--Map
接口
。接口四个:Collection,List,Set,Map,它们的关系:
Collection是父接口,List和Set是它的子接口.Map接口与其它接口的关系
Map调用entrySet0,keySet0方法时,会创建Set的实现 Map调用values0方法时,会用到Collection的实现 List实现(常见三个)
.ArrayList基于数组实现
。随机访问(即根据索引访问)性能高
,增,删由于要移动数组元素,性能会受影响
[进阶]但如果增,删操作的是数组尾部不牵涉移动元素.LinkedList基于链表实现
随机访问性能低,因为需要顺着链表一个个才能访问到某索引位置增,删性能高
[进阶]说它随机访问性能低是相对的,如果是头尾节点,无论增删改查都快
.[进阶]说它增删性能高也是有前提的,并没有包含定位到该节点的时间,把这个算上,增删性能并不高.Vector基于数组实现
相对于前两种List实现是线程安全的
[进阶]一些说法说 Vector 已经被舍弃,这是不正确的 Set 实现
.HashSet 内部组合了HashMap,利用Map key唯一的特点来实现Set
。集合中元素唯一,注意需要为元素实现hashCode 和equals方法
[进阶]Set的特性只有元素唯一,有些人说Set无序,这得看实现,例如HashSet无序,但TreeSet有序
Map实现(常见五个)
.HashMap底层是Hash表,即数组+链表,链表过长时会优化为红黑树
。集合中Key要唯一,并且它需要实现hashCode和equals方法
.LinkedHashMap基于HashMap,只是在它基础上增加了一个链表来记录元素的插入顺序
[进阶]这个链表,默认会记录元素插入顺序,这样可以以插入顺序遍历元素
[进阶]这个链表,还可以按元素最近访问来调整顺序,这样可以用来做LRUCache的数据结构.TreeMap底层是红黑树
.Hashtable底层是 Hash表,相对前面三个实现来说,线程安全
[进阶]它的线程安全实现方式是在put,get等方法上都加了synchronized,锁住整个对象.ConcurrentHashMap底层也是Hash表,也是线程安全的
.[进阶]它的put方法执行时仅锁住一个链表,并发度比Hashtable高[进阶]它的get方法执行不加锁,是通过volatile保证数据的可见性