1. Java 容器分为 Collection 和 Map 两大类,其下又有很多子类,如下所示:
2.List、Set、Map 之间的区别?
List、Set、Map 的区别主要体现在两个方面:元素是否有序、是否允许元素重复。
- List:有序,元素可重复。
- Set: 无序,元素不能重复。
- Map:key , value 形式存储数据,key 不能重复, value 可以重复。
2.1 list集合下有:ArrayList, LinkedList, Vector, Stack
- ArrayList:数组结构,特点:查询快,增删慢,线程不同步。
- LinkedList:双向链表结构,特点:查询慢,增删快。
- Vector:什么都慢,线程同步。
- Stack:栈,数组结构,它继承了Vector,特点:先进后出。
2.2 Set集合下有:HashSet, LinkedHashSet , TreeSet
- HashSet:哈希表结构,特点:无序集合,元素不能重复,最多只有一个为 null 的元素。
- LinkedHashSet:哈希表+链表结构,特点:有序集合,元素不能重复。
- TreeSet:二叉树结构,是Set集合的一种变体,根据某种(规则)对里面的元素进行排序。
2.3 Map集合下有:HashMap, LinkedHashMap , TreeMap, Hashtable, ConcurrentHashMap
- HashMap: 1. jdk1.8之前数据结构是: 数组 + 链表,jdk1.8之后数据结构是:数组 + 链表 + 红黑树。
2. 无序性 : 存入和取出元素顺序不一致。
3. 唯一性 : key 是唯一的。
4. 最多允许一个 key 为NULL,多个 value 为NULL。
5.查询快,线程不同步。
- Hashtable: 和HashMap 类似,但不允许key 和 value 为null, 线程同步。
- TreeMap:红黑树数据结构, 有序集合,key 自带排序能力,默认升序。
- LinkedHashMap:哈希表 + 单向链表结构 ,有序集合。
- ConcurrentHashMap:数组 + 链表 + 红黑树数据结构,线程安全。
3.HashMap 和 Hashtable 有什么区别?
- 存储:HashMap key 和 value 为 null,而 Hashtable 不允许。
- 线程安全:Hashtable 是线程安全的,而 HashMap 是非线程安全的。
- 推荐使用:在 Hashtable 的类注释可以看到,Hashtable 是保留类不建议使用,推荐在单线程环境下使用 HashMap 替代,如果需要多线程使用则用 ConcurrentHashMap 替代。
4.如何决定使用 HashMap 还是 TreeMap?
- 对于在 Map 中插入、删除、定位一个元素这类操作,HashMap 是最好的选择,因为相对而言 HashMap 的插入会更快,但如果你要对一个 key 集合进行有序的遍历,那 TreeMap 是更好的选择。
5.ArrayList 和 LinkedList 的区别是什么?
- 数据结构实现:ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现。
- 随机访问效率:ArrayList 比 LinkedList 在随机访问的时候效率要高,因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找。
- 增加和删除效率:在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,因为 ArrayList 增删操作要影响数组内的其他数据的下标。
综合来说,需要频繁读取集合中的元素时,推荐使用 ArrayList,而在插入和删除操作较多时,推荐使用 LinkedList。
6.HashMap 的扩容机制?
- 在不断的添加数据的过程中,会涉及到扩容问题,当超出临界值(且要存放的位置非空)时,扩容。默认的扩容方式:扩容为原来容量的2倍,并将原有的数据复制过来。
- HashMap的初始化容量为16, 加载因子为0.75,临界值为12(16*0.75),当HashMap在执行put()方法时,最后会判断节点数是否大于临界值,如果大于则扩容,容量是之前的两倍。