list遍历方法及效率

iterator遍历,循环执行过程中会进行数据锁定, 性能稍差, 同时,如果你想在寻欢过程中去掉某个元素,只能调用it.remove方法, 不能使用list.remove方法, 否则一定出现并发访问的错误.
ForEach遍历,内部调用第一种, 换汤不换药, 因此比Iterator 慢,这种循环方式还有其他限制, 不建议使用它。
size遍历内部不锁定, 效率最高, 但是当写多线程时要考虑并发操作的问题。

以下为遍历测试结果情况。

package com.··.··;
import java.util.*;

/**
 * java --list的三种遍历
 * 性能比较
 * Created by zhaojy on 2016/12/5.
 */
public class compare {
    public static void main(String args[]){
        compare();
    }

    public static void compare() {
        List<String> list = new ArrayList<>();
        Set<String> set = new HashSet<>();
        for(int i=0;i<100000;i++) {
            list.add("a"+i);
        }
        long t1,t2;
        t1 = System.currentTimeMillis();
        for(String s : list) {
            set.add(s);
        }
        t2 = System.currentTimeMillis();
        System.out.println("forEach遍历的时间为:"+(t2-t1)+"mm");
        ////two
        t1 = System.currentTimeMillis();
        for(int i=0; i<list.size(); i++) {
            set.add(list.get(i));
        }
        t2 = System.currentTimeMillis();
        System.out.println("size遍历的时间为:"+(t2-t1)+"mm");
        ////three
        t1 = System.currentTimeMillis();
        Iterator<String> iterator = list.iterator();
        while(iterator.hasNext()) {
            set.add(iterator.next());
        }
        t2 = System.currentTimeMillis();
        System.out.println("iterator遍历的时间为:"+(t2-t1)+"mm");
    }
}

结果为:

forEach遍历的时间为:36mm
size遍历的时间为:13mm
iterator遍历的时间为:9mm
<think>首先,用户的问题是:“我想查找Java中使用Lambda表达式遍历集合的方法 请问Java lambda 遍历集合方法”。这是一个关于Java编程的查询,具体是如何使用Lambda表达式来遍历集合。 从系统级指令中,我需要: - 所有行内数学表达式使用$...$格式,但这个问题是关于Java编程的,没有数学表达式,所以可能不需要。 - 独立公式使用$$...$$格式,但同样,这里没有数学内容。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾添加引用标识,如[^1]。 - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 用户提供了几个引用: - 引用[^1]: 关于Java8 Lambda遍历集合的例子。 - 引用[^2]: Java集合遍历方式详解。 - 引用[^3]: Lambda表达式遍历的例子。 - 引用[^4]: Java8 lambda表达式遍历集合。 这些引用提供了Java中使用Lambda表达式遍历集合的代码示例和解释。用户说这些引用仅供参考,我需要参考用户的问题和我的回答。 用户的问题是直接的:询问Java lambda遍历集合的方法。所以,我应该基于提供的引用和Java知识来回答。 结构清晰的回答: - 先介绍基本概念。 - 然后逐步解释如何使用Lambda表达式遍历集合。 - 提供代码示例。 - 最后生成相关问题。 关键点: - Java 8引入了Lambda表达式,简化了集合遍历。 - 使用forEach方法结合Lambda表达式。 - 适用于List、Set、Map等集合类型。 从引用中: - 引用[^1]:展示了使用forEach遍历List和Map。 - 引用[^3]:展示了使用forEach遍历Collection。 - 引用[^4]:展示了使用stream和filter。 我应该整合这些信息。 回答大纲: 1. **介绍**:简要解释Lambda表达式在Java集合遍历中的作用。 2. **基本语法**:解释forEach方法的使用。 3. **代码示例**: - 遍历List。 - 遍历Set。 - 遍历Map。 4. **高级用法**:如使用stream API进行过滤和映射。 5. **总结**:强调优势。 6. **相关问题**:生成相关问题。 使用中文回答。 添加引用:在回答中,当提到具体内容时,添加引用标识。例如,如果引用[^1]中的代码,就在末尾加[^1]。 生成相关问题:在最后添加“相关问题”部分。 现在,构建回答。 **回答结构:** - 标题:Java中使用Lambda表达式遍历集合的方法 - 正文: - 解释Lambda表达式。 - 遍历List的示例。 - 遍历Set的示例。 - 遍历Map的示例。 - 使用stream API。 - 相关问题。 确保代码正确:用户提供的引用中有代码片段,我需要确保它们准确。 例如,从引用[^1]: - List遍历:`allQuestions.forEach(question -> { ... });` - Map遍历:`items.forEach((k, v) -> { ... });` 从引用[^3]:`coll.forEach(...);` 在回答中,我可以引用这些。 最终回答:</think>### Java中使用Lambda表达式遍历集合的方法 在Java 8及更高版本中,Lambda表达式(一种简洁的函数式编程语法)被引入,用于简化集合遍历操作。它通过`forEach`方法实现,适用于List、Set、Map等集合类型,使代码更简洁易读。下面我将逐步解释其基本语法、常见用法,并提供代码示例。所有示例基于Java集合框架,并参考了可靠的编程实践[^1][^3]。 #### 1. **Lambda表达式遍历的基本语法** - Lambda表达式语法:`(参数) -> { 操作 }`,其中参数是集合元素,操作是对元素的处理逻辑。 - 核心方法:`forEach()`,它接受一个Lambda表达式作为参数,遍历集合的每个元素。 - 优势:相比传统for循环,Lambda表达式减少冗余代码,提高可读性[^2][^4]。 #### 2. **遍历List集合** List是单列集合(如ArrayList),使用`forEach`直接遍历元素。 - **示例代码**:遍历一个字符串List,并打印每个元素。 ```java import java.util.ArrayList; import java.util.List; public class LambdaExample { public static void main(String[] args) { List<String> names = new ArrayList<>(); names.add("Alice"); names.add("Bob"); names.add("Charlie"); // 使用Lambda表达式遍历List names.forEach(name -> { System.out.println("Name: " + name); }); } } ``` - **解释**:`name -> { ... }`定义了一个Lambda表达式,`name`是List中的每个元素,箭头后是操作(这里打印元素)。输出: ``` Name: Alice Name: Bob Name: Charlie ``` - 此方法基于Java 8的`Iterable.forEach()`实现[^3]。 #### 3. **遍历Set集合** Set也是单列集合(如HashSet),遍历方式与List类似。 - **示例代码**:遍历一个整数Set,并计算元素总和。 ```java import java.util.HashSet; import java.util.Set; public class LambdaExample { public static void main(String[] args) { Set<Integer> numbers = new HashSet<>(); numbers.add(10); numbers.add(20); numbers.add(30); final int[] sum = {0}; // 使用数组模拟final变量 // 使用Lambda表达式遍历Set并累加 numbers.forEach(num -> { sum[0] += num; }); System.out.println("Sum: " + sum[0]); // 输出: Sum: 60 } } ``` - **解释**:Lambda表达式`num -> { sum[0] += num; }`处理每个元素。注意:在Lambda中修改外部变量需使用final或等效方式[^2]。 #### 4. **遍历Map集合** Map是双列集合(如HashMap),包含键值对(key-value)。遍历时需处理两个参数。 - **示例代码**:遍历一个Map,打印键值对并检查特定键。 ```java import java.util.HashMap; import java.util.Map; public class LambdaExample { public static void main(String[] args) { Map<String, Integer> scores = new HashMap<>(); scores.put("Math", 90); scores.put("English", 85); scores.put("Science", 95); // 使用Lambda表达式遍历Map scores.forEach((subject, score) -> { System.out.println("Subject: " + subject + ", Score: " + score); if ("English".equals(subject)) { System.out.println("Hello English!"); // 条件检查 } }); } } ``` - **解释**:`(subject, score) -> { ... }`中,`subject`是键,`score`是值。输出: ``` Subject: Math, Score: 90 Subject: English, Score: 85 Hello English! Subject: Science, Score: 95 ``` - 此语法直接使用`Map.forEach()`方法,简化了entrySet遍历[^1][^4]。 #### 5. **高级用法:结合Stream API** Java 8的Stream API可与Lambda表达式结合,实现过滤、映射等操作。 - **示例代码**:遍历List并过滤特定条件的元素。 ```java import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class LambdaExample { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); // 使用Stream和Lambda过滤偶数 List<Integer> evenNumbers = numbers.stream() .filter(num -> num % 2 == 0) // Lambda过滤条件 .collect(Collectors.toList()); evenNumbers.forEach(num -> System.out.println("Even: " + num)); // 输出: Even: 2, Even: 4 } } ``` - **解释**:`filter(num -> num % 2 == 0)`使用Lambda定义过滤规则,`forEach`输出结果。Stream API提高了代码的声明式风格[^4]。 #### 6. **总结与注意事项** - **优势**:Lambda表达式使遍历代码更简洁,减少样板代码,提升开发效率。 - **适用场景**:适用于Java 8+项目,常用于数据处理、集合过滤和事件处理。 - **注意事项**: - Lambda中不能修改非final局部变量(需使用数组或Atomic类)。 - 复杂逻辑建议使用方法引用(如`System.out::println`)进一步简化。 - 性能上,对于大数据集,Stream API可能比传统循环稍慢,但可读性更强[^2][^4]。 通过以上方法,您可以高效地使用Lambda表达式遍历Java集合。如果需要更深入的优化或特定框架集成,建议参考官方文档或相关教程。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值