Java集合框架是Java编程语言的核心部分之一。它提供了许多有用的数据结构和算法,用于存储和处理数据。其中,集合框架中的集合类型包括单列集合和双列集合,这些集合类型都提供了不同的遍历方式。本文将详细介绍Java集合遍历方式,并提供大量例子帮助读者更好地理解和掌握这些遍历方式。
1、单列集合遍历方式
List提供了多种遍历方式,包括迭代器遍历、增强for遍历、for Each(Lambda表达式)遍历、普通for循环遍历、stream流遍历。
1.1普通for循环遍历
普通for循环遍历是List最常用的遍历方式之一。它的语法如下:
for(int i = 0; i < list.size(); i++) {
Object obj = list.get(i);
// do something
}
例:
import java.util.ArrayList;
import java.util.List;
public class List {
public static void main(String[] args) {
// 创建一个List集合
List<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Cherry");
fruits.add("Date");
// 使用for循环遍历List
for (int i = 0; i < fruits.size(); i++) {
System.out.println(fruits.get(i));
}
}
}
1.2 迭代器遍历
迭代器是Java集合框架中的一个重要概念,它提供了一种统一的方法来遍历集合中的元素,而无需暴露集合的内部结构。使用迭代器遍历集合时,你通常会调用集合的iterator()方法来获取一个迭代器实例,然后通过这个迭代器来遍历集合中的元素。 List是一种有序的集合,其中的元素可以重复。它的语法如下:
Iterator<Object> iterator = list.iterator();
while(iterator.hasNext()) {
Object obj = iterator.next();
// do something
}
例:
package com.wedu.listlist;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class list {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Cherry");
fruits.add("Date");
// 获取List的迭代器
Iterator<String> iterator = fruits.iterator();
// 使用迭代器遍历List
while (iterator.hasNext()) {
// 调用next()方法获取下一个元素,并将它赋值给fruit变量
String fruit = iterator.next();
// 对获取到的元素进行操作,这里我们简单地打印它
System.out.println(fruit);
}
}
}
1.3增强for遍历
增强型for循环的语法如下:
for (type variable : collection) {
// 循环体
}
这里,type是集合中元素的类型,variable是每次迭代中当前元素的变量名,collection是要遍历的集合。
例:
import java.util.ArrayList;
import java.util.List;
public class List {
public static void main(String[] args) {
// 创建一个List集合
List<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Cherry");
fruits.add("Date");
// 使用增强型for循环遍历List
for (String fruit : fruits) {
System.out.println(fruit);
}
}
}
增强型for循环是只读的,意味着你不能在循环体中修改集合中的元素。如果你需要修改元素,应该使用传统的for循环或者迭代器,并且确保在循环体内部正确处理修改操作。
1.4for Each(Lambda表达式)遍历
for Each也是仅仅用来遍历,不能进行其他操作。
package com.wedu.listlist;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
public class List1 {
public static void main(String[] args) {
List<String> fruits = new ArrayList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Cherry");
fruits.add("Date");
//利用Lambda表达式进行遍历
fruits.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
//简化过程
System.out.println("--------------------------------");
fruits.forEach((String s)-> {
System.out.println(s);
}
);
System.out.println("--------------------------------");
//最终简化成一行代码
fruits.forEach((s)-> System.out.println(s));
}
}
1.5stream流遍历
package com.wedu.listlist;
import java.util.ArrayList;
import java.util.Collections;
public class list {
public static void main(String[] args) {
//单列集合获取stream流
ArrayList<String> list=new ArrayList<>();
Collections.addAll(list,"b","c","d");
list.stream().forEach(s -> System.out.println(s));
}
}
2、双列集合遍历方式
2.1通过键找值
package com.wedu.Map;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo1 {
//map集合第一种遍历---通过键找值
public static void main(String[] args) {
//创建map集合对象
Map<String,String> map=new HashMap<>();
//添加元素
map.put("马克菠萝","瑶");
map.put("伽罗","明世隐");
map.put("后羿","蔡文姬");
//通过键找值遍历
//获取所有的键,把它放在一个单列集合中
Set<String> keys=map.keySet();
//遍历单列集合得到每一个键
for (String key : keys) {
//利用map集合的键获取对应的值
String value=map.get(key);
System.out.println(key+"="+value);
}
}
}
2.2通过键值对对象遍历
package com.wedu.Map;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo2 {
//map集合的第二种遍历---通过键值对对象遍历
public static void main(String[] args) {
//创建map集合对象
Map<String,String> map=new HashMap<>();
//添加元素
map.put("马克菠萝","瑶");
map.put("伽罗","明世隐");
map.put("后羿","蔡文姬");
map.put("公孙离","大乔");
//通过键值对对象遍历
//通过set集合获取所有的键值对对象
Set<Map.Entry<String, String>> entries = map.entrySet();
//遍历entries这个集合去得到里面的每一个键值对对象
for (Map.Entry<String, String> entry : entries) {
String key=entry.getKey();
String value=entry.getValue();
System.out.println(key+"="+value);
}
}
}
2.3利用Lambda表达式进行遍历
package com.wedu.Map;
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
public class MapDemo3 {
//map集合的第三种遍历---Lambda表达式
public static void main(String[] args) {
//创建map集合对象
Map<String,String> map=new HashMap<>();
//添加元素
map.put("马克菠萝","瑶");
map.put("伽罗","明世隐");
map.put("后羿","蔡文姬");
map.put("公孙离","大乔");
map.put("孙尚香","太乙真人");
//利用Lambda表达式进行遍历
map.forEach(new BiConsumer<String, String>() {
@Override
public void accept(String key, String value) {
System.out.println(key+"="+value);
}
});
System.out.println("-----------------------------------");
map.forEach((String key, String value)-> {
System.out.println(key+"="+value);
}
);
System.out.println("-----------------------------------");
map.forEach(( key, value)-> System.out.println(key+"="+value));
}
}
2.4stream流遍历
package com.stream;
import java.util.HashMap;
public class StreamDemo2 {
public static void main(String[] args) {
//双列集合获取stream流
HashMap<String,Integer> hm=new HashMap<>();
hm.put("aaa",111);
hm.put("bbb",222);
hm.put("ccc",333);
hm.put("ddd",444);
//第一种获取stream流
//hm.keySet().stream().forEach(s -> System.out.println(s));
//第二种获取stream流
hm.entrySet().stream().forEach(s->System.out.println(s));
}
}