近段时间在写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 用于; 私有静态List list3; 公共静态孔隙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遍历机制性能的比较详解