Java 中常见的Map类大概就这些吧,汇总一下,如果漏掉了什么以后再补上。
类 | 线程安全 | key排序 | 内部结构 | 特性 | 不足处 |
---|---|---|---|---|---|
HashMap | 不安全 | 乱序 | hash数组+拉链法(红黑树)处理冲突 | - | 乱序,不安全 |
LinkedHashMap | 不安全 | 插入顺序(默认)/访问顺序 | hash数组+拉链法(红黑树)处理冲突 | 每个节点增加before/after指针,实现排序 | 不安全 |
TreeMap | 不安全 | 按key值大小排序 | 红黑树 | 使用红黑树实现基于key的排序 | 速度慢 |
Hashtable | 安全 | 乱序 | hash数组+拉链法处理冲突 | 对方法增加synchronized实现线程安全 | 速度慢 |
ConcurrentHashMap | 安全 | 乱序 | hash数组+拉链法(红黑树)处理冲突 | 将hash数组分为数个segment,实现segment间多线程访问,提升效率 | 不安全 |
HashMap<Integer,String > hm = new HashMap<>();
TreeMap<Integer,String> tm = new TreeMap<>();
LinkedHashMap<Integer,String> lm = new LinkedHashMap<>();
hm.put(20,"2");
hm.put(30,"3");
hm.put(10,"1");
hm.put(40,"4");
for (Map.Entry<Integer,String> e:hm.entrySet())
System.out.println(e);
System.out.println();
tm.put(20,"2");
tm.put(30,"3");
tm.put(10,"1");
tm.put(40,"4");
for (Map.Entry<Integer,String> e:tm.entrySet())
System.out.println(e);
System.out.println();
lm.put(20,"2");
lm.put(30,"3");
lm.put(10,"1");
lm.put(40,"4");
for (Map.Entry<Integer,String > e:lm.entrySet())
System.out.println(e);
运行结果:
20=2
40=4
10=1
30=3
10=1
20=2
30=3
40=4
20=2
30=3
10=1
40=4
可以看到,HashMap(第一个)输出是乱序的,TreeMap(第二个)根据key值大小排序,LinkedHashMap(第三个)根据插入顺序排序。