目录
4.ConcurrentHashMap和Hashtable的区别
1.List、Set、Map三者区别
- List:存储一组不唯一、有序的对象,可有多个元素引用相同对象。
- Set:不允许重复元素,不会有多个元素引用相同对象。
- Map:使用键值对存储对象。两个Key可引用相同对象,但Key不能重复
2.ArrayList和LinkedList区别
首先两个都是不同步的,都不保证线程安全。
ArrayList | LinkedList | |
底层数据结构 | 底层使用Object数组 | 底层使用双向链表 |
插入和删除是否受元素位置影响 | 采用数组存储,因此在指定位置插入和删除受元素位置影响, | 采用链表存储,普通插入和删除不受位置影响,但指定位置删除受元素位置影响,时间复杂度近似O(n) |
是否支持快速访问 | 支持 | 不支持 |
内存占用空间 | list列表结尾会预留一定容量空间 | 每一元素都要消耗比ArrayList更多的空间。 |
Vector类的所有方法都是同步的,是线程安全的,但效率不如ArrayList。因此不需要线程安全采用ArrayList。
3.HashMap和Hashtable区别
HashMap | Hashtable | |
线程安全 | 非线程安全 | 线程安全(内部方法经过synchronized修饰) |
效率 | 比Hashtable略高 | |
对Null key和Null value支持 | Null可作为键,但只能有一个;多个值可为Null | 不允许Null键值存在 |
容量 | 默认16,每次扩容为原来两倍 若给定初始容量,会扩充为2的幂次方大小 | 默认11,每次扩充为原来2n+1 |
底层数据结构 | JDK1.8之后,当链表长度大于阈值(默认8),链表转化为红黑树 | 无此机制 |
HashSet底层是基于HashMap实现的。除了 clone()、writeObject()、readObject()是HashSet 子集不得不实现的方法,其他都是调用HashMap中的方法。
为什么建议在定义HashMap时,指定初始化大小?
若没有设置初始化容量,系统默认容量16,当超过临界值(默认16*0.75=12)时,HashMap会重新扩容到下一个2的指数幂(16→32)。而HashMap扩容就要执行resize操作,频繁resize,会降低性能。HashMap是线程不安全的,不安全主要就体现在resize操作上,多线程情况下,可能会形成环形链表,导致下一次读取时出现死循环。
(resize方法是定义长度为新长度的数组,对原数组数据进行再Hash,这个过程是一个性能损耗点)
4.ConcurrentHashMap和Hashtable的区别
ConcurrentHashMap | Hashtable | |
底层数据结构 | JDK 1.7:数组+链表 JDK 1.8 :数组+链表/红黑二叉树 | 数组+链表 |
实现线程安全方式 | JDK 1.7:对整个桶数组进行分隔分段(Segment),每一把锁只锁容器中一部分数据,提高并发访问率。 JDK 1.8:摒弃Segment,直接使用Node数组+链表+红黑树,并发控制使用synchronized和CAS操作。看起来像优化过且线程安全的HashMap。 | 使用synchronized保证线程安全,效率非常低下。多线程操作竞争越激烈效率越低。 |
5.集合框架底层数据结构
Collection:
1.List
ArrayList | Object数组 |
Vector | Object数组 |
LinkedList | 双向链表 |
2.Set
HashSet | 基于HashMap实现,底层使用HashMap保存元素 |
LinkedHashSet | 继承于HashSet,内部通过LinkedHashMap实现 |
TreeSet | 红黑树 |
Map:
HashMap | JDK 1.8前是数组+链表。数组是主体,链表是为解决哈希冲突存在。 JDK 1.8之后当链表长度大于阈值(默认为8)时,链表转化为红黑树,减少搜索时间 |
LinkedHashMap | 继承自HashMap,由数组和链表/红黑树组成。 同时增加了一条双向链表,可以保持键值对的插入顺序 |
Hashtable | 数组+链表 |
TreeMap | 红黑树(自平衡的排序二叉树) |
如何选用集合?
需要根据键值对获取元素选择Map接口下的集合,需要排序选择TreeMap,不需要排序则HashMap,需要线程安全选择ConcurrentHashMap;
只需要存放元素选择Collection接口下集合,保证元素唯一选择Set接口的集合,如TreeSet或HashSet。不需要则选择List接口下的ArrayList或LinkedList,具体在根据需求选择集合使用。
以上大部分内容来自:JavaGuide 面试突击版,仅个人学习,完整版可关注作者公众号领取