`

认识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的学习历程.pdf

    在熟悉了Java内置的数据结构后,进一步研究Apache的Java Collections Framework实现,如Apache Commons Collections,可以加深对高级数据结构设计的认识。 总的来说,Java的学习是一个循序渐进的过程,从基础语言...

    Java学习书籍.pdf

    这两个框架的对比和研究能让你对Java的集合处理有更全面的认识。 总之,学习Java需要耐心和实践,通过阅读高质量的书籍和参考资料,结合实际编程练习,你可以逐渐掌握这门语言的精髓。《Thinking in Java》、《Core...

    数据结构与Java面向对象程序设计课程之间的有效衔接.pdf

    通过这种映射关系,可以在教学中将Java Collections框架的讲授与数据结构的知识体系相结合,从而加深学生对数据结构在Java编程中应用的认识。 文章强调,Java Collections框架的设计目的主要是满足高性能、一致性、...

    java反序列香草

    1. **不安全的反序列化库**:某些Java库(如Apache Commons Collections)在反序列化时没有足够的安全性检查,可能导致远程代码执行。攻击者可以通过构造恶意的序列化对象来触发这些库的漏洞。 2. **未验证的数据源...

    java评分管理系统

    Java的Collections框架提供了sort()方法,可以对List接口的实现类进行排序。根据需求,可以选择升序或降序排列,也可以自定义比较器进行复杂排序。排序后的数据会更新到视图上,通过JTable或者JList组件呈现给用户,...

    JAVA 基础教材 PDF

    1. **认识Java**:这一章通常会介绍Java的历史、特点、应用领域以及其与其他编程语言的对比。它还会解释Java平台,包括Java虚拟机(JVM)的概念,以及如何安装和配置Java开发环境。 2. **Java虚拟机简介**(第02章...

    Java开发详解.zip

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

    Java软件开发实战 Java基础与案例开发详解 2-7 java上机练习 共5页.pdf

    1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3...

    Java软件开发实战 Java基础与案例开发详解 3-10 java基础知识章节练习 共4页.pdf

    1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3...

    Java软件开发实战 Java基础与案例开发详解 9-5 java程序国际化的实现 共9页.pdf

    1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3...

    国家计算机二级JAVA考试大纲

    8. **了解Java的应用领域**:对Java在实际项目中的应用场景有一定的认识。 #### 考试内容详解 1. **Java语言的特点和实现机制**:深入探讨Java的跨平台性、内存管理机制、垃圾回收机制等。 2. **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基础与案例开发详解 11-8 练习题 共5页.pdf

    1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3...

    Java基础教程.md.pdf

    ##### 1.1 认识Java - **诞生时间**:1995年5月23日,Java语言由Sun Microsystems公司推出。 - **创始人**:James Gosling,通常被称为“Java之父”。 ##### 1.2 Java的发展史 - **起源**:Java最初被设计用于消费...

    Java软件开发实战 Java基础与案例开发详解 6-4 访问修饰符 共5页.pdf

    1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3...

    Java课件-张孝详

    14. **Java EE**:简述Java企业版,包括Servlet、JSP、Filter、Listener等Web开发技术,以及MVC设计模式和Spring框架的初步认识。 通过【Java课件_张孝详】中的内容,学习者可以系统性地学习Java编程,逐步提高编程...

    Java软件开发实战 Java基础与案例开发详解 4-6 数组和排序算法章节练习 共4页.pdf

    1-2 认识java语言 1-3 java平台的体系结构 1-4 java SE环境安装和配置 2-1 java程序简介 2-2 计算机中的程序 2-3 java程序 2-4 java类库组织结构和文档 2-5 java虚拟机简介 2-6 java的垃圾回收器 2-7 java上机练习 3...

    Java软件开发实战 Java基础与案例开发详解 10-9 练习题 共5页.pdf

    #### 1.2 认识Java语言 Java语言具有跨平台性(一次编写,到处运行)、面向对象、健壮性和安全性等特点。它的设计目标是让程序员能够更容易地开发出稳定可靠的软件系统。 #### 1.3 Java平台的体系结构 Java平台...

    AIC的Java课程1-6章

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

Global site tag (gtag.js) - Google Analytics