- java集合主要由三个接口派生而成,分别是Map、Collection、Iterable。
类继承: 蓝色实线
类实现: 绿色虚线
接口继承: 绿色实线
接口实现:??? 不存在的,兄弟。
- List Set Map 都是接口,那么他们三者有什么区别?
List: 有序,可以允许重复
Set: 不允许重复
Map: 键值对存储,key不允许重复
- List实现类特性
Arraylist 与 LinkedList 区别? Vector?- 都是线程不安全的类。
- Arraylist 底层数据结构为数组的,而LinkedList为双向链表。
- 数组有索引,所有查询很快,而链表查询很慢。对于新增和删除,受插入的位置以及数据量大小的影响。
- Vector线程安全的类,每一个方法到加了synchronized锁。
- HashMap特性
HashMap,HashTable,ConcurrentHashMap,LinkedHashMap,TreeMap,SortedMap
HashMap: jdk1.8之前是采用数组+链表(链表散列)的方法,1.8之后就是数组+链表+红黑树的方式。默认大小为n=16,负载英子为0.75。当大小大于16*0.75的时候,开始扩容,扩容为2n。Hashmap是通过hash表来进行存储的。
HashMap进行put的时候经过哪些步骤:
- 判断table是否为空,如果为空则进行扩容resize。
- 根据键值key计算hash值且得到插入的数组索引。
- 判断当前索引所在的位置是否有值,没有值得话直接插入,然后再判断是否需要扩容。
- 如果当前索引有值,那么循环遍历key是否已经存在,如果存在则直接替换。
- 如果key不存在,那么直接插入到链表或者红黑树之中。
这个为简化版本,方便面试。
- HashTable,ConcurrentHashMap,LinkedHashMap,TreeMap
- HashTable与ConcurrentHashMap都是线程安全的,但是ConcurrentHashMap效率更加高一点,因为里面采用了分段锁(对具体的桶加锁,桶可以理解为table数组中某一位置,m),而HashTable是对整个方法加锁。效率低。
- LinkedHashMap与TreeMap都是可以排序的map,只不过TreeMap按键来进行升序来进行排序。LinkedHashMap按照插入的顺序来进行排序。
- HashTable与ConcurrentHashMap都是线程安全的,但是ConcurrentHashMap效率更加高一点,因为里面采用了分段锁(对具体的桶加锁,桶可以理解为table数组中某一位置,m),而HashTable是对整个方法加锁。效率低。
- HashSet内部实现都来自于HashMap。 没啥好讲的。
如何选用集合?
根据需要来选,如果需要kv形式的选择map,只需要存储单个值那么用list或者set,有序有list,无序用set。