Collection 层次结构中的根接口。Collection表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接实现:它提供更具体的子接口(如 Set 和 List)实现。此接口通常用来传递 collection,并在需要最大普遍性的地方操作这些 collection。

包 (bag) 或多集合(multiset)(可能包含重复元素的无序 collection)应该直接实现此接口。

所有通用的 Collection 实现类(通常通过它的一个子接口间接实现 Collection)应该提供两个“标准”构造方法:一个是 void(无参数)构造方法,用于创建空collection;另一个是带有 Collection 类型单参数的构造方法,用于创建一个具有与其参数相同元素新的 collection。实际上,后者允许用户复制任何 collection,以生成所需实现类型的一个等效 collection。尽管无法强制执行此约定(因为接口不能包含构造方法),但是 Java 平台库中所有通用的 Collection 实现都遵从它。

此接口中包含的“破坏性”方法,是指可修改其所操作的 collection 的那些方法,如果此 collection 不支持该操作,则指定这些方法抛出UnsupportedOperationException。如果是这样,那么在调用对该collection 无效时,这些方法可能,但并不一定抛出 UnsupportedOperationException。例如,如果要添加的 collection为空且不可修改,则对该 collection 调用 addAll(Collection) 方法时,可能但并不一定抛出异常。

一些 collection 实现对它们可能包含的元素有所限制。例如,某些实现禁止 null 元素,而某些实现则对元素的类型有限制。试图添加不合格的元素将抛出一个未经检查的异常,通常是 NullPointerException 或 ClassCastException。试图查询是否存在不合格的元素可能抛出一个异常,或者只是简单地返回 false;某些实现将表现出前一种行为,而某些实现则表现后一种。较为常见的是,试图对某个不合格的元素执行操作且该操作的完成不会导致将不合格的元素插入 collection 中,将可能抛出一个异常,也可能操作成功,这取决于实现本身。这样的异常在此接口的规范中标记为“可选”。

由每个 collection 来确定其自身的同步策略。在没有实现的强烈保证的情况下,调用由另一进程正在更改的 collection 的方法可能会出现不确定行为;这包括直接调用,将 collection 传递给可能执行调用的方法,以及使用现有迭代器检查 collection。

CollectionsFramework 接口中的很多方法是根据 equals 方法定义的。例如,contains(Object o) 方法的规范声明:“当且仅当此 collection 包含至少一个满足 (o==null ? e==null :o.equals(e)) 的元素 e 时,返回 true。”不 应将此规范理解为它暗指调用具有非空参数 o的 Collection.contains 方法会导致为任意的 e 元素调用 o.equals(e) 方法。可随意对各种实现执行优化,只要避免调用 equals 即可,例如,通过首先比较两个元素的哈希码。(Object.hashCode() 规范保证哈希码不相等的两个对象不会相等)。较为常见的是,各种 Collections Framework 接口的实现可随意利用底层 Object 方法的指定行为,而不管实现程序认为它是否合适。

方法列表如下:

boolean add(Ee)

确保此 collection 包含指定的元素(可选操作)。

boolean addAll(Collection<?extends E> c)

将指定 collection 中的所有元素都添加到此collection 中(可选操作)。

void clear()

移除此 collection 中的所有元素(可选操作)。

boolean contains(Objecto)

如果此 collection 包含指定的元素,则返回true。

boolean containsAll(Collection<?>c)

如果此 collection 包含指定collection 中的所有元素,则返回 true。

boolean equals(Objecto)

比较此 collection 与指定对象是否相等。

int hashCode()

返回此 collection 的哈希码值。

boolean isEmpty()

如果此 collection 不包含元素,则返回true。

Iterator<E> iterator()

返回在此 collection 的元素上进行迭代的迭代器。

boolean remove(Objecto)

从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。

boolean removeAll(Collection<?>c)

移除此 collection 中那些也包含在指定collection 中的所有元素(可选操作)。

boolean retainAll(Collection<?>c)

仅保留此 collection 中那些也包含在指定collection 的元素(可选操作)。

int size()

返回此 collection 中的元素数。

Object[] toArray()

返回包含此 collection 中所有元素的数组。

<T> T[] toArray(T[] a)

返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。

Collection接口包含了对集合执行基本操作的方法,如size(),isEmpty()等,还定义了一些批量操作的方法,比如containAll(),removeAll()等

需要注意的是,在一些不能包含重复值的Collection的子接口中(比如Set),使用add()方法添加元素时,如果该元素在集合中已经存在,并不会报错,而是返回false值,证明集合在该操作之后发生了变化

遍历集合有两种常用的方法,一个是使用for-each方法,一种是使用迭代器Iterator

下面结合代码实例来深入了解:

List <String> list = new ArrayList<String>();
         list.add("a");
         list.add("b");
         list.add("c");
         list.add("d");
         list.add("a");

         for(String str : list){
                System.out.println(str);
         }

         Set<String> set = new HashSet<String>(list);
         Iterator it = set.iterator();
         while(it.hasNext()){
                Stringstr = (String)it.next();
                System.out.println(str);
         }

List和Set均是Collection的子接口,而Collection接口继承了Iterable接口,继承了Iterable接口的类可以使用iterate()返回一个迭代器,for-each循环实际上就是使用iterate()方法返回的迭代器来对集合的元素进行迭代。除了Collection的子类,java中的数组也实现了Iterable接口,也可以使用for-each方法进行迭代

ArrayList我们使用for-each方法来遍历,而HashSet我们使用Iterator来遍历(当然反过来也是没问题的),需要注意的是,迭代器返回的是Object类型,需要进行类型转换,如果使用for-each迭代,在没有指定集合元素的类型下(Set s = new HashSet ()),程序会报错。

在构造HashSet的时候我们将list作为参数传入,但是由于Set接口不允许包含重复值,所以在set中实际上只会包含list中的前四个元素,第五个元素“a”是一个重复值,不会被再次插入到set中。Collection的子类都提供了两个构造方法,一种是无参的,构造一个空集合,一种是有参的,接受一个Collection,将之转换成符合自身规则的集合

在上面的例子中,我们使用List来引用集合而不是使用List接口的具体实现类,即

Set<String> set = new HashSet<String>(list)

而非

HashSet <String> set = new HashSet<String>(list)

这是一种良好的编程习惯,因为它赋予代码更强的弹性,假如我们现在想换成一个有序的集合,那么仅需要改变一下构造方法就行了

Set<String> set = new TreeSet<String>()

如果使用的是具体实现类引用,当我们替换一个集合容器时,可能还需要修改与之相关的一些列方法,这就违背了面向接口编程的原则

Collection的toArray()方法可以将一个集合转换成数组,数组存储的类型默认是Object类型,也可以使用泛型在运行时确定。数组的长度默认等于集合的元素总数

集合框架之Collection接口的更多相关文章

  1. Java集合框架之Collection接口

    Java是一门面向对象的语言,那么我们写程序的时候最经常操作的便是对象了,为此,Java提供了一些专门用来处理对象的类库,这些类库的集合我们称之为集合框架.Java集合工具包位于Java.util包下 ...

  2. Java学习--java中的集合框架、Collection接口、list接口

    与数组相比:1.数组的长度固定,而集合的长度可变2.数组只能通过下表访问元素,类型固定,而有的集合可以通过任意类型查找所映射的具体对象 java集合框架:collection(list序列,queue ...

  3. Java中集合框架,Collection接口、Set接口、List接口、Map接口,已经常用的它们的实现类,简单的JDK源码分析底层实现

    (一)集合框架: Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(实现接口的类).所有抽象出来的数据结构和操作(算法)统称为集合框架. 程序员在具体应用的时候,不必考虑数据结构和 ...

  4. Java基础之集合框架(Collection接口和List接口)

    首先我们说说集合有什么作用. 一.集合的作用 1.在类的内部,对数据进行组织: 2.简单而快速的搜索大数量的条目: 3.有的集合接口,提供一系列排列有序的元素,并且可以在序列中间快速的插入或者删除有关 ...

  5. Java学习关于集合框架的基础接口--Collection接口

     集合框架(Collection  Framework)是Java最强大的子系统之一,位于java.util 包中.集合框架是一个复杂的接口与和类层次,提供了管理对象组的最新技术.Java集合框架标准 ...

  6. 第19章 集合框架(3)-Map接口

    第19章 集合框架(3)-Map接口 1.Map接口概述 Map是一种映射关系,那么什么是映射关系呢? 映射的数学解释 设A,B是两个非空集合,如果存在一个法则,使得对A中的每一个元素a,按法则f,在 ...

  7. 第18章 集合框架(2)-Set接口

    第18章 集合框架(2)-Set接口 Set是Collection子接口,模拟了数学上的集的概念 Set集合存储特点 1.不允许元素重复 2.不会记录元素的先后添加顺序 Set只包含从Collecti ...

  8. java 集合框架(三)Collection

    一.概述 Collection是集合框架的根接口.不同的集合具有不同的特性,比如有的集合可以有重复元素,有的不可以,有的可以排序,有的不可排序,如此等等,而Collection作为集合的根接口,它规范 ...

  9. Java集合框架之四大接口、常用实现类

    Java集合框架 <Java集合框架的四大接口> Collection:存储无序的.不唯一的数据:其下有List和Set两大接口. List:存储有序的.不唯一的数据: Set:存储无序的 ...

随机推荐

  1. [SCOI 2016]美味

    Description 题库链接 给你一个长度为 \(n\) 的序列 \(A\) . \(m\) 组询问 \((b,x,l,r)\) 询问 \[\max_{i=l}^r b\oplus (A_i+x) ...

  2. [HNOI 2003]消防局的设立

    Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来 连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成 ...

  3. 【网络流】【BZOJ1070】【SCOI2007】修车

    原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1070 题意:问你如何分配老司机使得每部车的等待时间之和最短. 解题思路:本题不易正做,考虑 ...

  4. ●BOZJ 2229 [Zjoi2011]最小割

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2229 题解: 首先先去看看这个博客:http://blog.csdn.net/jyxjyx2 ...

  5. ●POJ 2125 Destroying The Graph

    题链: http://poj.org/problem?id=2125 题解: 最小割 + 输出割方案.建图:拆点,每个题拆为 i 和 i'分别表示其的入点和出点建立超源 S和超汇 T.S -> ...

  6. bzoj4517排列计数 错排+组合

    4517: [Sdoi2016]排列计数 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1491  Solved: 903[Submit][Statu ...

  7. 深入分析synchronized的实现原理

    基础概念 synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时可以保证共享变量对内存可见性. Java中每一个对象都可以作为锁,这是synchronize ...

  8. 谈谈如何选择合适的MySQL数据类型

    MySQL数据类型选择 一 .选择原则 更小的通常更好:一般情况下选择可以正确存储数据的最小数据类型.越小的数据类型通常更快,占用磁盘,内存和CPU缓存更小. 简单就好:简单的数据类型的操作通常需要更 ...

  9. IBM-x3650做RAID5更换硬盘后rebuild步骤分享

    1.按Ctrl+H进入WebBIOS配置 2.点击start 3.点击Drives,对slot5进行配置 4.选择slot5,选择Properties,点击Go按钮 5.选择MakeUnconfGoo ...

  10. Mysql优化--Show Profile

    Mysql 系列文章主页 =============== 是Mysql提供可以用来分析当前会话中语句执行的资源消耗情况.可以用于Sql的调优的测量.默认情况下处于关闭状态,并保存最近 15 次的运行结 ...