Collection
2025年4月4日大约 2 分钟
Collection
概述
Collection 是一个接口,是List、Set接口的父接口
list接口
特点: 有序、可重复、有索引
- ArrayList:有序;可重复;有索引
- LinkedList:有序;可重复;有索引
set接口
特点: 无序、不重复、无索引
- HashSet:无序;不重复;无索引
- LinkedHashSet:有序;不重复;无索引
- TreeSet:排序;不重复;无索引
常用方法
add(E e):添加元素remove(Object o):删除元素clear():清空集合中所有元素contains(Object o):判断集合中是否包含元素size():获取元素个数isEmpty():判断集合是否为空toArray():集合为转数组
遍历方式
方式 1:迭代器遍历
什么是迭代器
迭代器是用来遍历集合的专用方式,在java中迭代器代表是iterator
获取迭代器对象
| Collocation获取迭代器的方法 | 说明 |
|---|---|
Iterator<E> iterator() | 返回集合中的迭代器对象,迭代器默认指向第一个元素前 |
boolean hasNext():判断集合中是否还有元素E next():获取集合中的下一个元素
使用方法
集合变量.iterator()
...(前面有一个变量名为list的集合)
Iterator<String> iterator = list.iterator();
list.next(); // 取第一个元素
list.hasNext(); // 判断是否有下一个元素
while(iterator.hasNext()){ // 遍历整个迭代器
System.out.println(iterator.next());
}方式 2:增强for循环
使用方法
for(元素数据类型 变量名 : 数组变量或集合变量)
...(前面有一个变量名为list的集合或数组)
for(String str : list){
System.out.println(str);
}方式 3:Lambda表达式
使用Collection的forEach方法
| 方法名 | 说明 |
|---|---|
default void forEach(Consumer<? super T> action) | 结合lambda遍历集合 |
使用方法
集合变量.forEach(Consumer<? super E> action)
...(前面有一个变量名为list的集合)
list.forEach(s->{
System.out.println(s);
}); // 还可以简写为 list.forEach(System.out::println);三种遍历方法的区别
总结
- 单纯只遍历集合,三种遍历方法都可以
- 在遍历集合的过程中需要修改集合中的元素,最好使用 迭代器遍历 。虽然也可以使用for循环解决,但集合必须支持索引
并发修改问题
在遍历的过程中,如果对集合进行增删操作,会抛出ConcurrentModificationException异常;
解决方法
下面以删除操作为例,演示两种解决方法
- 使用迭代器遍历,在迭代器中修改集合中的元素
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("a");
list.add("c");
list.add("c");
// 使用迭代器遍历,在迭代器中修改集合中的元素
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()){
String s = iterator.next();
if(s.contains("a")){
iterator.remove();
}
}- 在集合有索引的情况下,使用for循环倒序遍历
注意
集合必须支持索引,才能使用for循环,解决并发修改问题
...(同上集合)
for(int i = list.size(); i >= 0; i--){
if(list.get(i).contains("a")){
list.remove(i);
}
}