java 集合之Collection接口 方法 集合遍历
-
集合层次结构中的根接口。 一个集合代表一组对象,称为它的元素。 一些集合允许重复元素,而另一些则不允许。 有些是有序的,有些是无序的。 JDK 不提供此接口的任何直接实现:它提供了更具体的子接口(如 Set 和 List)的实现。 此接口通常用于传递集合并在需要最大通用性的地方操作它们。
-
Bags 或 multisets(可能包含重复元素的无序集合)应该直接实现这个接口。
-
所有通用 Collection 实现类(通常通过其子接口之一间接实现 Collection)应该提供两个“标准”构造函数:
- 一个 void(无参数)构造函数,它创建一个空集合
- 一个具有单个参数类型的构造函数集合,它创建一个具有与其参数相同的元素的新集合。
- 实际上,后一个构造函数允许用户复制任何集合,生成所需实现类型的等效集合。 没有办法强制执行此约定(因为接口不能包含构造函数),但 Java 平台库中的所有通用 Collection 实现都符合。
-
某些方法被指定为可选的。 如果集合实现没有实现特定的操作,它应该定义相应的方法来抛出 UnsupportedOperationException。 这些方法在集合接口的方法规范中被标记为“可选操作”。
-
一些 collection 实现对它们可能包含的元素有所限制。例如,某些实现禁止 null 元素,而某些实现则对元素的类型有限制。
- 尝试添加不合格的元素会引发未经检查的异常,通常为 NullPointerException 或 ClassCastException。
- 尝试查询不合格元素的存在可能会引发异常,或者可能只是返回 false;
- 较为常见的是,尝试对不合格元素执行操作,其完成不会导致将不合格元素插入到集合中,这可能会引发异常,或者可能会成功,具体取决于实现的选择。 在此接口的规范中,此类异常被标记为“可选”。
-
由每个集合来确定自己的同步策略。 在没有更强大的实现保证的情况下,未定义的行为可能是由于在另一个线程正在改变的集合上调用任何方法; 这包括直接调用、将集合传递给可能执行调用的方法以及使用现有迭代器检查集合。
-
Collections Framework 接口中的许多方法都是根据 equals 方法定义的。
- 例如, contains(Object o) 方法的规范说:“当且仅当此集合包含至少一个元素 e 使得
(o==null ? e==null : o.equals(e))
(当o为null时,集合存在null;o非null时,集合中存在与o相等的元素)时才返回 true 。” - 本规范不应被解释为暗示使用非空参数 o 调用 Collection.contains 将导致为任何元素 e 调用
o.equals(e)
。 实现可以自由地实现优化,从而避免 equals 调用,例如,通过首先比较两个元素的哈希码(Object.hashCode()
规范保证哈希码不相等的两个对象不能相等)。更一般地说,只要实现者认为合适,各种集合框架接口的实现可以自由地利用底层对象方法的指定行为。
- 例如, contains(Object o) 方法的规范说:“当且仅当此集合包含至少一个元素 e 使得
-
一些对集合执行递归遍历的集合操作可能会失败,但对于自引用实例(其中集合直接或间接包含自身)除外。 这包括 clone()、equals()、hashCode() 和 toString() 方法。 实现可以选择性地处理自引用场景,但是大多数当前的实现都没有这样做。
-
集合只能存放引用数据类型的数据,不能是基本数据类型
方法
Modifier and Type | Method | Description |
---|---|---|
boolean |
add(E e) |
确保此集合包含指定的元素(可选操作)。 |
boolean |
addAll(Collection<? extends E> c) |
将指定集合中的所有元素添加到此集合(可选操作)。 |
void |
clear() |
从此集合中删除所有元素(可选操作)。 |
boolean |
contains(Object o) |
如果此集合包含指定的元素,则返回 true 。 |
boolean |
containsAll(Collection<?> c) |
如果此 collection 包含指定集合c中的所有元素,则返回 true。 |
boolean |
equals(Object o) |
比较此 collection 与指定对象是否相等。 |
int |
hashCode() |
返回此集合的哈希码值。 |
boolean |
isEmpty() |
如果此集合不包含元素,则返回 true 。 |
Iterator<E> |
iterator() |
返回在此 collection 的元素上进行迭代的迭代器。 |
default Stream<E> |
parallelStream() |
返回可能并行的 Stream 与此集合作为其来源。 |
boolean |
remove(Object o) |
从此 collection 中移除指定元素的单个实例,如果存在的话(可选操作)。 |
boolean |
removeAll(Collection<?> c) |
移除此 collection 中那些也包含在指定集合c中的所有元素(可选操作)。 |
default boolean |
removeIf(Predicate<? super E> filter) |
删除满足给定谓词的此集合的所有元素。 |
boolean |
retainAll(Collection<?> c) |
仅保留此 collection 中那些也包含在指定集合c的元素(可选操作)。 |
int |
size() |
返回此 collection 中的元素数。 |
default Spliterator<E> |
spliterator() |
创建一个Spliterator 在这个集合中的元素。 |
default Stream<E> |
stream() |
返回以此集合作为源的顺序 Stream 。 |
Object[] |
toArray() |
返回包含此 collection 中所有元素的数组。 |
<T> T[] |
toArray(T[] a) |
返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。 |
常用方法
增加
-
boolean add(E e)
确保此 collection 包含指定的元素(可选操作)。添加元素。- e - 确定此 collection 中是否存在的元素。
- 如果此 collection 由于调用而发生更改,则返回 true。(如果此 collection 不允许有重复元素,并且已经包含了指定的元素,则返回 false。)
- 支持此操作的 collection 可以限制哪些元素能添加到此 collection 中来。
- 一些 collection 拒绝添加 null 元素,其他一些 collection 将对可以添加的元素类型强加限制。Collection 类应该在其文档中清楚地指定能添加哪些元素方面的所有限制。
- 如果 collection 由于某些原因(已经包含该元素的原因除外)拒绝添加特定的元素,那么它必须 抛出一个异常(而不是返回 false)。这确保了在此调用返回后,collection 总是包含指定的元素。
-
boolean addAll(Collection<? extends E> c)
将指定集合c中的所有元素都添加到此 collection 中(可选操作)。- 如果在进行此操作的同时修改指定的 collection,那么此操作行为是不确定的。(这意味着如果指定的 collection 是此 collection,并且此 collection 为非空,那么此调用的行为是不确定的。)
//创建对象:接口不能创建对象,利用实现类创建对象:
Collection col = new ArrayList();
//集合只能存放引用数据类型的数据,不能是基本数据类型,但基本数据类型会自动装箱,对应包装类。int--->Integer
col.add(1);//添加元素
col.add(2);
col.add(3);
System.out.println(col);//[1, 2, 3]
List list = Arrays.asList(new Integer[]{
4,5,6});
col.addAll(list);//将另一个集合添加入col中
System.out.println(col);//[1, 2, 3, 4, 5, 6]
删除
-
void clear()
移除此 collection 中的所有元素(可选操作)。- 此方法返回后,除非抛出一个异常。 如果此 collection 不支持 clear 操作抛出UnsupportedOperationException
-
boolean remove(Object o)
如果存在的话,从此 collection 中移除指定元素的单个实例(可选操作)。- 如果此 collection 包含指定的元素o(或者此 collection 由于调用而发生更改),则返回 true 。
- 更确切地讲,如果此 collection 包含一个或多个满足
(o==null ? e==null : o.equals(e))
的元素 e(当o为null时,集合存在null;o非null时,集合中存在与o相等的元素),则移除这样的元素。
col//[1, 2, 3, 4, 5, 6]
col.remove(6) //true
col //[1, 2, 3, 4, 5]
col.clear()//清空集合
col //[]
查看
-
Iterator<E> iterator()
返回在此 collection 的元素上进行迭代的迭代器。- 关于元素返回的顺序没有任何保证(除非此 collection 是某个能提供保证顺序的类实例)。
- Specified by: 接口 Iterable 中的 iterator
-
int size()
返回此 collection 中的元素数。- 如果此 collection 包含的元素大于 Integer.MAX_VALUE,则返回 Integer.MAX_VALUE。
集合遍历方法
public class IterColl {
public static void main(String[] args) {
Collection col = new ArrayList();
col.add(6);
col.add(true);
col.add(9.8);
col.add("abc");
System.out.println("集合中元素的数量为:"+col.size()); //4
//集合遍历(查看集合中元素)
//方式1:普通for循环
/*for(int i= 0;i<col.size();i++){
col.//无索引,无法获取元素
}*/
//方式2:增强for循环
for(Object o:col){
System.out.print(o + "\t"); //6 true 9.8 abc
}
System.out.println("\n------iterator------");
//方式3:iterator()
Iterator it = col.iterator();
while(it.hasNext()){
System.out.print(it.next() + "\t"); //6 true 9.8 abc
}
}
}
判断
-
boolean contains(Object o)
如果此 collection 包含指定的元素,则返回 true。- 更确切地讲,当且仅当此 collection 至少包含一个满足
(o==null ? e==null : o.equals(e))
(当o为null时,集合存在null;o非null时,集合中存在与o相等的元素)的元素 e 时,返回 true。
- 更确切地讲,当且仅当此 collection 至少包含一个满足
-
boolean equals(Object o)
比较此 collection 与指定对象是否相等。- 当 Collection 接口没有对 Object.equals 的常规协定添加任何约定时,“直接”实现该 Collection 接口(换句话说,创建一个 Collection,但它不是 Set 或 List 的类)的程序员选择重写 Object.equals 方法时必须小心。
- 没必要这样做,最简单的方案是依靠 Object 的实现,然而实现者可能希望实现“值比较”,而不是默认的“引用比较”。(List 和 Set 接口要求进行这样的值比较。)
- Object.equals 方法的常规协定声称相等必须是对称的(换句话说,当且仅当存在 b.equals(a) 时,才存在 a.equals(b))。List.equals 和 Set.equals 的协定声称List只能与List相等,set 只能与 set 相等。因此,对于一个既不实现 List 又不实现 Set 接口的 collection 类,当将此 collection 与任何列表或 set 进行比较时,常规的 equals 方法必须返回 false。(按照相同的逻辑,不可能编写一个同时正确实现 Set 和 List 接口的类。)
-
boolean isEmpty()
如果此 collection 不包含元素,则返回 true。
Collection col2 = new ArrayList(Arrays.asList(1, 2, 3));
"集合中元素的数量为:"+col2.size() //3
"集合是否为空:"+col2.isEmpty() //false
"是否包含元素:"+col2.contains(3) //true
Collection col3 = new ArrayList(Arrays.asList(1, 2, 3));
col2.equals(col3) //true
col2==col3 //false地址一定不相等