本文共 1124 字,大约阅读时间需要 3 分钟。
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。 。。。。
转载地址:http://bfnii.baihongyu.com/