这一节主要讨论Map接口的几个实现类的区别和用法。
1.线程安全
Hashtable是线程安全的(原因与StringBuffer、Vector相似),而其他的Map实现类都是非线程安全的,至于为什么,可以看之前的一些文章,前面已经介绍地很详细了。
2.适用条件
HashMap:适用于需要快速查找的数据,并且数据无序的情况下,允许键为空(只一次),允许值为空;
TreeMap:适用于按key有序存储的数据,不允许键为空;
Hashtable:适用于有同步要求的情况下,保证线程安全,不允许键和值为空;
LinkedHashMap:保存了元素插入时的顺序,具有HashMap的所有特性,但遍历时比HashMap要慢。
HashMap与LinkedHashMap的比较示例:
1 private static void linkedHashMapAnal() {
2 //LinkedHashMap具有HashMap的所有特性,并且能够保留元素插入时的顺序
3 Map<String, Integer> linkedHashMap = new LinkedHashMap<String, Integer>();
4 Map<String, Integer> hashMap = new HashMap<String, Integer>();
5
6 hashMap.put("A", 120);
7 hashMap.put("B", 100);
8 hashMap.put("C", 105);
9 hashMap.put("D", 200);
10 for(String key: hashMap.keySet()){
11 System.out.print(key+":"+hashMap.get(key)+" ");
12 }//D:200 A:120 B:100 C:105
13
14 System.out.println();
15 linkedHashMap.put("A", 120);
16 linkedHashMap.put("B", 100);
17 linkedHashMap.put("C", 105);
18 linkedHashMap.put("D", 200);
19 for(String key: linkedHashMap.keySet()){
20 System.out.print(key+":"+linkedHashMap.get(key)+" ");
21 }//A:120 B:100 C:105 D:200
22 }
3.排序问题
Map集合的排序常常分为按key排序和按value排序。
有两种方式来实现Map的按key排序:TreeMap中的比较器和Collections类中的sort方法。
1.TreeMap的按key排序
1 //采用默认比较器按key值升序排列,进行存储
2 Map<String, Integer> treeMap = new TreeMap<String, Integer>();
3 treeMap.put("B", 120);
4 treeMap.put("C", 105);
5 treeMap.put("A", 100);
6 for(String key: treeMap.keySet()){
7 System.out.print(key+":"+treeMap.get(key)+", ");
8 } //A:100, B:120, C:105,
9 }
1 //自定义比较器,实现降序存储
2 Map<String, Integer> treeMap = new TreeMap<String, Integer>(new Comparator<String>() {
3 @Override
4 public int compare(String o1, String o2) {
5 // return 0; 默认升序
6 return o2.compareTo(o1); //降序
7 }
8 });
9 treeMap.put("B", 120);
10 treeMap.put("C", 105);
11 treeMap.put("A", 100);
12 for(String key: treeMap.keySet()){
13 System.out.print(key+":"+treeMap.get(key)+", ");
14 } //C:105, B:120, A:100,
1 //用SortedMap子集初始化TreeMap对象,调用参数自带的比较器
2 //注意:TreeMap初始化的参数必须为SortedMap类型或者其实现类TreeMap类型,否则将调用默认比较器,所以此处也可以创建一个TreeMap类型的subMap
3 SortedMap<String, Integer> subMap = new TreeMap<String, Integer>(new Comparator<String>() {
4
5 @Override
6 public int compare(String o1, String o2) {
7 // TODO Auto-generated method stub
8 return o2.compareTo(o1);
9 }
10 });
11 subMap.put("B", 100);
12 subMap.put("F", 120);
13 subMap.put("D", 105);
14 for(String key: subMap.keySet()){
15 System.out.print(key+":"+subMap.get(key)+", ");
16 } //F:120, D:105, B:100,
17
18 System.out.println();
19
20 Map<String, Integer> treeMap = new TreeMap<String, Integer>(subMap);
21 for(String key: treeMap.keySet()){
22 System.out.print(key+":"+treeMap.get(key)+", ");
23 } //F:120, D:105, B:100,
24
25 System.out.println();
26
27 treeMap.put("A", 200);
28 treeMap.put("C", 300);
29 treeMap.put("E