Collection集合概述
是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素
JDK 不提供此接口的任何直接实现.它提供更具体的子接口(如Set和List)实现
创建Collection集合的对象
多态的方式
具体的实现类ArrayList
Collection集合常用方法
方法名 | 说明 |
---|---|
boolean add(E e) | 添加元素 |
boolean remove(Object o) | 从集合中移除指定的元素 |
boolean removeIf(Object o) | 根据条件进行移除 |
void clear() | 清空集合中的元素 |
boolean contains(Object o) | 判断集合中是否存在指定的元素 |
boolean isEmpty() | 判断集合是否为空 |
int size() | 集合的长度,也就是集合中元素的个数 |
迭代器,集合的专用遍历方式
Iterator
boolean hasNext()
: 检查是否还有下一个元素。
Object next()
: 返回下一个元素。
void remove()
: 删除迭代器最后一次返回的元素。
获取集合的迭代器对象。
使用hasNext()
方法检查是否还有下一个元素。
使用next()
方法获取下一个元素。
重复步骤2和3,直到没有更多元素。
- import java.util.ArrayList;
- import java.util.Iterator;
-
- public class IteratorExample {
- public static void main(String[] args) {
- // 创建一个ArrayList对象
- ArrayList
list = new ArrayList<>(); - list.add("元素1");
- list.add("元素2");
- list.add("元素3");
-
- // 获取迭代器
- Iterator
iterator = list.iterator(); -
- // 使用迭代器遍历ArrayList
- while (iterator.hasNext()) {
- String element = iterator.next();
- System.out.println(element);
- }
-
- // 尝试删除元素(可选)
- if (iterator.hasNext()) {
- iterator.next();
- iterator.remove(); // 删除最后一个访问的元素
- }
-
- // 再次遍历ArrayList,观察删除效果
- System.out.println("删除元素后:");
- iterator = list.iterator();
- while (iterator.hasNext()) {
- String element = iterator.next();
- System.out.println(element);
- }
- }
- }
迭代器遍历完毕,指针不会复位。
循环中只能用一次next方法,因为用两次next方法可能回导致指针越界。
next和hasnext方法要配套使用。
迭代器遍历时,不能用集合调用remove方式进行删除,要调用iterator中的方式进行删除。
它是JDK5之后出现的,其内部原理是一个Iterator迭代器
实现Iterable接口的类才可以使用迭代器和增强for
简化数组和Collection集合的遍历
for (元素类型 元素变量 : 集合或数组) { // 循环体}
例如,遍历一个ArrayList:
- aList
list = new ArrayList<>(); - list.add("Apple");list.add("Banana");list.add("Cherry");
- for (String fruit : list) {
- System.out.println(fruit);
- }
增强for循环只能用于遍历,不能用于添加或删除元素。在循环体内对集合进行修改(如add或remove)可能会引发ConcurrentModificationException
异常。
对于基本数据类型,如int、double等,需要在前面声明一个对应的包装类型变量,如Integer、Double等。
Lambda表达式是Java 8引入的一种新特性,主要用于表示匿名函数。在遍历集合时,常与Stream API
结合使用。基本语法如下:
集合.stream().forEach(元素 -> { // 对元素进行操作});
例如,遍历一个ArrayList并打印每个元素:
- public class A07_CollectionDemo7 {
- public static void main(String[] args) {
- /*
- lambda表达式遍历:
- default void forEach(Consumer super T> action):
- */
-
- //1.创建集合并添加元素
- Collection
coll = new ArrayList<>(); - coll.add("zhangsan");
- coll.add("lisi");
- coll.add("wangwu");
- //2.利用匿名内部类的形式
- //底层原理:
- //其实也会自己遍历集合,依次得到每一个元素
- //把得到的每一个元素,传递给下面的accept方法
- //s依次表示集合中的每一个数据
- /* coll.forEach(new Consumer
() { - @Override
- public void accept(String s) {
- System.out.println(s);
- }
- });*/
-
- //lambda表达式
- coll.forEach(s -> System.out.println(s));
- }
- }
Lambda表达式主要用于函数式编程,适用于对集合进行复杂操作,如过滤、映射、排序等。对于简单的遍历操作,增强for循环可能更加直观和高效。
Lambda表达式在遍历过程中同样不能修改集合,否则会引发异常。
Lambda表达式中的->
操作符左侧是参数列表,右侧是Lambda体。如果Lambda体只有一条语句,可以省略大括号和分号。
Lambda表达式可以引用外部变量,但这些变量必须是final或等效于final的(即未被修改过)。