HashMap

 

 

HashMap的基本特性?谈谈你对HashMap的理解?

HashMap是Java常用的集合之一,存的是键值对,它继承了AbstractMap,实现了Map、Cloneable(可被克隆)、Serializable接口(可被序列化)。

它是散列表结构的一种实现,其增删改查操作都是O(1)级别。

默认容量为16,

扩容因子是

 

HashMap的底层结构?

Java7中,HashMap的底层数据结构是由数组+链表实现的。而在Java8中,HashMap的底层数据结构则是由数组+链表+红黑树实现的,当一个桶存储的链表长度大于等于8时,会将链表转换为红黑树。

之所以要加入红黑树,是因为在某些极端情况下,几乎所有元素可能都存放在同一个桶(数组索引是链表的表头)的链表中,此时HashMap就相当于一个单链表,相关操作的时间复杂度退化成O(n)。

 

HashMap的扩容?

为什么容量总是2的幂次方?

 

 

HashMap和LinkedHashMap的区别?

有序性

 

 

HashMap和HashTable的区别?

(1)Hashtable不支持null作为key和value,HashMap支持

(2)Hashtable是线程安全的,它里面几乎所有方法都是用Synchronized修饰的同步方法;HashMap则是线程不安全的

(3)HashMap的迭代器是fail-fast迭代器

(4)HashMap不能保证随着时间的推移,Map中的元素次序保持不变

 

HashMap线程不安全的危害?

(1)多线程同时普通时,可能丢失值

(2)多线程扩容时,会出现环状结构,造成死循环 。。。

 

如何解决HashMap的线程不安全?

(1)使用Collections的synchronizedMap()方法对其进行包装

(2)直接使用线程安全的ConcurrentHashMap

两种方式的区别主要是:前者在同步时会锁住整张表,而ConcurrentHashMap会使用自身的同步机制,比如分段锁或CAS。

 

谈一谈ConcurrentHashMap?

ConcurrentHashMap是在JDK1.5引入的,是HashMap的线程安全版本,其使用方式与HashMap一样,底层结构在Java7和Java8时都与HashMap相同,只是加入了线程安全的保障而已。

 

ConcurrentHashMap是如何保证线程安全的?

Java7的ConcurrentHashMap采用分段锁机制:

Java8改用CAS算法+Synchronized关键字来保证线程安全:

之所以抛弃分段锁,是因为:

 

说说对CAS算法的理解?

所谓CAS算法,即Compare And Swap。 。。。。

 

 

 

 

 

 

 

 

 

 


版权声明:本文为sinat_30973431原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。