18.2.5 集合遍历方式性能对比
1. 集合遍历方式概述
1.1 常见遍历方式
Java集合提供了多种遍历方式,每种方式在不同场景下的性能表现各不相同。
public class TraversalMethodsOverview { public void demonstrateTraversalMethods() { List<String> list = Arrays.asList("apple", "banana", "cherry", "date"); // 1. 传统for循环(索引访问) for (int i = 0; i < list.size(); i++) { String item = list.get(i); System.out.println(item); } // 2. 增强for循环(for-each) for (String item : list) { System.out.println(item); } // 3. 迭代器遍历 Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String item = iterator.next(); System.out.println(item); } // 4. Stream遍历 list.stream().forEach(System.out::println); // 5. 并行Stream遍历 list.parallelStream().forEach(System.out::println); } }
1.2 遍历方式分类
索引for循环 |
List(支持随机访问) |
可获取索引,可修改 |
取决于get()方法 |
增强for循环 |
所有集合 |
语法简洁,只读 |
O(n) |
Iterator |
所有集合 |
安全删除,单向 |
O(n) |
ListIterator |
List |
双向遍历,可修改 |
O(n) |
Stream |
所有集合 |
函数式编程,链式操作 |
O(n) |
并行Stream |
所有集合 |
多线程并行处理 |
O(n/p) |
2. ArrayList遍历性能分析
2.1 ArrayList各种遍历方式性能测试
public class ArrayListTraversalPerformance { private static final int SIZE = 1000000; public void testAllTraversalMethods() { ArrayList<Integer> list = new ArrayList<>(); // 准备数据 for (int i = 0; i < SIZE; i++) { list.add(i); } System.out.println("=== ArrayList遍历性能测试 ==="); testIndexedForLoop(list); testEnhancedForLoop(list); testIterator(list); testStreamForEach(list); testParallelStream(list); } // 1. 索引for循环 - 最快 private void testIndexedForLoop(ArrayList<Integer> list) { long startTime = System.nanoTime(); for (int i = 0; i < list.size(); i++) { Integer value = list.get(i); // O(1)随机访问 // 模拟处理 } long endTime = System.nanoTime(); System.out.println("索引for循环: " + (endTime - startTime) / 1000000 + "ms"); } // 2. 增强for循环 - 推荐 private void testEnhancedForLoop(ArrayList<Integer> list) { long startTime = System.nanoTime(); for (Integer value : list) { // 模拟处理 } long endTime = System.nanoTime(); System.out.println("增强for循环: " + (endTime - startTime) / 1000000 + "ms"); } // 3. Iterator遍历 private void testIterator(ArrayList<Integer> list) { long startTime = System.nanoTime(); Iterator<Integer> iterator = list.iterator(); while (iterator.hasNext()) { Integer value = iterator.next(); // 模拟处理 } long endTime = System.nanoTime(); System.out.println("Iterator遍历: " + (endTime - startTime) / 1000000 + "ms"); } // 4. Stream forEach private void testStreamForEach(ArrayList<Integer> list) { long startTime = System.nanoTime(); list.stream().forEach(value -> { // 模拟处理 }); long endTime = System.nanoTime(); System.out.println("Stream forEach: " + (endTime - startTime) / 1000000 + "ms"); } // 5. 并行Stream private void testParallelStream(ArrayList<Integer> list) { long startTime = System.nanoTime(); list.parallelStream().forEach(value -> { // 模拟处理 }); long endTime = System.nanoTime(); System.out.println("并行Stream: " + (endTime - startTime) / 1000000 + "ms"); } }
2.2 ArrayList遍历性能优化
public class ArrayListTraversalOptimization { // 优化1: 缓存size()避免重复调用 public void optimizedIndexedLoop(ArrayList<Integer> list) { int size = list.size(); // 缓存size for (int i = 0; i < size; i++) { Integer value = list.get(i); // 处理逻辑 } } // 优化2: 使用局部变量减少方法调用 public void optimizedIteratorLoop(ArrayList<Integer> list) { for (Iterator<Integer> it = list.iterator(); it.hasNext(); ) { Integer value = it.next(); // 处理逻辑 } } // 优化3: 批量处理减少函数调用开销 public void batchProcessing(ArrayList<Integer> list) { final int BATCH_SIZE = 1000; for (int i = 0; i < list.size(); i += BATCH_SIZE) { int end = Math.min(i + BATCH_SIZE, list.size()); // 批量处理 for (int j = i; j < end; j++) { Integer value = list.get(j); // 处理逻辑 } } } }
3. LinkedList遍历性能分析
3.1 LinkedList遍历方式对比
public class LinkedListTraversalPerformance { private static final int SIZE = 100000; // LinkedList较小的测试规模 public void testLinkedListTraversal() { LinkedList<Integer> list = new LinkedList<>(); // 准备数据 for (int i = 0; i < SIZE; i++) { list.add(i); } System.out.println("=== LinkedList遍历性能测试 ==="); testIndexedForLoop(list); testEnhancedForLoop(list); testIterator(list); } // 1. 索引for循环(性能极差) private void testIndexedForLoop(LinkedList<Integer> list) { long startTime = System.nanoTime(); for (int i = 0; i < list.size(); i++) { Integer value = list.get(i); // O(n)操作!总复杂度O(n²) // 模拟处理 } long endTime = System.nanoTime(); System.out.println("索引for循环: " + (endTime - startTime) / 1000000 + "ms"); } // 2. 增强for循环(推荐) private void testEnhancedForLoop(LinkedList<Integer> list) { long startTime = System.nanoTime(); for (Integer value : list) { // 模拟处理 } long endTime = System.nanoTime(); System.out.println("增强for循环: " + (endTime - startTime) / 1000000 + "ms"); } // 3. Iterator遍历(推荐) private void testIterator(LinkedList<Integer> list) { long startTime = System.nanoTime(); Iterator<Integer> iterator = list.iterator(); while (iterator.hasNext()) { Integer value = iterator.next(); // 模拟处理 } long endTime = System.nanoTime(); System.out.println("Iterator遍历: " + (endTime - startTime) / 1000000 + "ms"); } }
4. Has
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
Java面试圣经 文章被收录于专栏
Java面试圣经,带你练透java圣经