在Java中,foreach 是一个常用的循环结构,它可以极大地简化遍历数组或集合(例如 List 或 Set)的代码。它通常被认为是一种更加简洁和易读的迭代方式。然而,可能有一些情况下不建议使用 foreach 循环:
// 使用迭代器来安全地移除集合中的元素:import java.util.ArrayList;import java.util.Iterator;import java.util.List;public class RemoveElement { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String item = iterator.next(); if (item.equals("B")) { iterator.remove(); // 安全移除元素 } } System.out.println(list); // 输出结果将不包含"B" }}
// 使用传统的for循环处理原始类型数组:public class PerformanceSensitive { public static void main(String[] args) { int[] numbers = {1, 2, 3, 4, 5}; // 使用传统 for 循环来避免可能的性能开销 for (int i = 0; i < numbers.length; i++) { System.out.println(numbers[i]); } }}
// 通过传统的for循环获取索引并修改数组或列表中的元素:import java.util.ArrayList;import java.util.List;public class ModifyElement { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("apple"); list.add("banana"); list.add("cherry"); for (int i = 0; i < list.size(); i++) { list.set(i, list.get(i).toUpperCase()); } System.out.println(list); // 所有元素变为大写 }}
// 使用传统的for循环以获取元素的索引:import java.util.ArrayList;import java.util.List;public class NeedIndex { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("one"); list.add("two"); list.add("three"); for (int i = 0; i < list.size(); i++) { System.out.println("Index " + i + ": " + list.get(i)); } }}
// 假设有两相关联的集合,一个是键的列表 keys,另一个是值的列表 valuesList<String> keys = Arrays.asList("key1", "key2", "key3");List<String> values = Arrays.asList("value1", "value2", "value3");// 使用传统的 for 循环同时遍历 keys 和 values 集合for (int i = 0; i < keys.size() && i < values.size(); i++) { String key = keys.get(i); String value = values.get(i); System.out.println(key + ": " + value);}
import java.util.List;import java.util.concurrent.CopyOnWriteArrayList;public class ForeachCopyOnWriteExample { public static void main(String[] args) { // 使用 CopyOnWriteArrayList 创建线程安全的 ArrayList List<String> list = new CopyOnWriteArrayList<>(); list.add("Element1"); list.add("Element2"); list.add("Element3"); // 使用 foreach 循环遍历 CopyOnWriteArrayList for (String element : list) { System.out.println(element); // 此处修改集合内容不会影响迭代,因为使用的是集合快照 list.add("ElementNew"); } // 最后打印集合的内容,可以看到新元素已经被添加 System.out.println("After modifications:"); for (String element : list) { System.out.println(element); } }}
CopyOnWriteArrayList 类创建了一个线程安全的集合。当我们在 foreach 循环中遍历集合并同时向其中添加新元素时,由于 CopyOnWriteArrayList 内部实现了对原始集合的复制(即创建了快照),foreach 循环使用的是开始迭代时的集合状态,所以迭代过程中集合状态的改变不会影响到迭代本身。这可能导致大量内存的额外消耗,尤其是当集合很大时。
本文链接:http://www.28at.com/showinfo-26-43330-0.htmlJava中不建议使用foreach的六大场景
声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com
上一篇: Matplotlib中的titles(标题)、labels(标签)和legends(图例)
下一篇: 测试左移与提测流水线的应用实践