TreeSet
注意:TreeSet在添加元素时进行排序,数据更改不会影响原来的顺序。使用过程中最好不要改变其元素内容,可能会导致内容重复。为避免重复可以将元素类内部属性定义为final常量,就不能修改了。
- 数据元素可以排序且不可重复
因为TreeSet也是实现了Set接口的实体类,而Set接口中元素不可重复。 - HashSet与TreeSet对比
HashSet中的元素必须重写hashcode和equals方法,用来去重,而TreeSet因为元素可以排序,即定义了排序规则就可以通过比较,结果为0则表示重复了。 - 对于两种不同的排序定义实现选择不同的构造器
- Comparable选择
new TreeSet();
- Comparator选择
new TreeSet(Comparator<? super E> comparator);
TreeSet应用示例
很简单,继续使用上面的Person类,因为在存放时就已经排序了,直接输出即可查看排序后的内容
- Comparator接口定义的类的排序
public class Demo1 {
public static void main(String[] args) {
TreeSet<Person> list=new TreeSet<>(new PersonHandsomSort());
list.add(new Person("张学友",105));
list.add(new Person("刘德华", 100));
list.add(new Person("Viking",300));
System.out.println(list);
}
}
- 实现Compareble接口的自定义类的排序
public class Demo1 {
public static void main(String[] args) {
//直接调用空构造器
TreeSet<Person> list=new TreeSet<>();
list.add(new Person("张学友",105));
list.add(new Person("刘德华", 100));
list.add(new Person("Viking",300));
System.out.println(list);
}
}
TreeMap
TreeMap与TreeSet的使用类似。
TreeMap要求键是可以排序的,上面的Person类可以直接当做值来排序,键随便放点什么就好了。
- Comparator接口
public class Demo1 {
public static void main(String[] args) {
TreeMap<Person, String> map=new TreeMap<>(new PersonHandsomSort());
Person p1=new Person("张学友",105);
Person p2=new Person("刘德华", 100);
Person p3=new Person("Viking",300);
map.put(p1, "123");
map.put(p2, "123");
map.put(p3, "123");
//利用map的KeySet方法,得到存放键的数组,即Person的数组,再打印
Set<Person> persons=map.keySet();
System.out.println(persons);
}
}
- Comparable接口类似,不再重复