HashTable 与HashMap的区别
1.推出版本:jdk1.0 jdk1.2
2.性能 同步操作,性能低 异步操作,性能高
3.安全性 线程安全 非线程安全
4.null操作:key&value都不能为空,否则出现NullPointerException 允许存放null,有且只有一个。
ConcurrentHashMap
1.为什么用ConcurrentHashMap,HashTable同步操作,所有并发操作竞争同一把锁。效率低。
2.而Collections提供的同步包装器,只是利用输入Map构造了另一个同步版本,所有操作不再声明为synchronized方法,但还是利用this作为互斥的mutex,没有真正意义上的改进。
3.ConcurrentHashMap分析
早期:分离锁,将内部进行分段(Segment)。
jdk8以及之后的版本:
内部储存和HashMap类似。
不再使用Segment,初始化操作简化,修改为lazy-load形式,有效避免初始开销。
数据存储利用volatile保证可见性
使用CAS,在特定场景下进行无锁并发操作
使用Unsafe、LOngAdder之类的底层手段,进行极端情况的优化。
Map集合的输出
1.不同于Collection接口的iterator方法可以方便的取得Iterator对象输出,Map接口没有此方法。
2.但是Map接口可以转化成Set接口,即entrySet()方法
public Set<Map.Entry<K,V>> entrySet();
// 1.转化成Set集合
Set<Map.Entry<Integer,String>> set = map.entrySet() ;
// 2.获取Iterator对象
Iterator<Map.Entry<Integer,String>> iterator = set.iterator() ;
关于key值
除了系统类(String,Integer),也可以使用自定义类,但需要覆写Object类的hashCode()&equals()方法。
不然当你使用get()方法输出的时候,得到的是null.
TreeMap子类
1.是一个可排序的子类,依靠key的内容排序
2.排序依靠Comparable接口完成,使用compareTo(),与hashCode()和equals()方法无关。
Map集合小结
1.Collection接口保存数据的目的是输出,Map是根据key值输出
2.Map使用Iterator输出(Map.Entry)
3.HashMap结构要理解(链表与红黑树)、 HashMap与HashTable的区别(相似的还有ArrayList和Vector的区别,不要搞混)。