TreeMap简介

在Map集合框架中,除了HashMap以外,TreeMap也是常用到的集合对象之一。
与HashMap相比,TreeMap是一个能比较元素大小的Map集合,会对传入的key进行了大小排序。其中,可以使用元素的自然顺序,也可以使用集合中自定义的比较器来进行排序;
不同于HashMap的哈希映射,TreeMap实现了红黑树的结构,形成了一颗二叉树。
TreeMap简介
TreeMap继承于AbstractMap,实现了Map, Cloneable, NavigableMap, Serializable接口。
(1)TreeMap 继承于AbstractMap,而AbstractMap实现了Map接口,并实现了Map接口中定义的方法,减少了其子类继承的复杂度;
(2)TreeMap 实现了Map接口,成为Map框架中的一员,可以包含着key-value形式的元素;
(3)TreeMap 实现了NavigableMap接口,意味着拥有了更强的元素搜索能力;
(4)TreeMap 实现了Cloneable接口,实现了clone()方法,可以被克隆;
(5)TreeMap 实现了Java.io.Serializable接口,支持序列化操作;
TreeMap具有如下特点:
不允许出现重复的key;
可以插入null键,null值;
可以对元素进行排序;
无序集合(插入和遍历顺序不一致);
TreeMap基本操作

[Java] 纯文本查看 复制代码 ?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 public class TreeMapTest {     public static void main(String[] agrs){         //创建TreeMap对象:         TreeMap<String,Integer> treeMap = new TreeMap<String,Integer>();         System.out.println("初始化后,TreeMap元素个数为:" + treeMap.size());           //新增元素:         treeMap.put("hello",1);         treeMap.put("world",2);         treeMap.put("my",3);         treeMap.put("name",4);         treeMap.put("is",5);         treeMap.put("huangqiuping",6);         treeMap.put("i",6);         treeMap.put("am",6);         treeMap.put("a",6);         treeMap.put("developer",6);         System.out.println("添加元素后,TreeMap元素个数为:" + treeMap.size());           //遍历元素:         Set<Map.Entry<String,Integer>> entrySet = treeMap.entrySet();         for(Map.Entry<String,Integer> entry : entrySet){             String key = entry.getKey();             Integer value = entry.getValue();             System.out.println("TreeMap元素的key:"+key+",value:"+value);         }           //获取所有的key:         Set<String> keySet = treeMap.keySet();         for(String strKey:keySet){             System.out.println("TreeMap集合中的key:"+strKey);         }           //获取所有的value:         Collection<Integer> valueList = treeMap.values();         for(Integer intValue:valueList){             System.out.println("TreeMap集合中的value:" + intValue);         }           //获取元素:         //获取集合内元素key为"huangqiuping"的值         Integer getValue = treeMap.get("huangqiuping");         //获取集合内第一个元素         String firstKey = treeMap.firstKey();         //获取集合内最后一个元素         String lastKey =treeMap.lastKey();         //获取集合内的key小于"huangqiuping"的key         String lowerKey =treeMap.lowerKey("huangqiuping");         //获取集合内的key大于等于"huangqiuping"的key         String ceilingKey =treeMap.ceilingKey("huangqiuping");         //获取集合的key从"a"到"huangqiuping"的元素         SortedMap<String,Integer> sortedMap =treeMap.subMap("a","my");           //删除元素:         //删除集合中key为"huangqiuping"的元素         Integer removeValue = treeMap.remove("huangqiuping");         //清空集合元素:         treeMap.clear();           //判断方法:         //判断集合是否为空         boolean isEmpty = treeMap.isEmpty();         //判断集合的key中是否包含"huangqiuping"         boolean isContain = treeMap.containsKey("huangqiuping");     } }


TreeMap排序

(1)使用元素自然排序
在使用自然顺序排序时候,需要区分两种情况:一种是Jdk定义的对象,一种是自己定义的对象;

 

[Java] 纯文本查看 复制代码 ?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 <font style="color:rgb(77, 77, 77)"><font face="&quot"><font style="font-size:16px">public class SortedTest implements Comparable<SortedTest> {     private int age;     public SortedTest(int age){         this.age = age;     }     public int getAge() {         return age;     }     public void setAge(int age) {         this.age = age;     }     //自定义对象,实现compareTo(T o)方法:     public int compareTo(SortedTest sortedTest) {         int num = this.age - sortedTest.getAge();         //为0时候,两者相同:         if(num==0){             return 0;         //大于0时,传入的参数小:         }else if(num>0){             return 1;         //小于0时,传入的参数大:         }else{             return -1;         }     } }   public class TreeMapTest {     public static void main(String[] agrs){         //自然顺序比较         naturalSort();     }      //自然排序顺序:     public static void naturalSort(){         //第一种情况:Integer对象         TreeMap<Integer,String> treeMapFirst = new TreeMap<Integer, String>();         treeMapFirst.put(1,"huangqiuping");         treeMapFirst.put(6,"huangqiuping");         treeMapFirst.put(3,"huangqiuping");         treeMapFirst.put(10,"huangqiuping");         treeMapFirst.put(7,"huangqiuping");         treeMapFirst.put(13,"huangqiuping");         System.out.println(treeMapFirst.toString());           //第二种情况:SortedTest对象         TreeMap<SortedTest,String> treeMapSecond = new TreeMap<SortedTest, String>();         treeMapSecond.put(new SortedTest(10),"huangqiuping");         treeMapSecond.put(new SortedTest(1),"huangqiuping");         treeMapSecond.put(new SortedTest(13),"huangqiuping");         treeMapSecond.put(new SortedTest(4),"huangqiuping");         treeMapSecond.put(new SortedTest(0),"huangqiuping");         treeMapSecond.put(new SortedTest(9),"huangqiuping");         System.out.println(treeMapSecond.toString());     } }</font></font></font>

 

在自然顺序比较中,需要让被比较的元素实现Comparable接口,否则在向集合里添加元素时报:"java.lang.ClassCastException: com.huangqiuping.collection.map.SortedTest cannot be cast to java.lang.Comparable"异常;

这是因为在调用put()方法时,会将传入的元素转化成Comparable类型对象,所以当你传入的元素没有实现Comparable接口时,就无法转换,遍会报错;

(2)使用自定义比较器排序

使用自定义比较器排序,需要在创建TreeMap对象时,将自定义比较器对象传入到TreeMap构造方法中;

自定义比较器对象,需要实现Comparator接口,并实现比较方法compare(To1,To2);

使用自定义比较器排序的话,被比较的对象无需再实现Comparable接口了;

 

[Java] 纯文本查看 复制代码 ?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 public class SortedTest {     private int age;     public SortedTest(int age){         this.age = age;     }     public int getAge() {         return age;     }     public void setAge(int age) {         this.age = age;     } } public class SortedTestComparator implements Comparator<SortedTest> {     //自定义比较器:实现compare(To1,To2)方法:     public int compare(SortedTest sortedTest1, SortedTest sortedTest2) {         int num = sortedTest1.getAge() - sortedTest2.getAge();         if(num==0){//为0时候,两者相同:             return 0;         }else if(num>0){//大于0时,后面的参数小:             return 1;         }else{//小于0时,前面的参数小:             return -1;         }     } }  
更多java学习资料可关注:itheimaGZ获取
上一篇:java 容器


下一篇:HashMap、HashTable、LinkedHashMap、TreeMap使用和区别