set不保存重复的元素。set中最常被使用的是测试归属性,你可以很容易的询问某个对象是否在某个set中。set具有与collection完全一样的接口,因此没有任何额外的功能。实际上set就是collection,只是行为不同。
实现了set接口的主要有hashset、treeset、linkedhashset这几个共同点就是每个相同的项只保存一份。他们也有不同点,区别如下:
1.hashset:
hashset使用的是相当复杂的方式来存储元素的,使用hashset能够最快的获取集合中的元素,效率非常高(以空间换时间)。会根据
hashcode和equals来庞端是否是同一个对象,如果hashcode一样,并且equals返回true,则是同一个对象,不能重复存放。
<a></a>
正如上例所示,重写了hashcode()和equals()方法来区分同意对象后,就不能存放同以对象了。如果注释这两个方法,则所有student对象视为不同对象,都可以存放。
2.treeset
treeset也不能存放重复对象,但是treeset会自动排序,如果存放的对象不能排序则会报错,所以存放的对象必须指定排序规则。排序规则包括自然排序和客户排序。
①自然排序:treeset要添加哪个对象就在哪个对象类上面实现java.lang.comparable接口,并且重写comparato()方法,返回0则表示是同一个对象,否则为不同对象。
②客户排序:建立一个第三方类并实现java.util.comparator接口。并重写方法。定义集合形式为treeset ts = new treeset(new 第三方类());
下面一个例子用treeset存放自然排序的对象:
输出结果为:
1
2
3
4
5
下面一个例子用treeset存放客户排序的对象:
大家都知道list存放时按照插入顺序排序的,其实也可以用自然排序和客户排序对list集合排序,大家请看:
[5, 1, 2, 4, 3]
[1, 2, 3, 4, 5]
[5, 4, 3, 2, 1]
3.linkedhashset
linkedhashset按照插入顺序保存对象,同时还保存了hashset的查询速度。