一、前言
HashMap是我们平常开发中经常用到的,但是这几个map之间的区别有时候可能不是特别清楚,首先map是由key,value组成,可以快速的通过get(key)来获得value值,但是HashMap是无序的,ConcurrentHashMap也是无序的,但是是线程安全的,LinkedHashMap是根据put的先进先出规则进行排序的,
二、HashMap
1、代码如下:
HashMap a = new HashMap();
a.put("A","1111");
a.put("H","2222");
a.put("Z","3333");
a.put("F","3333");
a.put("E","3333");
// Bundle bundle = new Bundle();
for (Object entry : a.entrySet()) {
System.out.println(entry);
}
2、输出结果为:
A=1111
E=3333
F=3333
H=2222
Z=3333
从上可以看出Hashmap在push时是无序的,但是是线程不安全的,如果使用线程安全的,需要使用ConcurrentHashMap
ConcurrentHashMap的实现原理
JDK1.7 ConcurrentHashMap采用了数组+Segment+分段锁的方式实现
JDK1.8 ConcurrentHashMap采用了数组+链表+红黑树的实现方式来设计,内部大量采用CAS操作
三、LinkedHashMap
LinkedHashMap a = new LinkedHashMap();
a.put("A","1111");
a.put("H","2222");
a.put("Z","3333");
a.put("F","3333");
a.put("E","3333");
// Bundle bundle = new Bundle();
for (Object entry : a.entrySet()) {
System.out.println(entry);
}
输出结果为:
A=1111
H=2222
Z=3333
F=3333
E=3333
从以上结果可以看出,LinkedHashMap是按照先进先出原则进行排序的
其中如果想让LinkedHashMap变为线程安全的,可以使用Collections.synchronizedMap,也是采用synchronized方法上加锁,使用阻塞同步,效率低。
四、ConcurrentSkipListMap
ConcurrentSkipListMap需要指定字段进行排序,并不是先进先出的方式,但他是线程安全的。