概述

在 Java 中,集合/容器是指主要用途为存储其他元素的集合的类。
在 Java 中,集合分为三个主要群组:集 (Set)、列表 (List)、映射 (Map)。

想象扔在一起的一堆鞋子。这就是一个集。你可以向集中添加元素,也可以搜索或删除元素。需要注意的重要一点是,集元素没有特定的分配顺序。
Collection - 图1

同一堆鞋子沿着墙壁整齐地排列。现在就有顺序了。每个元素都有自己的编号。你可以简单地根据编号(索引)找到第 4 双鞋。这就是一个列表。
Collection - 图2

每个元素都有自己的唯一名称,用于处理该元素。每个元素的唯一名称通常称为‘键’。因此,映射是一组键-值对。键不必是字符串:它可以是任意类型。键为 Integer 的映射实际上是列表(有点区别)。

Collection - 图3

集合/容器在创建之后没有存储任何内容,但你可以将元素逐一添加到其中。添加元素后,它们的大小将发生动态变化。
使用 size() 方法查看集合大小

Java中的集合

Collection.png

Collection 接口API

声明

public interface Collection<E> extends Iterator<E>

实现类特点

  1. 实现类可以存放多个数据元素
  2. 有些实现类可以存放重复元素,有些类不可以
  3. 有些实现类可以按照顺序存放元素,有些类不可以
  4. 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之后的方法

image.png

image.png

遍历元素

迭代器

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() 从底层集合中删除此迭代器返回的最后一个元素(可选操作)。

执行原理
注意指针的位置:刚开始指向第一个元素前一位置
image.png

  1. Iterator iterator = coll.iterator(); //得到一个集合的迭代器
  2. //hasNext(): 判断是否有下一个元素
  3. while (iterator.hasNext()) {
  4. //next(): ①指针下移 ②返回当前指针指向的元素✨
  5. System.out.println(iterator.next());
  6. }

举个例子:

  1. public static void main(String[] args)
  2. {
  3. Set<String> set = new HashSet<String>();
  4. set.add("西班牙");
  5. set.add("的");
  6. set.add("雨");
  7. // 获取集的迭代器
  8. Iterator<String> iterator = set.iterator();
  9. while (iterator.hasNext()) // 检查是否存在另一个元素
  10. {
  11. // 获取当前元素并移至下一个
  12. String text = iterator.next();
  13. System.out.println(text);
  14. }
  15. //再次调用会报异常NoSuchElementException
  16. iterator.next();
  17. }

快捷键: itit

for each

简化版本的迭代器! JDK5之后出现
Java 有用于处理迭代器的简写符号。按照 whilefor 的模式,又添加了一个特殊声明:for each。也可以使用关键字 for 来表示。
for-each 语句只用于处理集合和容器。它隐式地使用迭代器,但我们只看到返回的元素。

🎈动态删除:使用迭代器而不是for each

  1. public static void main(String[] args)
  2. {
  3. Set<String> set = new HashSet<String>();
  4. set.add("西班牙");
  5. set.add("的");
  6. set.add("雨");
  7. for (String s : set) {
  8. System.out.println(s);
  9. }
  10. }

lambda表达式

_default void _forEach(_Consumer_<? _super _T> action)

  1. public static void main(String[] args)
  2. {
  3. Set<String> set = new HashSet<String>();
  4. set.add("西班牙");
  5. set.add("的");
  6. set.add("雨");
  7. set.forEach((o) -> System.out.println(o));
  8. set.forEach( o -> System.out::out);
  9. }