在java面试过程中,Map时常会被作为一个面试点来问,今天就在这里整理总结一下
- 首先回顾一下集合体系
- 集合面试过程中,对于单列集合经常会被问到List和set的区别
- list集合元素有序并且集合元素可以重复
- set集合元素无序并且集合元素不允许重复
- 集合面试过程中,对于单列集合经常会被问道Arraylist和Linkedlist的区别
- Arraylist底层数据结构为数组,所以有索引,查询速度比较快但是增删速度比较慢
- LinkedList底层数据是双向链表,所以没有索引,查询速度比较慢,但是增删比较快
- 集合面试过程中,对于单列集合经常会被问到List和set的区别
- HashMap
- 数据结构
- JDK1.7:数组+链表
- JDK1.8之后:数组+链表+二叉树
- Hashmap数据结构(这里以1.7为例)是由数组(table)+链表(entry)组成,每个entry对应着一个table的索引页对应着一个唯一的hash地址值
- 初始化
- 我们看到Hashmap在使用空参构造的时候会默认加载一个长度为16,加载因子为0.75的集合
- 数据结构
- HashMap的put方法(保证key的唯一性)
- Hashmap在put的数据的时候,在底层代码中会先通过判断put的值的key是否为null,如果为null,会固定存放到table[0]下面,如果不为null,会通过hash()方法计算出key对应的hash地址,通过hash地址去寻找数据应存放的table的指定索引下,找到之后会判断put的key在链表中是否存在(地址值和具体值都要判断)如果存在则为替换,如果不存在则为新增;
- JDK1.8的Hashmap和1.7的区别
- JDK1.8之后在集合put元素的时候新增了一个长度检测,如果同意hash地址下的链表长度大于了等于了7,那么就会将链表转化为红黑树(为了提高查询效率)
- HashMap和Hashtable的区别
- Hashmap可以存储Key为null的值,线程不安全,但是效率高
- Hashtable不可以存储Key为null的值,线程安全,但是效率低
- 在源代码里面我们可以清楚的看到,Hashtable的put方法中有这synchronize修饰,明显是线程安全的,而在Hashmap中并没有任何相关关键字修饰,而且没有加锁,所以线程是不安全的;
- ConcurrentHashMap
- ConcurrentHashmap区别于hash的分段锁
- 在ConcurrentHashMap中他并没有在方法中佳田synchronize关键字修饰,而是使用Segment同步方法,而且Segment又继承了ReentrantLock,所以实现了分布式锁,保证线程安全的同时还提交了效率;
相关文章
暂无评论...