扫码关注公众号
Java 中的另一个线程安全的与 HashMap 极其类似的类是什么?同样是线程安全,它与 HashTable 在线程同步上有什么不同?
ConcurrentHashMap类(是Java并发包java.util.concurrent中提供的一个线程安全且高效的HashMap实现)。HashTable是使用synchronize关键字加锁的原理(就是对对象加锁);而针对ConcurrentHashMap,在JDK1.7中采用分段锁的方式;JDK1.8中直接采用了CAS(无锁算法)+synchronized。
HashMap 和 HashTable 有什么区别?
①、HashMap是线程不安全的,HashTable是线程安全的;②、由于线程安全,所以HashTable的效率比不上HashMap;③、HashMap最多只允许一条记录的键为null,允许多条记录的值为null,而HashTable不允许;④、HashMap默认初始化数组的大小为16,HashTable为11,前者扩容时,扩大两倍,后者扩大两倍+1;⑤、HashMap需要重新计算hash值,而HashTable直接使用对象的hashCode
HashMap 的 table 的容量如何确定?loadFactor 是什么?该容量如何变化?这种变化会带来什么问题?
①、table数组大小是由capacity这个参数确定的,默认是16,也可以构造时传入,最大限制是1<<30;②、loadFactor是装载因子,主要目的是用来确认table数组是否需要动态扩展,默认值是0.75,比如table数组大小为16,装载因子为0.75时,threshold就是12,当table的实际大小超过12时,table就需要动态扩容;③、扩容时,调用resize()方法,将table长度变为原来的两倍(注意是table长度,而不是threshold)④、如果数据很大的情况下,扩展时将会带来性能的损失,在性能要求很高的地方,这种损失很可能很致命。