List三种遍历方式及效率问题
2017-04-11 20:45
357 查看
转载地址:
http://www.cnblogs.com/chenxqNo01/p/6372594.html
第一种:迭代器遍历
for(Iterator<String> it = list.iterator(); it.hasNext(); ) {
....
}
这种方式在循环执行过程中会进行数据锁定,性能稍差(是不是因为锁定的原因有待商榷),同时如果你想在循环过程中去掉某个元素,只能调用it.remove方法,不能使用list.remove方法,否则一定出现并发访问的错误。
第二种:增强for循环
for(String data : list) {
.....
}
内部调用第一种,换汤不换药,因此比Iterator慢,这种循环方式还有其他限制,不建议使用它
第三种:
for(int i=0; i<list.size(); i++) {
A a = list.get(i);
...
}
内部不锁定, 效率最高,但是当写多线程时要考虑并发操作的问题。
对于声明了RandomAccessList(顺序访问和随机访问的概念见另外一篇介绍)(ArrayList有,LinkedList没有)来说,for稍高于iterator但是对于没有声明的,则iterator远远高于for。
ArrayList例子:
执行结果:
传统for循环遍历时间为:45032505
增强for循环遍历时间为:65176018
Iterator循环遍历时间为:74390863
改为LinkList:
执行结果:
传统for循环遍历时间为:152612694
增强for循环遍历时间为:25283813
Iterator循环遍历时间为:772936
http://www.cnblogs.com/chenxqNo01/p/6372594.html
第一种:迭代器遍历
for(Iterator<String> it = list.iterator(); it.hasNext(); ) {
....
}
这种方式在循环执行过程中会进行数据锁定,性能稍差(是不是因为锁定的原因有待商榷),同时如果你想在循环过程中去掉某个元素,只能调用it.remove方法,不能使用list.remove方法,否则一定出现并发访问的错误。
第二种:增强for循环
for(String data : list) {
.....
}
内部调用第一种,换汤不换药,因此比Iterator慢,这种循环方式还有其他限制,不建议使用它
第三种:
for(int i=0; i<list.size(); i++) {
A a = list.get(i);
...
}
内部不锁定, 效率最高,但是当写多线程时要考虑并发操作的问题。
对于声明了RandomAccessList(顺序访问和随机访问的概念见另外一篇介绍)(ArrayList有,LinkedList没有)来说,for稍高于iterator但是对于没有声明的,则iterator远远高于for。
ArrayList例子:
package test; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Test { public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); for (int i = 0; i <= 10000000; i++) { list.add(i); } int k = 0; long startTmFor = System.nanoTime(); for (int i = 0; i < list.size(); i++) { k += list.get(i); } long endTmFor = System.nanoTime(); System.out.println("传统for循环遍历时间为:" + (endTmFor - startTmFor)); k = 0; long startTmFor2 = System.nanoTime(); for(Integer i : list){ k += i; } long endTmFor2 = System.nanoTime(); System.out.println("增强for循环遍历时间为:" + (endTmFor2 - startTmFor2)); Iterator<Integer> iterator = list.iterator(); long startTmIterator = System.nanoTime(); while (iterator.hasNext()) { k += iterator.next(); } long endTmForIterator = System.nanoTime(); System.out.println("Iterator循环遍历时间为:" + (endTmForIterator - startTmIterator)); } }
执行结果:
传统for循环遍历时间为:45032505
增强for循环遍历时间为:65176018
Iterator循环遍历时间为:74390863
改为LinkList:
package test; import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class Test { public static void main(String[] args) { List<Integer> list = new LinkedList<Integer>(); for (int i = 0; i <= 10000; i++) { list.add(i); } int k = 0; long startTmFor = System.nanoTime(); for (int i = 0; i < list.size(); i++) { k += list.get(i); } long endTmFor = System.nanoTime(); System.out.println("传统for循环遍历时间为:" + (endTmFor - startTmFor)); k = 0; long startTmFor2 = System.nanoTime(); for(Integer i : list){ k += i; } long endTmFor2 = System.nanoTime(); System.out.println("增强for循环遍历时间为:" + (endTmFor2 - startTmFor2)); Iterator<Integer> iterator = list.iterator(); long startTmIterator = System.nanoTime(); while (iterator.hasNext()) { k += iterator.next(); } long endTmForIterator = System.nanoTime(); System.out.println("Iterator循环遍历时间为:" + (endTmForIterator - startTmIterator)); } }
执行结果:
传统for循环遍历时间为:152612694
增强for循环遍历时间为:25283813
Iterator循环遍历时间为:772936
相关文章推荐
- List集合两种遍历效率问题
- java的list几种实现方式的效率(ArrayList、LinkedList、Vector、Stack),以及 java时间戳的三种获取方式比较
- 20170507@遍历List集合的三种方式
- Java List遍历的三种方式
- Java中list对象的三种遍历方式
- List的三种遍历方式
- List遍历 三种方式
- 遍历list的三种方式
- Java中list对象的三种遍历方式
- 三种遍历list取值方式
- java HashMap遍历的三种方式以及效率对比
- 使用泛型后的List集合类型的三种遍历方式
- List的遍历的三种方式
- 对List的遍历有三种方式
- 遍历List的三种方式
- Java动态 遍历List 时删除List特征元素 异常问题 及解决方式总结
- List数组的三种遍历方式
- 集合之 Collection-List->ArrayList三种遍历方式 常用方法
- 遍历List集合的三种方式
- ArrayList三种遍历方式的效率以及fail-fast机制