目录
[2.2 Collection的遍历方式](#2.2 Collection的遍历方式)
[2.2.1 方式1 迭代器遍历](#2.2.1 方式1 迭代器遍历)
[2.2.2 方法2 增强for循环](#2.2.2 方法2 增强for循环)
[2.2.3 方法3 Lambda表达式](#2.2.3 方法3 Lambda表达式)
[2.2.4 Collection三种遍历方式的区别](#2.2.4 Collection三种遍历方式的区别)
1、认识集合框架
- 集合是一种容器,用来装数据的。类似与数组,但集合的大小可变,开发中也非常常用
集合体系归类

集合系列结构

代码1:整体认识一下集合体系结构
java
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class CollectionDemo2 {
public static void main(String[] args) {
//List系列集合:添加的元素是有序的,可重复,有索引
List<String> list = new ArrayList<>();
list.add("hello");
list.add("world");
list.add("java");
list.add("world");
list.add("world");
System.out.println("有序的,可重复->: " + list);
System.out.println("通过get方法,索引->: " + list.get(0));
System.out.println("set系列");
//HashSet 无序,不可重复,无索引
Set<String> set = new HashSet();
set.add("hello");
set.add("world");
set.add("java");
set.add("world");
System.out.println("无序,不可重复->: " + set);
}
}
2、Collection集合
2.1、Collection的常用功能
为什么要先学Collection呢?
- Collection是单例集合的祖宗**接口,,**它规定的方法(功能)是全部单例集合都会继承的。所以学习完Collection功能其他下面子类的一些功能也就会用了。


代码2:测试上面Collection通用功能
java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection; //Collection 单例类的祖宗接口
public class CollectionDemo3 {
public static void main(String[] args) {
//认识Collection的通用功能
Collection<String> list = new ArrayList(); //接口 的实例化
//把给定的元素添加到相应的集合
System.out.println("_________________添加元素_________________");
list.add("hello");
list.add("world");
list.add("java");
System.out.println(list);
System.out.println("_________________删除元素_________________");
list.remove("world"); //删除指定元素
System.out.println(list);
System.out.println("_________判断集合中是否有指定的对象__________");
System.out.println(list.contains("hello"));
System.out.println(list.contains("world"));
System.out.println("______________判断集合是否为空______________");
System.out.println(list.isEmpty());
System.out.println("_______________返回集合的大小_______________");
System.out.println(list.size());
System.out.println("________________清空集合___________________");
list.clear();
System.out.println(list);
System.out.println("_____________把集合中的元素存储到数组_________");
list.add("hello");
list.add("world");
list.add("java");
String [] arr = list.toArray(new String[0]); //这里是JDK1.8下
System.out.println(Arrays.toString(arr)); //输出数组
}
}
/*
_________________添加元素_________________
[hello, world, java]
_________________删除元素_________________
[hello, java]
_________判断集合中是否有指定的对象__________
true
false
______________判断集合是否为空______________
false
_______________返回集合的大小_______________
2
________________清空集合___________________
[]
_____________把集合中的元素存储到数组_________
[hello, world, java]
/
2.2 Collection的遍历方式
2.2.1 方式1 迭代器遍历
迭代器是用来遍历集合的专用方式(数组没有迭代器),在Java中迭代器代表是Iterator。
包路径 :
java.util.Iterator作用 :用于遍历
Collection类型的集合(如List、Set、Queue等)。特点 :
- 只能单向遍历(从前到后)。
- 支持在遍历过程中安全删除元素。
- 避免
ConcurrentModificationException(如果使用正确)。
Iterator迭代器
Collection集合获取迭代器的方法
| 方法名称 | 说明 |
| Iterator<E> iterator() | 返回集合的迭代器对象,该迭代器对象默认指向当前集合的第一个元素 |
|---|
Iterator迭代器中的常用方法
| 方法 | 返回类型 | 说明 |
| hasNext() | boolean | 询问当前位置是否有元素存在,存在返回true,不存在返回false |
| next() | E | 获取当前位置的元素,并同时将迭代器对象执向下一个元素处。 |
| remove() | void | 可选操作 。从底层集合中移除 next() 方法返回的最后一个元素。此方法只能在每次调用 next() 之后调用一次。如果在没有调用 next() 的情况下调用,或者连续调用两次 remove(),会抛出 IllegalStateException。 |
remove() |
void |
可选操作 。从底层集合中移除 next() 方法返回的最后一个元素。此方法只能在每次调用 next() 之后调用一次。如果在没有调用 next() 的情况下调用,或者连续调用两次 remove(),会抛出 IllegalStateException。 |
|---|
代码3:迭代器遍历演示
java
import java.util.ArrayList;
import java.util.Iterator;
public class CollectionIteratorDemo4 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("hello");
list.add("world");
list.add("java");
list.add("kk");
Iterator< String> it = list.iterator();
while(it.hasNext()){
System.out.printf(it.next() + " ");
}
System.out.println();
}
}
/*
hello world java kk
*/
2.2.2 方法2 增强for循环

代码4:增强for遍历演示
java
import java.util.ArrayList;
public class CollectionForMaxDemo5 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
for (int i: list){
System.out.printf("%d ", i);
}
System.out.println();
}
}
/*
1 2 3 4
*/
2.2.3 方法3 Lambda表达式

代码5:forEach遍历演示
java
import java.util.ArrayList;
import java.util.function.Consumer;
public class CollectionLambdaDemo6 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("hello");
list.add("world");
list.add("java");
list.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
//Lambda简化
list.forEach(s-> System.out.println(s));
//方法引用
list.forEach(System.out::println);
}
}
/*
hello
world
java
hello
world
java
hello
world
java
*/
2.2.4 Collection三种遍历方式的区别
认识并发修改异常问题
- 遍历集合的同时又存在增删集合元素的行为时可能出现业务异常,这种现象被称之为并发修改异常问题。

代码6:区别3中种遍历
java
import java.util.ArrayList;
import java.util.*;
public class CollectionTest7 {
public static void main(String[] args) {
//搞清楚并发修改异常问题
ArrayList<String> list = new ArrayList<>();
list.add("Java");
list.add("宁夏枸杞");
list.add("黑枸杞");
list.add("枸杞子");
list.add("红枸杞");
list.add("枸杞");
list.add("C++");
// System.out.println(list);
//
//
// for(int i = 0;i < list.size();i++){
// String s = list.get(i);
// if(s.contains("枸杞")){
// list.remove(s);
// }
// }
// System.out.println( list); //发现并不满足要求 [Java, 黑枸杞, 红枸杞, C++]
/*
解决方案一:前提支持索引
删除集合中包含枸杞的元素,倒着遍历能够解决修改异常问题
*/
ArrayList<String> list2 = new ArrayList<>();
list2.add("Java");
list2.add("宁夏枸杞");
list2.add("黑枸杞");
list2.add("枸杞子");
list2.add("红枸杞");
list2.add("枸杞");
list2.add("C++");
System.out.println("===================================");
for(int i = list2.size() - 1;i >= 0;i--){
String s = list2.get(i);
if(s.contains("枸杞")){
list2.remove(s);
}
}
System.out.println( list2);
System.out.println("===================================");
/*
解决方案二:i--;前提支持索引
*/
ArrayList<String> list3 = new ArrayList<>();
list3.add("Java");
list3.add("宁夏枸杞");
list3.add("黑枸杞");
list3.add("枸杞子");
list3.add("红枸杞");
list3.add("枸杞");
list3.add("C++");
for(int i = 0; i< list3.size();i++){
if(list3.get(i).contains("枸杞")){
list3.remove(i);
i--;
}
}
System.out.println( list3);
System.out.println("==============使用迭代器=============");
/*
当集合没有索引的使用
方案1:使用迭代器,迭代器遍历并删除也会存在并发修改异常问题
可以解决:使用迭代器自己的remove()方法
*/
ArrayList<String> list4 = new ArrayList<>();
list4.add("Java");
list4.add("宁夏枸杞");
list4.add("黑枸杞");
list4.add("枸杞子");
list4.add("红枸杞");
list4.add("枸杞");
list4.add("C++");
Iterator< String> it = list4.iterator();
while(it.hasNext()){
String s = it.next();
if(s.contains("枸杞")){
it.remove(); //注意:这里的remove()方法是迭代器的方法,不是集合的remove()方法
}
}
System.out.println( list4);
System.out.println("===================================");
/*
使用for 和 Lambda当没有索引的时候,删除集合中包含枸杞的元素
不能解决:并发修改异常问题
*/
ArrayList<String> list5 = new ArrayList<>();
list5.add("Java");
list5.add("宁夏枸杞");
list5.add("黑枸杞");
list5.add("人字拖");
list5.add("枸杞子");
list5.add("红枸杞");
list5.add("枸杞");
list5.add("C++");
// for(String s : list5){
// if(s.contains("枸杞")){
// list5.remove(s);
// }
// }
// list5.forEach(s->{
// if(s.contains("枸杞")){
// list5.remove(s);
// }
// });
// System.out.println( list5);
}
}
/*
===================================
[Java, C++]
===================================
[Java, C++]
==============使用迭代器=============
[Java, C++]
===================================
*/
总结:解决并发修改异常问题的方案

Ok关于List和Set集合后期会持续更新。