【软件构造】关于java中List和Set数据结构不同实现方式和不同遍历方式时间效率的探讨与分析
在java语言中,提供了链表List和集合Set数据类型可供使用,每种数据类型又有多种实现方式可供选择,遍历这些数据结构时存在多种方法,不同的实现方式和不同的遍历方式会产生不同的时间效率,下面重点探讨分析List的两种实现方式ArrayList、LinkedList和Set的三种实现方式HashSet、TreeSet、LinkedHashSet在遍历时的时间效率,以及不同的遍历方式产生的影响。
数据结构中存储的类型均为String,首先产生随机数据(字符串)以供测试:
1 public static String getRondomString(int length) { 2 String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; 3 Random random = new Random(); 4 StringBuffer sb = new StringBuffer(); 5 for (int i = 0; i < length; i++) { 6 int number = random.nextInt(62); 7 sb.append(str.charAt(number)); 8 } 9 return sb.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<String> it = alisttest.iterator(); 2 while (it.hasNext()) 3 str = it.next();
对两种实现方式均进行测试,发现使用LinkedList实现方式并进行传统遍历时所需时间远远大于其他几种方式,在数据规模为30000时得到以下结果。
由于该规模对于其他方式间的对比来说过小,因此将LinkedList传统遍历移除,将数据规模扩大到10000000得到以下结果。
可以得到一定结论,LinkedList实现方式的传统遍历实现复杂度上比其他方式高很多,而其余条目在复杂度上应该是相同的。ArrayList实现方式比LinkedList实现方式在各种遍历方式上都快,同一种实现方式下内置迭代器和显式迭代器遍历方法遍历速度差不多,ArrayList中传统遍历最快。
经过分析,ArrayList实现方式是利用数组,LinkedList实现方式是利用链表,所以在传统遍历中,LinkedList每次访问一个元素都需要从头进行查找,总体复杂度是n的平方,而ArrayList直接通过访问下标的方式进行查找,总体复杂度是n,这导致LinkedList传统遍历远远慢于其他方式。LinkedList的优势在于访问某个元素的前驱后继时可以通过链表的特性快速完成。
Set
实现方式有HashSet、TreeSet、LinkedHashSet,遍历方式有使用内置迭代器、使用显式迭代器。
使用内置迭代器:
1 for (String str1 : hsettest);
使用显式迭代器:
1 Iterator<String> it2 = hsettest.iterator(); 2 while (it2.hasNext()) 3 str = it2.next();
对三种实现方式均进行测试,数据规模为5000000,值得注意的是字符串的长度应该适当提高,避免set内部去重而出现错误。
得到以下结果。
可以得到结论,HashSet实现方式两种遍历方法速度相当,TreeSet实现方式内置迭代器比显式迭代器慢,LinkedHashSet实现方式内置迭代器比显式迭代器快。