几种遍历对比
1.for循环
2.for-each循环 jdk1.5提供的
3.foreach,jdk1.8提供,是Iterable接口中的默认实现方法(原理是应用了for-each来实现遍历,只是增加了lambda表达式)
4.Iterator
5.stream
1) 实际上2,3,4三种方式都是医用迭代器, 原理是相同的
2) 遍历包括一个线程遍历另一个线程修改的安全问题, 见点击打开链接 , 和在一个线程遍历的过程中在自身遍历时进行修改
3) 对于集合的修改包括增删,(改?), 而在遍历过程中对集合中元素进行修改时允许的(使用 foreach 时,是不能修改正在遍历的集合 —— 至于集合中的元素,想怎么改怎么改,修改元素并不会影响到集合的状态,因为集合中保存的是元素的引用)
4) list.stream().foreach() 和 list.foreach() 是不同实现原理
5) lambda表达式代表的是匿名内部类, 常用的接口有predicate, function, consumer
6) stream和iterator的区别, 前者可以并行执行,后者只能串行
7) stream不会修改数据源, 中间操作不会修改数据源, 但是最终操作有可能修改数据源, 如 list.stream().foreach()操作 不是说stream的数据源不能被修改吗?
8) removeif方法是根据iterator中的remove方法删除的, removeif和foreach只是用到了lambda表达式, 和stream无关
arraylist的遍历适合使用for循环,因为其实数组,随机查找速度最快
linkedlist的比遍历适合使用iterator遍历,因为其是双向链表