TOP

java集合类源码分析之Map(二)(一)
2017-10-11 15:19:51 】 浏览:10060
Tags:java 集合 源码 分析 Map

这一节主要讨论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排序。

  • 按key排序

有两种方式来实现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  
		
java集合类源码分析之Map(二)(一) https://www.cppentry.com/bencandy.php?fid=76&id=139028

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇关于Java里面File类创建txt文件重.. 下一篇java中equals与==的用法比较