java set遍历及效率_【软件构造】关于java中List和Set数据结构不同实现方式和不同遍历方式时间效率的探讨与分析...

在java语言中,提供了链表List和集合Set数据类型可供使用,每种数据类型又有多种实现方式可供选择,遍历这些数据结构时存在多种方法,不同的实现方式和不同的遍历方式会产生不同的时间效率,下面重点探讨分析List的两种实现方式ArrayList、LinkedList和Set的三种实现方式HashSet、TreeSet、LinkedHashSet在遍历时的时间效率,以及不同的遍历方式产生的影响。

数据结构中存储的类型均为String,首先产生随机数据(字符串)以供测试:

1   public static String getRondomString(intlength) {2 String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";3 Random random = newRandom();4 StringBuffer sb = newStringBuffer();5 for (int i = 0; i < length; i++) {6 int number = random.nextInt(62);7 sb.append(str.charAt(number));8 }9 returnsb.toString();10 }

List

实现方式有ArrayList、LinkedList,遍历方式有传统遍历、使用内置迭代器、使用显式迭代器。

传统遍历:

1   for (int i = 0; i < num; i++)2 str = alisttest.get(i);

使用内置迭代器:

1   for (String str1 : alisttest);

使用显式迭代器:

1   Iterator it =alisttest.iterator();2 while(it.hasNext())3 str = it.next();

对两种实现方式均进行测试,发现使用LinkedList实现方式并进行传统遍历时所需时间远远大于其他几种方式,在数据规模为30000时得到以下结果。

5c80aa1330b25d94f2ce17ca313706f3.png

由于该规模对于其他方式间的对比来说过小,因此将LinkedList传统遍历移除,将数据规模扩大到10000000得到以下结果。

15b5d8a7771adb0475c91e1573125667.png

可以得到一定结论,LinkedList实现方式的传统遍历实现复杂度上比其他方式高很多,而其余条目在复杂度上应该是相同的。ArrayList实现方式比LinkedList实现方式在各种遍历方式上都快,同一种实现方式下内置迭代器和显式迭代器遍历方法遍历速度差不多,ArrayList中传统遍历最快。

经过分析,ArrayList实现方式是利用数组,LinkedList实现方式是利用链表,所以在传统遍历中,LinkedList每次访问一个元素都需要从头进行查找,总体复杂度是n的平方,而ArrayList直接通过访问下标的方式进行查找,总体复杂度是n,这导致LinkedList传统遍历远远慢于其他方式。LinkedList的优势在于访问某个元素的前驱后继时可以通过链表的特性快速完成。

Set

实现方式有HashSet、TreeSet、LinkedHashSet,遍历方式有使用内置迭代器、使用显式迭代器。

使用内置迭代器:

1   for (String str1 : hsettest);

使用显式迭代器:

1   Iterator it2 =hsettest.iterator();2 while(it2.hasNext())3 str = it2.next();

对三种实现方式均进行测试,数据规模为5000000,值得注意的是字符串的长度应该适当提高,避免set内部去重而出现错误。

得到以下结果。

b3d30805d7ac8a700d478b3c8a874b37.png

可以得到结论,HashSet实现方式两种遍历方法速度相当,TreeSet实现方式内置迭代器比显式迭代器慢,LinkedHashSet实现方式内置迭代器比显式迭代器快。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值