一个集合表示一组对象。Collection接口被用来传递对象的集合,具有最强的通用性。例如,默认所有的集合实现都有一个构造器带有一个Collection类型参数。这个构造器被称作转换构造器,用指定集合的元素来初始化新集合,而不管指定集合实现的是哪个集合接口和实现类型。换句话说,这个构造器使得我们可以转化集合的类型(比如List到Set,Set到List)。
设想一下,假如你有一个Collection<String> c,它可能是一个List,也可能是一个Set,或者其他类型的Collection。按照上面的方法可以这样初始化一个ArrayList包含c中所有元素:
List<String> list = new ArrayList<String>();
下面是Collection接口实现:
public interface Collection<E> extends Iterable<E> {
// Basic operations
int size();
boolean isEmpty();
boolean contains(Object element);
// optional
boolean add(E element);
// optional
boolean remove(Object element);
Iterator<E> iterator();
// Bulk operations
boolean containsAll(Collection<?> c);
// optional
boolean addAll(Collection<? extends E> c);
// optional
boolean removeAll(Collection<?> c);
// optional
boolean retainAll(Collection<?> c);
// optional
void clear();
// Array operations
Object[] toArray();
<T> T[] toArray(T[] a);
}
这个接口做了我们期望一组对象能做的事情。这个接口通过size、isEmpty方法来告诉我们集合中还有多少元素。通过contains方法来判断给定元素是否在集合中。通过add、remove方法来添加或移除元素。并且提供iterator方法来迭代访问集合。
add方法足够泛化,使得它既支持允许重复元素的集合,又支持不允许重复元素的集合。它保证集合在调用add方法后将包含指定元素,并且返回true,如果集合在调用add之后改变了。类似地,remove方法用来从集合中移除指定元素,前提是集合包含这个元素,并且返回true如果调用remove方法之后集合改变了。
遍历集合
有两种方法遍历集合:
- for-each
- 迭代器访问
fo-each:
for-each访问如下:
for (Object o : collection)
System.out.println(o);
迭代器访问:
一个迭代器使得我们可以遍历集合并且可以有选择性地移除集合中的某些元素。我们可以通过调用集合的iterator方法来获得集合的迭代器。下面是Iterator接口:
public interface Iterator<E> {
boolean hasNext();
E next();
void remove(); //optional
}
hasNext方法指示集合中是否还有元素,next返回迭代中的下一个元素。remove方法移除next返回的元素。每调用一次next,最多只能调用一次remove,否则会抛出异常。比如下面代码遍历集合a,并且删除它的所有元素:
List<String> a = new ArrayList<String>();
a.add("hello");
a.add("world");
Iterator<String> iter = a.iterator();
while(iter.hasNext()) {
System.out.print(iter.next() + "\t");
iter.remove();
}
上面如果把iter.remove放到iter.next()之前,就会抛出java.lang.IllegalStateException异常。
注意Iterator.remove是遍历集合期间修改集合的唯一安全方法。如果在遍历集合期间用其他方法修改集合,会发生难以预料的事情。
使用迭代器而非for-each当你需要做下面的事情时: - 移除当前元素。for-each不是用来过滤集合中元素的好方法。应该用iterator来过滤集合中的元素,代码如下:
static void filter(Collection<?> c) {
for (Iterator<?> it = c.iterator(); it.hasNext(); )
if (!condition(it.next()))
it.remove();
}
这段简单的代码体现了多态,这意味着它可以支持所有的集合,而不管它的具体实现如何。这个例子也证明了利用Java集合框架编写多态算法是多么的简单。
集合接口批量操作
批量操作对整个集合进行某种操作。我们可以采用其他的基本操作实现对整个集合的操作,虽然那样做可能不够高效。下面是集合接口支持的批量操作:
- containsAll — 返回true,如果集合包含指定集合中的所有元素
- addAll — 将指定集合中的所有元素添加到目标集合中
- removeAll — 从目标集合中移除所有也在指定集合中存在的元素,即从目标集合中移除交集元素
- retainAll — 只保留目标集合和指定集合都含有的元素,即交集元素。如果执行retainALl操作后,目标集合被修改,则返回true。那么什么时候返回false呢?当目标集合含有的元素与指定集合完全一样时。
- clear - 清空目标集合中的所有元素。
上面几个方法返回true,当目标集合在执行这些方法之后被修改了。
举一个简单的例子来证明批量操作的威力,考虑下面的代码,它用来从集合中移除指定元素e:
c.removeAll(Collections.singleton(e));
再举一个更加特殊的例子,如果你想移除集合中的所有null元素:
c.removeAll(Collections.singleton(null));
这里使用了Collections.singleton,这是一个静态工厂方法,返回结果是一个只包含指定元素的不变Set。
集合接口的数组操作
toArray方法被用来沟通collections和旧API(期望一个数组作为输入)。数组操作使得集合被转换为数组。不带任何参数的toArray方法创建一个对象的新数组。更复杂的形式允许指定一个数组参数或者为返回结果选择一个运行时类型。
例如,设想c是一个Collection。下面的代码将c的内容填充到一个新开辟的对象数组中,这个数组的长度等于c的元素数目:
Object[] a = c.toArray();
又假设c只包含字符串,即Collection<String> c。那么下面的代码将返回一个字符串数组,数组的长度还是等于c的元素数目:
String[] a = c.toArray(new String[0]);
相关推荐
其中Collection接口是Java集合框架的基础接口之一,定义了一些基本的集合操作,包括添加元素、删除元素、遍历集合等。在这里,我将为您详细介绍Java集合框架中的Collection接口。 Collection接口是Java集合框架中的...
xmind格式的Java集合框架学习导图,包括Collection接口/Map接口以及具体实现类。 同样包含大厂面试题,也在导图中有所体现。 能学到什么: 更加成体系的知识框架,更加全面的、系统的知识。 思维导图: 思维导图具有...
所有抽象出来的数据结构和操作(算法)统称为Java集合框架(Java Collection Framework)。 Java程序员在具体应用时,不必考虑数据结构和算法实现细节,只需要用这些类创建出来一些对象,然后直接应用就可以了。这样...
1、可扩展性:Java集合框架提供了一组可扩展的接口和类,可让开发人员根据自己的需要实现新的数据结构和算法。 2、高性能:Java集合框架中的数据结构和算法经过优化,可以提供高效的性能。 3、类型安全:Java集合...
Java集合List集合Set集合Map集合Collection和collections工具类的框架图
计算机后端-Java-Java核心基础-第24章 集合01 04. 复习:Collection.avi
Java集合框架常见面试题 剖析⾯试最常⻅问题之 Java 集合框架 包含以下几个模块: 1、集合概述 2、Collection子接口之List 3、Collection子接口之Set 4、Map接口 5、Collection工具类 6、其他重要问题
java集合框架之Collection部分,包括List与Set的常用类,示例多,且皆有详细注释。
java泛型集合 java集合 集合 java Collection 排序 集合排序
学习Java集合框架的讲义、笔记,希望大家多提意见。时间关系没有Collections,Arrays的内容,以后补上!
Java集合框架中的Set接口是一种不允许包含重复元素的集合。Set接口继承自Collection接口,因此它具有Collection接口定义的所有方法。同时,Set接口还具有自己的特殊方法,例如:添加元素、删除元素、判断元素是否...
java集合框架总结 Collection体系结构 ArrayList源码解读 HashMap HashSet 深入讲解java集合框架
数据结构 和 Java集合框架
java.util包中定义了各种用于集合操作的类和接口,这些类和接口构成了Java语言的集合框架(Collection Framework)。 Java集合中可以放对象,不能存放基础数据类型数。 Collection Framework 根据不同类型的集合的特点...
Java集合框架汇总 1.集合框架结构图 1 2.两种特殊的Java容器类List和Set分析 2 3. Collection 接口: 2 4.Iterator 接口: 3 5.List接口: 3 5.1 LinkedList类: 5 5.2 ArrayList类: 5 6.Set接口: 5 7.Map...
Java集合框架中的List接口是一种有序的集合,它可以存储重复的元素。它是Collection接口的子接口,提供了一系列可以对列表进行操作的方法,如添加、插入、删除、获取元素等。List接口还可以通过索引访问元素,类似于...
8.javaCollection接口.zip8.javaCollection接口.zip8.javaCollection接口.zip8.javaCollection接口.zip8.javaCollection接口.zip8.javaCollection接口.zip8.javaCollection接口.zip8.javaCollection接口.zip8.java...
主要为大家详细介绍了Java集合框架之Collection接口,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Java里面最重要,最常用也就是集会一部分了。能够用好集合和理解好集合对于做Java程序的开发拥有无比的好处。本文详细解释了关于Java中的集合是如何实现的,以及他们的实现原理。
本文档先从整体介绍了Java集合框架包含的接口和类,然后总结了集合框架中的一些...Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些接口或实现类