`

认识Java Collections (三)

阅读更多
Set Interface

除了不能添加重复元素外,set也添加了一些强约束,在执行equals和hashCode方法,这使得集合可以进行有意义的比较操作,即使他们的实现类型不同。
一个Set接口的声明如下:
public interface Set<E> extends Collection<E> {
    // Basic operations
    int size();
    boolean isEmpty();
    boolean contains(Object element);
    boolean add(E element);         //optional
    boolean remove(Object element); //optional
    Iterator<E> iterator();

    // Bulk operations
    boolean containsAll(Collection<?> c);
    boolean addAll(Collection<? extends E> c); //optional
    boolean removeAll(Collection<?> c);        //optional
    boolean retainAll(Collection<?> c);        //optional
    void clear();                              //optional

    // Array Operations
    Object[] toArray();
    <T> T[] toArray(T[] a);
}



Java平台包含3个通用的set实现:HashSet,TreeSet和LinkedHashSet。HashSet将元素存储在一张hash表中,一般来说,这是set的最优实现。但是它并不关心数据的存储顺序。
TreeSet将元素存储在一棵红黑树中,数据的顺序按照元素的值排列。总体上说,它的性能略低于HashSet。LinkedHashSet使用一个linked list贯穿整个set,并且按照插入顺序排列,由于要处理HashSet的无序性,所以要花费稍微高一些的代价。

以下是一些简单但是很实用的有关set的习惯用法。
假设你有一个结合c,你想创建另一个集合,包含c中的全部元素,并移除所有重复元素,下面的一行代码可以展示这个技巧:
Collection<Type> noDups = new HashSet<Type>(c);

以下是一个小小的变种,它将保留原集合的元素顺序:
Collection<Type> noDups = new LinkedHashSet<Type>(c);

下面是一个泛型方法,它包装了上一行代码:
public static <E> Set<E> removeDups(Collection<E> c) {
    return new LinkedHashSet<E>(c);
}



2.Set 的基本操作
size()方法返回set的元素数量(也称作set的基)。isEmpty的功能正如其名字描述的那样。而add方法则会在添加时检查待添加元素是否已经存在于集合中。
下面的程序示例将演示Set的基本用法,该程序将统计程序参数字符串中的重复单词,并生成一个包含非重复单词的集合
import java.util.*;

public class FindDups {
    public static void main(String[] args) {
        Set<String> s = new HashSet<String>();
        for (String a : args)
            if (!s.add(a))
                System.out.println("Duplicate detected: " + a);

        System.out.println(s.size() + " distinct words: " + s);
    }
}

现在运行程序:
java FindDups i came i saw i left
得到输出结果:
Duplicate detected: i
Duplicate detected: i
4 distinct words: [i, left, saw, came]

注意:
在上面的代码中,我们使用接口类型(Set)而不是实现类型(HashSet)来引用我们的HashSet实例。这是一种强烈推荐的编程习惯,这样做可以给予程序更多的柔韧性,因为你可以通过仅仅更改构造器来将程序的实现更改。(比如你可以很容易的做出一个ArrayList版本的例子,仅仅需要改变以下构造器即可)。
此外,程序是否可以成功运行也得不到保证。因为程序使用了一个在早期版本中编写的非标准操作方法,而在新的版本中此方法并没有被实现,那么程序就会失败。使用接口来引用实例,可以使你不会使用非标准方法。

3. Bulk Operations
这里,假设有两个set s1与s2
s1.containsAll(s2) s2是否为s1子集
s1.addAll(s2)  s1与s2的并集
s1.removeAll(s2)  将s1中也属于s2的元素去掉
s1.retainAll(s2)  s1与s2的交集

如果希望在不破坏原有集合的基础上进行以上操作,需要对目标集合进行以此copy,下面是常用的代码:
Set<Type> union = new HashSet<Type>(s1);
union.addAll(s2);

Set<Type> intersection = new HashSet<Type>(s1);
intersection.retainAll(s2);

Set<Type> difference = new HashSet<Type>(s1);
difference.removeAll(s2);


4.数组操作
与Collection的数组操作一致

(to be continued...)
分享到:
评论

相关推荐

    Java开发详解.zip

    031314_【第13章:Java类集】_集合工具类:Collections笔记.pdf 031315_【第13章:Java类集】_Stack类笔记.pdf 031316_【第13章:Java类集】_属性类:Properties笔记.pdf 031317_〖第13章:Java类集〗_范例讲解:一...

    java基础案例与开发详解案例源码全

    1.2 认识Java语言3 1.2.1 Java语言特性3 1.2.2 JavaApplet4 1.2.3 丰富的类库4 1.2.4 Java的竞争对手5 1.2.5 Java在应用领域的优势7 1.3 Java平台的体系结构7 1.3.1 JavaSE标准版8 1.3.2 JavaEE企业版10 1.3.3 Java...

    JAVA面试题最全集

    对于java流的认识 28.简单描述一下awt与swing区别。 29.简述java编程中事件处理模式。 30.你编写过applet吗?applet的安全权限如何?试列举java application或者applet中与servlet/jsp通信可以采用的方式。 31...

    AIC的Java课程1-6章

     课程目标  认识Java平台,了解java application和applet的开发,激发学员对Java编程语言的兴趣。  学习和掌握Java变量,运算符,控制结构,数组,方法等基本语法。  培养和建立面向对象编程...

    java面试题

    Hibernate数据库标识与主键之间的认识? 答:标识是为了方便和简介映射文件,主键是为了让数据不会重复。 为什么每次请求都要创建一个Action对象? 答:Struts2每次请求的时候都会创建一个action实例,这样会保证...

    Webwork.in.Action.中文版 part1/3

    我们希望读者对Java及常用的Java API(如Java Collections API)有基本的认识。由于WebWork的内容几乎都与Web相关,那么读者必须对HTML、JavaScript及CSS具有基本程度的认识。而实际上不管是开发新手还是富有经验的...

    Webwork.in.Action.中文版.part2/3

    我们希望读者对Java及常用的Java API(如Java Collections API)有基本的认识。由于WebWork的内容几乎都与Web相关,那么读者必须对HTML、JavaScript及CSS具有基本程度的认识。而实际上不管是开发新手还是富有经验的...

    Webwork.in.Action.中文版.part3/3

    我们希望读者对Java及常用的Java API(如Java Collections API)有基本的认识。由于WebWork的内容几乎都与Web相关,那么读者必须对HTML、JavaScript及CSS具有基本程度的认识。而实际上不管是开发新手还是富有经验的...

    面向对象技术与UML课件及源代码-by 南邮-陈杨

    1.1认识Java 1.1.1认识编程语言 1.1.2Java的来历 1.1.3Java为什么流行 1.1.4Java的三个版本 1.1.5编程前的准备工作 1.2安装JDK 1.2.1获取JDK 1.2.2安装JDK步骤 1.2.3安装目录介绍 1.2.4环境变量设置 1.3...

    asp.net知识库

    深入剖析ASP.NET组件设计]一书第三章关于ASP.NET运行原理讲述的补白 asp.net 运行机制初探(httpModule加载) 利用反射来查看对象中的私有变量 关于反射中创建类型实例的两种方法 ASP.Net应用程序的多进程模型 NET委托...

Global site tag (gtag.js) - Google Analytics