HashMap与TreeMap的应用与区别

Java中有许多封装好的数据结构类,比如List,ArrayList,Set,Map,Collection等,它们各自有各自的特点,其中,Map是属于键值对的集合,它提供key到value的映射,能够通过键来找到相应的值。一个Map中不能包含相同的key,每个key只能映射一个 value。本文主要针对其中两种经典常用的Map集合HashMap&TreeMap


HashMap的使用:

[java]  view plain  copy
  1. //初始化一个map集合  
  2. Map<String,String> map = new HashMap<String,String>();  
  3. //存入数据  
  4. map.put("aaa""aaa");  
  5. map.put("bbb""bbb");  
  6. map.put("fff""fff");  
  7. map.put("mmm""mmm");  
  8. map.put("ggg""ggg");  
  9. map.put("sss""sss");  

可以看到,初始化的时候,<Integer,String>传入两种类型,分别对应键和值的类型,然后通过put()方法将一条条数据加入到集合中,注意键和值的类型要与初始化的时候的类型一致。


既然存了东西,我们就要来使用它,以下是遍历集合中所有的数据:

[java]  view plain  copy
  1. Iterator iterator = map.keySet().iterator();  
  2. while(iterator.hasNext()){  
  3.     String key = (String)iterator.next();  
  4.     System.out.println(map.get(key));  
  5. }  

可以看到,通过map.keySet()返回了这个map中的所有键的集合,然后通过调用iterator()返回一个迭代器,使用该迭代器的hasNext()进行判断,如果还有下一个就将其键取出,并通过map的get()方法,通过映射将对应的值找出,即可实现逐一访问map中的每一个元素。

打印结果:



TreeMap的使用:

基本的用法与HashMap相似,代码如下:

[java]  view plain  copy
  1. public class MapTest {  
  2.       
  3.     public static void main(String[] args) {  
  4.         //初始化一个map集合  
  5.         Map<String,String> map = new TreeMap<String,String>();  
  6.         //存入数据  
  7.         map.put("aaa""aaa");  
  8.         map.put("bbb""bbb");  
  9.         map.put("fff""fff");  
  10.         map.put("mmm""mmm");  
  11.         map.put("ggg""ggg");  
  12.         map.put("sss""sss");  
  13.         //遍历输出  
  14.         Iterator iterator = map.keySet().iterator();  
  15.         while(iterator.hasNext()){  
  16.             String key = (String)iterator.next();  
  17.             System.out.println(map.get(key));  
  18.         }  
  19.     }  
  20.   
  21. }  


打印结果:





HashMap与TreeMap的区别:

观察上面的打印结果,可以发现,两者虽然存入相同的数据,可是遍历出来的结果却完全不一样,注意到TreeMap的结果是按照字母表的顺序进行存储的,HashMap则没有,故在实际开发中,如果数据需要按照一定的顺序进行存储,可以使用TreeMap。
TreeMap是SortedMap接口基于红黑树的实现,该类保证了映射按照升序排列关键字。HashMap是根据键的HashCode 值存储数据,取得数据的顺序是完全随机的,HashMap取值的速度更快。



你可能会问,TreeMap中默认是按照升序进行排序的,那如果要让它降序排序呢?
可以通过自定义的比较器来进行设置:


1.首先,定义一个比较器类,实现Comparator接口,重写compare方法,有两个参数,这两个参数通过调用compareTo进行比较,而compareTo默认规则是:
如果参数字符串等于此字符串,则返回 0 值;
如果此字符串小于字符串参数,则返回一个小于 0 的值;
如果此字符串大于字符串参数,则返回一个大于 0 的值。

我们可以通过改写成如下:

[java]  view plain  copy
  1. static class MyComparator implements Comparator{  
  2.     @Override  
  3.     public int compare(Object o1, Object o2) {  
  4.         // TODO Auto-generated method stub  
  5.         String param1 = (String)o1;  
  6.         String param2 = (String)o2;  
  7.         return -param1.compareTo(param2);  
  8.     }     
  9. }  

在返回时多添加了个负号,就将比较的结果以相反的形式返回。


2.通过MyComparator类初始化一个比较器实例,将其作为参数传进TreeMap的构造方法中:

[java]  view plain  copy
  1. MyComparator comparator = new MyComparator();  
  2.   
  3. Map<String,String> map = new TreeMap<String,String>(comparator);  

设置完成之后,这个map就会按照我们自定义的比较方式来进行排序了。


完整代码如下:

[java]  view plain  copy
  1. /** 
  2.  * @author ZJYANG 
  3.  * TreeMap的使用 
  4.  */  
  5. public class MapTest {  
  6.       
  7.     public static void main(String[] args) {  
  8.         //初始化自定义比较器  
  9.         MyComparator comparator = new MyComparator();  
  10.         //初始化一个map集合  
  11.         Map<String,String> map = new TreeMap<String,String>(comparator);  
  12.         //存入数据  
  13.         map.put("aaa""aaa");  
  14.         map.put("bbb""bbb");  
  15.         map.put("fff""fff");  
  16.         map.put("mmm""mmm");  
  17.         map.put("ggg""ggg");  
  18.         map.put("sss""sss");  
  19.         //遍历输出  
  20.         Iterator iterator = map.keySet().iterator();  
  21.         while(iterator.hasNext()){  
  22.             String key = (String)iterator.next();  
  23.             System.out.println(map.get(key));  
  24.         }  
  25.     }  
  26.       
  27.     static class MyComparator implements Comparator{  
  28.   
  29.         @Override  
  30.         public int compare(Object o1, Object o2) {  
  31.             // TODO Auto-generated method stub  
  32.             String param1 = (String)o1;  
  33.             String param2 = (String)o2;  
  34.             return -param1.compareTo(param2);  
  35.         }  
  36.           
  37.     }  
  38.   
  39. }  


运行结果:


可以看到,顺序已经是按照降序进行排序。熟练地运用这些Map可在实际开发中大大提高我们的效率。

猜你喜欢

转载自blog.csdn.net/qq_32613479/article/details/80152690