Collection 接口是 Java 集合框架的根接口之一,它定义了所有单值集合(如 List
和 Set
)的通用行为。了解它的常用方法是学习集合的第一步。
1.Collection常用方法
以下是 Collection
接口中一些最常用且重要的方法,可以帮助你进行基本的集合操作:
1. 添加元素
boolean add(E e)
用于向集合中添加一个元素。如果集合因调用此方法而发生改变,则返回true
。需要注意的是,Set
集合会忽略重复的添加请求,并返回false
。boolean addAll(Collection<? extends E> c)
将指定集合中的所有元素都添加到当前集合中。如果集合因此调用而发生改变,则返回true
。
【特别注意】集合有一个特点:只能存放引用数据类型的数据,不能是基本数据类型
所以在集合中存储的元素往往会自动装箱(Autoboxing)。
2. 删除元素
boolean remove(Object o)
从集合中移除指定元素的单个实例(如果存在)。如果成功移除,则返回true
。boolean removeAll(Collection<?> c)
从集合中移除与指定集合中所有元素都相同的元素。简单来说,就是取两个集合的差集。如果集合因此调用而发生改变,则返回true
。boolean retainAll(Collection<?> c)
仅保留此集合中那些也包含在指定集合中的元素。这是一种取 交集 的操作。如果集合因此调用而发生改变,则返回true
。void clear()
移除集合中的所有元素,使其变为空集合。
3. 查询和判断
int size()
返回集合中元素的数量。boolean isEmpty()
如果集合不包含任何元素,则返回true
。boolean contains(Object o)
如果集合包含指定的元素,则返回true
。boolean containsAll(Collection<?> c)
如果集合包含指定集合中的所有元素,则返回true
。
4. 转换
Object[] toArray()
返回一个包含集合中所有元素的数组。返回的数组类型是Object[]
。E[] toArray(T[] a)
返回一个包含集合中所有元素的数组,并指定返回数组的类型。这是一个泛型方法,提供了更好的类型安全性。
5. 遍历
Iterator<E> iterator()
返回一个在此集合的元素上进行迭代的迭代器(Iterator
)。这是遍历集合最基础、最安全的方式。
迭代器模式
迭代器(Iterator)模式,也叫做游标(Cursor)模式。
在Java 容器中,为了提高容器遍历的方便性,利用迭代器把遍历逻辑从不同类型的集合类中抽取出来,从而避免向外部暴露集合容器的内部结构。
Java 提供了 Iterator
接口作为迭代器的基础接口。该接口定义了一组用于访问集合元素的方法,包括 hasNext
、next
和 remove
等。
1
2
3
4
5
6
7
8
9
10
11
12
13
// 迭代器
Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
System.out.println();
// 遍历:增强for循环
for (Object i : collection) {
System.out.print(i + " ");
}
System.out.println();
2.使用上的注意点
2.1集合判空的推荐方法-isEmpty
判断所有集合内部的元素是否为空,使用 isEmpty()
方法,而不是 size()==0
的方式。
这是因为 isEmpty()
方法的可读性更好,并且效率更高。
isEmpty()
时间复杂度为 O(1)
。集合的底层实现通常会维护一个 size
变量来记录元素的数量。每当添加或移除元素时,这个变量就会被更新。因此,size()
和 isEmpty()
方法都只需要直接返回这个变量的值,时间复杂度都是 O(1)。
size()
方法需要遍历整个链表,时间复杂度为O(n)
。(尽管在现代 Java 中,大多数集合的 size()
方法时间复杂度也为 O(1)
,但依然强烈建议使用 isEmpty()
)isEmpty()
方法的设计初衷就是为了这个特定的目的,它的语义比 size() == 0
更加精确和直接。
3.为什么集合只能存放引用数据类型?
这个限制源于 Java 集合框架的设计。集合框架(如 ArrayList
、HashSet
、HashMap
等)是为 面向对象编程 设计的。所有集合类都继承或实现了 Collection
、List
、Set
、Map
等接口,这些接口的方法都接受或返回 Object
类型,或者在泛型中使用类型参数(E
、K
、V
等)。
- 内存存储方式:Java 集合存储的是对象的 引用(内存地址),而不是对象本身。这意味着集合内部维护的是一个指向对象的指针列表。基本数据类型(如
int
、double
、boolean
)不是对象,它们直接存储在栈上或特定的内存区域,没有引用的概念。因此,集合不能直接存储它们。