下面列出了Set接口继承自Collection接口的主要方法。
- boolean add(Object obj)
向集合中添加一个数据元素,该数据元素不能和集合中现有数据元素重复。
Set集合采用对象的equals()方法比较两个对象是否相等,判断某个对象是否已经存在于集合中。当向集合中添加一个对象时,HashSet会调用对象的hashCode()方法来获得哈希码,然后根据这个哈希码进一步计算出对象在集合中的存放位置。
- void clear()
移除此集合中的所有数据元素,即将集合清空。
- boolean contains(Object obj)
判断此集合中是否包含该数据元素,如果包含,则返回true。
判断集合是否为空,为空则返回true。
- Iterator iterator()
返回一个Iterator对象,可用它来遍历集合中的数据元素。
- boolean remove(Object obj)
- int size()
返回集合中数据元素的个数,注意与数组、字符串获取长度的方法的区别。
返回一个数组,该数组包含集合中的所有数据元素。
Set接口主要有两个实现类HashSet和TreeSet,HashSet类有一个子类LinkedHashSet,它不仅实现了哈希算法,而且采用了链表结构。接下来通过一个案例来说明HashSet类的使用。
编译、运行程序,程序运行结果如图3.3所示。从运行结果中可以看出,当向集合中增加一个已有(通过equals()方法判断)的数据元素时,没有添加成功。需要注意的是,可以通过add()方法的返回值判断是否添加成功,如果不获取这个返回值的话,Java系统并不提示没有添加成功。
图3.3 HashSet的使用
TreeSet类在实现了Set接口的同时,也实现了SortedSet接口,是一个具有排序功能Set接口类。本小节将介绍TreeSet类的使用,同时也会涉及Java如何实现对象间的排序功能,希望大家能深刻体会。
接下来看一段非常简单的程序,编译运行,其运行结果如图3.4所示。
图3.4 TreeSet的使用
从运行结果可以看出,TreeSet集合ts里面的元素不是毫无规律的排序,而是按照自然升序进行了排序。这是因为TreeSet集合中的元素是String类,而String类实现了Comparable接口,默认按自然顺序排序。
如果程序员想定义自己的排序方式,方法也很简单,就是要让加入TreeSet集合中的对象所属的类实现Comparable接口,通过实现compareTo(Object o)方法,达到排序的目的。
假设有这样的需求,学生对象有两个属性,分别是学号和姓名。希望将这些学生对象加入TreeSet集合后,按照学号大小从小到大进行排序,学号相同的再按照姓名自然排序。让我们来看学生类的代码(实现Comparable接口):
其中,int compareTo(Object o)方法是用此对象和指定对象进行比较,如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。编写测试程序,具体代码如下。程序运行结果如图3.5所示。
图3.5 Comparable接口的使用