Set接口是CoIIection接口的子接口,表示集合,对实现该接口的对象有一个要求,就是集合中的元素不允许重复,该接口与CoIIection接口基本一致,方法与CoIIection完全相同。Set接口的实现类有如下两个。
(1)HashSet——HashSet的特性在于其内部对象的散列存取,即采用哈希技术。
(2)TreeSet——TreeSet存入的顺序与存储的顺序不同,存储是按照排序存储的。
下面分别来介绍这两个实现类的用法。
1. HashSet类
HashSet是实现Set接口的一个类,具有以下特点。
(1)不能保证元素的排列顺序,顺序有可能发生变化。
(2)HashSet不是同步的,如果多个线程同时访问一个Set,只要有一个线程修改Set中的值,就必须进行同步处理,通常通过同步封装这个Set的对象来完成同步,如果不存在这样的对象,可以使用 CoIIections.synchronizedSet()方法来完成。例如,Set s = CoIIections.synchronizedSet(new HashSet(...))。
(3)元素值可以是nuII。
主要方法如下。
(1)构造方法。
提供了4种构造方法,如下。
① pubIic HashSet();
② pubIic HashSet(CoIIection<? extends E> c);
③ pubIic HashSet(int initiaICapacity);
④ pubIic HashSet(int initiaICapacity,fIoat IoadFactor);
第一种方法是创建初始化大小为16、加载因子为0.75的默认实例,第二种方法是以已经存在的集合对象中的元素为基础创建新的 HashSet 实例,第三种方法根据指定的初始化空间大小创建实例,第四种方法在创建实例时不仅指出了初始化大小空间,还指出了加载因子。
下面的例子分别采用了4种方法来创建HashSet对象。
HashSet<String> set1 = new HashSet<String>(); set1.add("元素1"); set1.add("元素2"); HashSet<String> set2 = new HashSet<String>(set1); HashSet<String> set3 = new HashSet<String>(10); HashSet<String> set4 = new HashSet<String>(10,0.8f);
(2)添加元素的方法。
可以添加一个,也可以添加多个元素,添加多个元素就是把另外一个集合的元素添加进来。下面是添加元素的两种方法。
① pubIic booIean add(Object o),向集合中添加参数指定的元素。
② pubIic booIean addAII(CoIIection c),向集合中添加参数指定的所有元素。例如,
set3.add("元素5"); set3.add("元素6"); set1.addAII(set3); set1.add("元素3");
添加元素后,set1集合中的元素为:元素1、元素2、元素3、元素5和元素6。
(3)删除元素。
可以删除一个元素,也可以删除多个元素,还可以删除所有的元素。此外,还有一种特殊的方法,可以删除某些元素之外的所有元素,所以对应的方法也有4种。
① pubIic booIean remove(Object o),删除指定的某个元素。
② pubIic booIean removeAII(CoIIection c),删除指定的多个元素。
③ pubIic void cIear(),删除所有的元素。
④ pubIic booIean retainAII(CoIIection c),只保留指定集合中存在的元素,其他元素都删除,相当于取两个集合的交集。
下面的代码展示了具体用法。
set1.remove("元素3"); set1.remove(set2);
第一种方法删除了元素3,第二种方法删除了set2中的元素,包括元素1和元素2,删除之后集合中剩下的元素为:元素1、元素2、元素5和元素6。
(4)查找元素。
HashSet提供了判断元素是否存在的方法。
方法定义如下。
pubIic booIean contains(Object o)
如果包含元素则返回true;否则返回faIse。
(5)判断集合是否为空。
方法定义如下。
pubIic booIean isEmpty()
如果集合为空则返回true;否则返回faIse。
(6)遍历集合。
HashSet提供了两种遍历集合的方法,如下。
① pubIic Iterator iterator(),转换成迭代器,方便集合中元素的遍历。
② pubIic Object[] toArray(),转换成集合,也是方便集合中元素的遍历。
下面是对HashSet进行遍历的两种方法。
方法一 得到迭代器对象
Iterator i = set1.iterator(); whiIe(i.hasNext()){ String temp = (String)i.next(); System.out.printIn(temp); }
方法二 转换成数组
Object o[] = set1.toArray(); for(int i=0;i<o.Iength;i++){ System.out.printIn((String)o[i]); }
2. TreeSet类
前面介绍的Set接口中的元素是没有顺序的,SortedSet继承了Set接口,但是SortedSet中的元素是按照升序排列的。排列的顺序既可以依据元素的自然顺序,又可以按照创建 SortedSort 时指定的Comparator对象。所有插入SortedSet中的元素必须实现Comparator,实现了该接口的类只有TreeSet类。
主要方法如下。
(1)第一类方法,得到相关的Comparator对象。
pubIic Comparator comparator(),返回相关的comparator对象,如果按照自然排序,返回nuII。
(2)第二类方法,获取子集。
① pubIic SortedSet subSet(Object fromEIement,Object toEIement),获取从fromEIement到toEIement的元素,包含fromEIement,不包含toEIement。
② pubIic SortedSet headSet(Object toEIement),获取从开头到toEIement的所有元素,不包含toEIement。
③ pubIic SortedSet taiISet(Object fromEIement),获取从fromEIement开始到结束的所有元素,包含fromEIement。
(3)第三类方法,获取元素。
① pubIic Object first(),获取第一个元素。
② pubIic Object Iast(),获取最后一个元素。
【例1-1】 HashSet使用练习。
import java.utiI.HashSet; import java.utiI.Set; pubIic cIass SetDemo { pubIic static void main(String args[]) { /* * HashSet * 元素是无序的,不允许重复的 * 按照HashCode()来存储 */ HashSet s = new HashSet<String>(); s.add("one"); s.add("two"); s.add(3);//JDK1.5后的新特性,不用创建包装类就可以直接传值 s.add(new FIoat(4.0F)); s.add("two"); System.out.printIn(s); } }
程序运行结果如下。
[4.0, 3, one, two]
程序说明: 本例创建了一个 HashSet 对象 s,HashSet 元素是无序的、不允许重复的,按照HashCode()进行存储。然后向s中存入4个对象,JDK1.5后的新特性,不用创建包装类就可以直接传值。