概述
在 Java 中,集合/容器是指主要用途为存储其他元素的集合的类。
在 Java 中,集合分为三个主要群组:集 (Set)、列表 (List)、映射 (Map)。
想象扔在一起的一堆鞋子。这就是一个集。你可以向集中添加元素,也可以搜索或删除元素。需要注意的重要一点是,集元素没有特定的分配顺序。
同一堆鞋子沿着墙壁整齐地排列。现在就有顺序了。每个元素都有自己的编号。你可以简单地根据编号(索引)找到第 4 双鞋。这就是一个列表。
每个元素都有自己的唯一名称,用于处理该元素。每个元素的唯一名称通常称为‘键’。因此,映射是一组键-值对。键不必是字符串:它可以是任意类型。键为 Integer 的映射实际上是列表(有点区别)。
集合/容器在创建之后没有存储任何内容,但你可以将元素逐一添加到其中。添加元素后,它们的大小将发生动态变化。
使用 size() 方法查看集合大小
Java中的集合
Collection 接口API
声明
public interface Collection<E> extends Iterator<E>
实现类特点
- 实现类可以存放多个数据元素
- 有些实现类可以存放重复元素,有些类不可以
- 有些实现类可以按照顺序存放元素,有些类不可以
- Collection接口没有直接的实现子类,是通过它的子接口Set和List来实现的。
常用方法
方法声明 | 作用 | 说明 |
---|---|---|
boolean add(E e); |
添加单个元素 | 添加成功返回true,失败返回false List一般能成功,而Set不能添加重复元素,可能会返回false |
boolean addAll(Collection<? extends E> c); |
添加多个元素 | 只要有一个元素被成功添加,返回true,否则返回false |
boolean remove(Object o); |
删除指定元素 | |
boolean addAll(Collection<? extends E> c); |
删除多个元素 | |
boolean contains(Object o); |
查找某个元素是否存在 | |
boolean containsAll(Collection<?> c); |
查找多个元素是否存在 | |
int size(); |
获取元素个数 | |
boolean isEmpty(); |
判断是否为空 | |
void clear(); |
清空 | |
Object[] toArray(); |
返回集合元素组成的数组 | |
<T> T[] toArray(T[] a); |
返回集合元素组成的指定类型的数组 | |
_Iterator_<E> iterator(); |
返回集合元素的迭代器 | |
_default void _forEach(_Consumer_<? _super _T> action) |
用action方法对集合中的每个元素进行操作 | JDK8之后的方法 |
遍历元素
迭代器
Iterator
对象称为迭代器。
Java使用名为迭代器的特殊对象来处理集合元素。迭代器主要用于遍历Collection集合中的元素,所有实现了Collection接口的集合类都有一个iterator()
方法( 因为Collection是Iterable
的子接口)用以返回一个实现了Iterator
接口的对象,即返回一个迭代器。
Iterator接口
boolean hasNext() |
如果迭代具有更多元素,则返回 true 。 |
|
---|---|---|
[E](../../java/util/Iterator.html) next() |
返回迭代中的下一个元素。 | [NoSuchElementException](../../java/util/NoSuchElementException.html) - 如果迭代没有更多的元素 |
default void remove() |
从底层集合中删除此迭代器返回的最后一个元素(可选操作)。 |
执行原理
注意指针的位置:刚开始指向第一个元素前一位置
Iterator iterator = coll.iterator(); //得到一个集合的迭代器
//hasNext(): 判断是否有下一个元素
while (iterator.hasNext()) {
//next(): ①指针下移 ②返回当前指针指向的元素✨
System.out.println(iterator.next());
}
举个例子:
public static void main(String[] args)
{
Set<String> set = new HashSet<String>();
set.add("西班牙");
set.add("的");
set.add("雨");
// 获取集的迭代器
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) // 检查是否存在另一个元素
{
// 获取当前元素并移至下一个
String text = iterator.next();
System.out.println(text);
}
//再次调用会报异常NoSuchElementException
iterator.next();
}
for each
简化版本的迭代器! JDK5之后出现
Java 有用于处理迭代器的简写符号。按照 while 和 for 的模式,又添加了一个特殊声明:for each。也可以使用关键字 for 来表示。
for-each 语句只用于处理集合和容器。它隐式地使用迭代器,但我们只看到返回的元素。
🎈动态删除:使用迭代器而不是for each
public static void main(String[] args)
{
Set<String> set = new HashSet<String>();
set.add("西班牙");
set.add("的");
set.add("雨");
for (String s : set) {
System.out.println(s);
}
}
lambda表达式
_default void _forEach(_Consumer_<? _super _T> action)
public static void main(String[] args)
{
Set<String> set = new HashSet<String>();
set.add("西班牙");
set.add("的");
set.add("雨");
set.forEach((o) -> System.out.println(o));
set.forEach( o -> System.out::out);
}