JAVA三种遍历机制的性能比较

本文对比了JAVA中ArrayList、LinkedList和HashSet三种数据结构在for循环、forEach和Iterator遍历方式下的性能差异。实验结果显示,Iterator在ArrayList和LinkedList中的性能最优,而对于HashSet,foreach性能最佳。在不同数据量级下,各种遍历方式的表现各有特点,为优化代码提供了参考。
摘要由CSDN通过智能技术生成

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

  • for循环
  • forEach循环
  • Iterator循环

JAVA三种遍历机制的性能比较

 

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

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

  • 数组
  • 链表

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

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

  • ArrayList(包装后的数组)
  • LinkedList(包装后的链表)
  • HashSet(包装后的Hash类型数组)

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

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

题外话

我在阅读《疯狂JAVA》读到:JAVA的设计者将Map的内部entry数组中的value设为null进而实现了Set。因为我是以源码以及官方文档为准,具体我不清楚正确与否,但是因为Hash中的key互不相同,Set中元素也互不相同,所以我认为这个观点是正确的。

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

  • 每种数据结构的大小都设置三种量级
  • 10
  • 100
  • 1000
  • 元素都采用随机数生成
  • 遍历进行操作都为输出当前元素的值

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

ArrayList的比较

  • 代码

public class TextArray {

private static Random random;

private static List<Integer> list1;

private static List<Integer> list2;

private static List<Integer> list3;

public static void execute(){

random=new Random();

initArray();

testForWith10Object();

testForEachWith10Object();

testIteratorWith10Object();

testForWith100Object();

testForEachWith100Object();

testIteratorWith100Object();

testForWith1000Object();

testForEachWith1000Object();

testIteratorWith1000Object();

}

private static void testForWith10Object(){

printFor(list1);

}

private static void testForWith100Object(){

printFor(list2);

}

private static void testForWith1000Object(){

printFor(list3);

}

private static void testForEachWith10Object(){

printForeach(list1);

}

private static void testForEachWith100Object(){

printForeach(list2);

}

private static void testForEachWith1000Object(){

printForeach(list3);

}

private static void testIteratorWith10Object() {

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值