Java中有许多封装好的数据结构类,比如List,ArrayList,Set,Map,Collection等,它们各自有各自的特点,其中,Map是属于键值对的集合,它提供key到value的映射,能够通过键来找到相应的值。一个Map中不能包含相同的key,每个key只能映射一个 value。本文主要针对其中两种经典常用的Map集合HashMap&TreeMap
HashMap的使用:
- //初始化一个map集合
- Map<String,String> map = new HashMap<String,String>();
- //存入数据
- map.put("aaa", "aaa");
- map.put("bbb", "bbb");
- map.put("fff", "fff");
- map.put("mmm", "mmm");
- map.put("ggg", "ggg");
- map.put("sss", "sss");
可以看到,初始化的时候,<Integer,String>传入两种类型,分别对应键和值的类型,然后通过put()方法将一条条数据加入到集合中,注意键和值的类型要与初始化的时候的类型一致。
既然存了东西,我们就要来使用它,以下是遍历集合中所有的数据:
- Iterator iterator = map.keySet().iterator();
- while(iterator.hasNext()){
- String key = (String)iterator.next();
- System.out.println(map.get(key));
- }
打印结果:
TreeMap的使用:
基本的用法与HashMap相似,代码如下:
- public class MapTest {
- public static void main(String[] args) {
- //初始化一个map集合
- Map<String,String> map = new TreeMap<String,String>();
- //存入数据
- map.put("aaa", "aaa");
- map.put("bbb", "bbb");
- map.put("fff", "fff");
- map.put("mmm", "mmm");
- map.put("ggg", "ggg");
- map.put("sss", "sss");
- //遍历输出
- Iterator iterator = map.keySet().iterator();
- while(iterator.hasNext()){
- String key = (String)iterator.next();
- System.out.println(map.get(key));
- }
- }
- }
HashMap与TreeMap的区别:
观察上面的打印结果,可以发现,两者虽然存入相同的数据,可是遍历出来的结果却完全不一样,注意到TreeMap的结果是按照字母表的顺序进行存储的,HashMap则没有,故在实际开发中,如果数据需要按照一定的顺序进行存储,可以使用TreeMap。TreeMap是SortedMap接口基于红黑树的实现,该类保证了映射按照升序排列关键字。HashMap是根据键的HashCode 值存储数据,取得数据的顺序是完全随机的,HashMap取值的速度更快。
你可能会问,TreeMap中默认是按照升序进行排序的,那如果要让它降序排序呢?
可以通过自定义的比较器来进行设置:
1.首先,定义一个比较器类,实现Comparator接口,重写compare方法,有两个参数,这两个参数通过调用compareTo进行比较,而compareTo默认规则是:
如果参数字符串等于此字符串,则返回 0 值;
如果此字符串小于字符串参数,则返回一个小于 0 的值;
如果此字符串大于字符串参数,则返回一个大于 0 的值。
我们可以通过改写成如下:
- static class MyComparator implements Comparator{
- @Override
- public int compare(Object o1, Object o2) {
- // TODO Auto-generated method stub
- String param1 = (String)o1;
- String param2 = (String)o2;
- return -param1.compareTo(param2);
- }
- }
在返回时多添加了个负号,就将比较的结果以相反的形式返回。
2.通过MyComparator类初始化一个比较器实例,将其作为参数传进TreeMap的构造方法中:
- MyComparator comparator = new MyComparator();
- Map<String,String> map = new TreeMap<String,String>(comparator);
- public class MapTest {
- public static void main(String[] args) {
- //初始化自定义比较器
- MyComparator comparator = new MyComparator();
- //初始化一个map集合
- Map<String,String> map = new TreeMap<String,String>(comparator);
- //存入数据
- map.put("aaa", "aaa");
- map.put("bbb", "bbb");
- map.put("fff", "fff");
- map.put("mmm", "mmm");
- map.put("ggg", "ggg");
- map.put("sss", "sss");
- //遍历输出
- Iterator iterator = map.keySet().iterator();
- while(iterator.hasNext()){
- String key = (String)iterator.next();
- System.out.println(map.get(key));
- }
- }
- static class MyComparator implements Comparator{
- @Override
- public int compare(Object o1, Object o2) {
- // TODO Auto-generated method stub
- String param1 = (String)o1;
- String param2 = (String)o2;
- return -param1.compareTo(param2);
- }
- }
- }
可以看到,顺序已经是按照降序进行排序。熟练地运用这些Map可在实际开发中大大提高我们的效率。
注:原文来自于 http://blog.csdn.net/it_zjyang/article/details/51867143