java遍历机制性能的比较详解

  


  

  

近段时间在写leetcode的柠檬水变化的时候,发现了对循环与forEach循环的耗时是不一致的,在提交记录上面差了一倍……
  

  

平常开发绝大部分业务逻辑的实现都需要遍历机制的帮的忙,虽说也有注意到各数据结构操作的性能比较,但是忽视了遍历机制性能的差异。原本前两天就开始动手写,拖延症…

  


  

  

现阶段我所知道JAVA遍历机制有三种

  
      <李>的循环李   <李> forEach循环李   <李>迭代器循环李   
  

JAVA数据结构千千万,但是大部分都是对基础数据结构的封装,比较HashMap依赖于节点数组,LinkedList底层是链表,ArrayList对数组的再封装……扯远了

  

总结来说,JAVA的基础数据结构,我觉得有两种

  
      <李>数组   <李>链表   
  

如果是加上散列(散列的操作与数组以及链表不太一致),就是三种

  

因为平常开发大部分都优先选择包装后的数据结构,所以下面我会使用

  
      <李> ArrayList(包装后的数组)   <李> LinkedList(包装后的链表)   <李> HashSet(包装后的散列类型数组)   
  

这三种数据结构在遍历机制不同的时候时间的差异

  

可能有人对我为什么不对比HashMap呢,因为JAVA设计中,是先实现了地图,再实现集。如果你有阅读过源码就会发现:每组个子类的实现中,都有一个序列化后的地图对应属性实现,而因为哈希的查找时间复杂度为O(1),得出关键后查找值的时间大致是一致的,所以我不对比HashMap。

  

  

我在阅读《疯狂JAVA》读到:JAVA的设计者将地图的内部条目数组中的值设为零进而实现了,因为我是以源码以及官方文档为准,具体我不清楚正确与否,但是因为散列中关键的互不相同,设置中元素也互不相同,所以我认为这个观点是正确的。

  

为了测试的公平性,我会采取以下的限定

  

每种数据结构的大小都设置三种量级
  

  
      <李> 10   <李> 100   <李> 1000   
  

元素都采用随机数生成
  

  

遍历进行操作都为输出当前元素的值
  

  

时间开销受本地环境的影响,可能测量值会出现变化,但是总体上比例是正确的

  


  

  

代码         公开课TextArray {      私有静态随机随机;      私有静态Listlist1;      私有静态List用于;      私有静态Listlist3;      公共静态孔隙execute () {   随机=new随机();   initArray ();   testForWith20Object ();   testForEachWith20Object ();   testIteratorWith20Object ();   testForWith200Object ();   testForEachWith200Object ();   testIteratorWith200Object ();   testForWith2000Object ();   testForEachWith2000Object ();   testIteratorWith2000Object ();   }      私有静态孔隙testForWith20Object () {   printFor (list1);   }      私有静态孔隙testForWith200Object () {   printFor(用于);   }      私有静态孔隙testForWith2000Object () {   printFor (list3);   }      私有静态孔隙testForEachWith20Object () {   printForeach (list1);   }      私有静态孔隙testForEachWith200Object () {   printForeach(用于);   }      私有静态孔隙testForEachWith2000Object () {   printForeach (list3);   }      私有静态孔隙testIteratorWith20Object () {   printIterator (list1);   }      私有静态孔隙testIteratorWith200Object () {   printIterator(用于);   }      私有静态孔隙testIteratorWith2000Object () {   printIterator (list3);   }      私有静态孔隙printFor (List列表){   System.out.println ();   System.out.print(数据:");   长开始=System.currentTimeMillis ();   for (int i=0、长度=list.size (); i<长度;我+ +){   System.out.print (list.get(我)+ " ");   }   System.out.println ();   长债=System.currentTimeMillis ();   系统。println(“为”+ list.size () +“:”+ (end-start) +“女士”);   }      私有静态孔隙printForeach (List列表){   System.out.println ();   System.out.print(数据:");   长开始=System.currentTimeMillis ();   (int临时:列表){   系统。打印(温度+ " ");   }   System.out.println ();   长债=System.currentTimeMillis ();   系统。println (“foreach“+ list.size () +“:”+ (end-start) +“女士”);   }      私有静态孔隙printIterator (List

java遍历机制性能的比较详解