Java 集合遍历的几种方式有什么区别
- for i 遍历
这种遍历是 实现 RandomAccess集合遍历的首选,对于这样的集合 get(1)和get(10000)的速度一样的,都非常快,这种集合的底层是数组,知道集合的地址根据角标就可以计算出偏移量迅速找到元素
mybait查询返回的list类型是ArrayList哦
public static void main(String[] args) { List<Integer> list = new ArrayList<>(10_000); for (int i = 0; i < 10_000; i++) { list.add(i); } int size = list.size(); for (int i = 0; i < size; i++) { handleSomeThing(); } } public static void handleSomeThing() { }
- 迭代器遍历
对于没实现RandomAccess接口的集合,是不能用上面的for i 遍历的,因为性能太差了, 这种List底层是一个链表 get(0)和get(10000)的速度会差很多,只能通过0找到1 ,1找到2,...然后找到10000号元素的位置
使用迭代器遍历时候,是不能使用集合的删除方法的,否则会抛出一个异常的
public static void main(String[] args) { List<Integer> list = new LinkedList<>(); for (int i = 0; i < 10_000; i++) { list.add(i); } Iterator<Integer> iterator = list.iterator(); while (iterator.hasNext()) { Integer next = iterator.next(); handleSomeThing(); } } public static void handleSomeThing() { }
- 超级for遍历
底层也是用迭代器实现的
public static void main(String[] args) { List<Integer> list = new LinkedList<>(); for (int i = 0; i < 10_000; i++) { list.add(i); } for (Integer i : list) { handleSomeThing(); } } public static void handleSomeThing() { }
- java8 的stream遍历
这种遍历会开启多线程的,试试下面的代码吧
public static void main(String[] args) { List<Integer> list = new LinkedList<>(); for (int i = 0; i < 10_000; i++) { list.add(i); } long startTime = System.currentTimeMillis(); list.parallelStream().forEach(integer -> { handleSomeThing(); }); long endTime = System.currentTimeMillis(); System.out.println(endTime - startTime); } public static void handleSomeThing() { try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } }