购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.3 Set接口及其实现类

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后的新特性,不用创建包装类就可以直接传值。 eJy+f5Mm/TmR5M+1oI5mmn6QYuLuBcMmqBVrpDuaOGZGLfPyRlMQVJANMIPpjelj

点击中间区域
呼出菜单
上一章
目录
下一章
×