Java TreeMap/TreeSet
2015-01-05 14:57
501 查看
首先要说明的是,TreeMap仍然是Map,而不是Tree。同样的,TreeSet仍然是Set,而不是Tree。也就是说TreeMap和TreeSet不能当成树来使用,只是它们的底层是使用红黑树来实现的。
TreeMap实现了java.util.SortedMap接口,是一个已经排好序的Map。
TreeMap映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
有两种方式使用TreeMap。
1.元素自然排序,即放入容器中的元素实现java.lang.Comparable接口。
2.使用排序器
如果既没有让元素实现java.lang.Comparable接口,也没有在TreeMap的构造器中传入排序器,则会在添加元素的抛出错误。
显然,使用排序器有利于解耦。
HashMap通常比TreeMap快一些(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap。
类似于HashSet,TreeSet也是基于TreeMap实现的。
TreeMap实现了java.util.SortedMap接口,是一个已经排好序的Map。
TreeMap映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
有两种方式使用TreeMap。
1.元素自然排序,即放入容器中的元素实现java.lang.Comparable接口。
package org.zzj; import java.util.TreeMap; public class TreeMapTest { public static void main(String[] args) { TreeMap<Person, String> treeMap = new TreeMap<Person, String>(); Person p1 = new Person("张三", 21); Person p2 = new Person("李四", 15); Person p3 = new Person("孙五", 26); Person p4 = new Person("赵六", 18); treeMap.put(p1, ""); treeMap.put(p2, ""); treeMap.put(p3, ""); treeMap.put(p4, ""); System.out.println(treeMap); p3.setAge(12); System.out.println(treeMap); } } class Person implements Comparable<Person> { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public int compareTo(Person o) { return this.age - o.age; } @Override public String toString() { return "name:" + name + "; age:" + age + "\n"; } }输出
{name:李四; age:15 =, name:赵六; age:18 =, name:张三; age:21 =, name:孙五; age:26 =} {name:李四; age:15 =, name:赵六; age:18 =, name:张三; age:21 =, name:孙五; age:12 =}当把孙五的年龄改为最小的时候,他仍然排在了最后,这说明元素的顺序在放入容器的时候就已经确定了。
2.使用排序器
package org.zzj; import java.util.Comparator; import java.util.TreeMap; public class TreeMapTest { public static void main(String[] args) { TreeMap<Person, String> treeMap = new TreeMap<Person, String>( new Comparator<Person>() { @Override public int compare(Person o1, Person o2) { return o1.getAge() - o2.getAge(); } }); Person p1 = new Person("张三", 21); Person p2 = new Person("李四", 15); Person p3 = new Person("孙五", 26); Person p4 = new Person("赵六", 18); treeMap.put(p1, ""); treeMap.put(p2, ""); treeMap.put(p3, ""); treeMap.put(p4, ""); System.out.println(treeMap); p3.setAge(12); System.out.println(treeMap); } } class Person { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "name:" + name + "; age:" + age + "\n"; } }输出:
{name:李四; age:15 =, name:赵六; age:18 =, name:张三; age:21 =, name:孙五; age:26 =} {name:李四; age:15 =, name:赵六; age:18 =, name:张三; age:21 =, name:孙五; age:12 =}
如果既没有让元素实现java.lang.Comparable接口,也没有在TreeMap的构造器中传入排序器,则会在添加元素的抛出错误。
显然,使用排序器有利于解耦。
HashMap通常比TreeMap快一些(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap。
类似于HashSet,TreeSet也是基于TreeMap实现的。
相关文章推荐
- Difference between TreeMap and TreeSet in Java
- java集合类深入分析之TreeMap/TreeSet篇
- java TreeMap TreeSet 用法 原理 详解
- java中Collection/Collections;List/Set/Map;ArrayList/Vector/LinkedList;HashSet/HashMap/TreeSet/TreeMap
- java treeMap 排序 treeset同理
- Java容器-引用数据类型排序+TreeSet、TreeMap底层实现
- java.util(一)HashMap TreeMap TreeSet
- java之TreeMap/TreeSet篇
- java中treemap和treeset实现红黑树
- java数据结构之树集TreeSet与书映射(TreeMap)
- Java -- 排序03(TreeSet 和 TreeMap)
- 浅谈java中的TreeMap 排序与TreeSet 排序
- 【转】java中的TreeMap与TreeSet关系及实现(红黑树)
- java数据结构之树集TreeSet与书映射(TreeMap)
- Treemap and Treeset java 实现
- java数据结构之树集TreeSet与书映射(TreeMap)
- Java基础之TreeSet集合使用泛型、比较器排序示例:
- java TreeSet 学习
- java比较接口Comparable,对象排序存在TreeSet中
- JAVA TreeSet