我们可能都知道讲到TreeSet,就必然想到HashSet,它们都是集合中的一种,我们想来看一下集合框架吧
这是基本的框架简化图,从图中我们可以看出TreeSet集合和HashSet集合都实现了Set接口,那么我们来说一说Set接口吧。
Set接口
Set不允许包含相同的元素,如果试图把两个相同元素加入同一个集合中,add方法返回false。
Set判断两个对象相同不是使用==运算符,而是根据equals方法。也就是说,只要两个对象用equals方法比较返回true,Set就不会接受这两个对象。
HashSet
HashSet有以下特点
不能保证元素的排列顺序,顺序有可能发生变化
不是同步的
集合元素可以是null,但只能放入一个null。
TreeSet
1.TreeSet是Set子接口SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态。TreeSet支持两种排序方式,自然排序 和定制排序,其中自然排序为默认的排序方式。向TreeSet中加入的应该是同一个类的对象。
2.TreeSet判断两个对象不相等的方式是两个对象通过equals方法返回false,或者通过CompareTo方法比较没有返回0
TreeSet的性能比HashSet差但是我们在需要排序的时候可以用TreeSet ,因为他是自然排序也就是升序。
import java.util.Iterator; import java.util.TreeSet; public class TreeSet_t { public static void main(String[] args) { TreeSet tree = new TreeSet(); Students s1 = new Students("西瓜", 12, "男"); Students s2 = new Students("苹果", 11, "女"); Students s3 = new Students("冬瓜", 15, "女"); Students s4 = new Students("菠萝", 10, "男"); tree.add(s1); tree.add(s2); tree.add(s3); tree.add(s4); // 迭代器的方式输出 Iterator it = tree.iterator(); while (it.hasNext()) { System.out.println(it.next()); } tree.removeAll(tree); if(tree.isEmpty()){ System.out.println("已经全部删除!"); } } }
3、TreeSet中的元素必须实现Comparable接口并重写compareTo()方法,TreeSet判断元素是否重复、以及确定元素的顺序靠的都是这个方法;(这条性质比较重要,如果读者对TreeSet内部机制比较熟悉的话这条性质应该不难理解)
4.向TreeSet中添加元素时,首先按照compareTo()进行比较,一旦返回0,虽然仅是两个对象属性值相同,但是程序会认为这两个对象是相同的,进而后一个对象不能添加进来。
5.TreeSet先执行compareto方法,再执行hashcode和equals方法,所以compareTo()与hashcode()与equals()三者保持一致
package lianxi2; import java.util.Set; import java.util.TreeSet; import org.junit.Test; public class TestTreeSet { @Test public void testTreeSet(){ Set set = new TreeSet(); set.add(new Student(1001,"huhu")); //重写了equals和hashcode方法 set.add(new Student(1003,"gx")); set.add(new Student(1007,"safd")); set.add(new Student(1005,"gas")); set.add(new Student(1005,"cxz")); System.out.println(set.size()); System.out.println(set); } }
结果:
5
[Student [id=1001, name=huhu], Student [id=1003, name=gx], Student [id=1005, name=cxz], Student [id=1005, name=gas], Student [id=1007, name=safd]]
完!!!