线性表的遍历
package com.zby.queue; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; /** * * @author zby * @date 2018年9月30日 * @Description 测试【顺序存储结构的线性表】和【链式存储结构的线性表】的【迭代遍历】和【索引遍历】效率,学会RandomAccess接口的作用 */ public class ListPK { // 遍历次数 public static final int TIMES = 1000000; // 线性表初始化大小 public static final int LIST_SIZE = 1000; public static void main(String[] args) { List<String> arrayList = new ArrayList<String>(); fillList(arrayList); List<String> linkedList = new LinkedList<String>(); fillList(linkedList); iterator(arrayList, "顺序存储结构的线性表"); index(arrayList, "顺序存储结构的线性表"); iterator(linkedList, "链式存储结构的线性表"); index(linkedList, "链式存储结构的线性表"); } public static void iterator(List<String> list, String name) { long start = System.currentTimeMillis(); for (int times = 0; times < TIMES; times++) { Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String str = iterator.next(); noOp(str); } } System.out.println(name + "迭代遍历时间:" + (System.currentTimeMillis() - start)); } public static void index(List<String> list, String name) { long start = System.currentTimeMillis(); for (int times = 0; times < TIMES; times++) { int size = list.size(); for (int i = 0; i < size; i++) { String str = list.get(i); noOp(str); } } System.out.println(name + "索引遍历时间:" + (System.currentTimeMillis() - start)); } public static String noOp(String str) { return str; } /** * * @author zby * @date 2018年9月30日 * @param list * @Description 初始化线性表 */ public static void fillList(List<String> list) { for (int i = 0; i < LIST_SIZE; i++) { list.add("list" + i); } } }
顺序存储结构的线性表迭代遍历时间:1021 顺序存储结构的线性表索引遍历时间:787 链式存储结构的线性表迭代遍历时间:5709 链式存储结构的线性表索引遍历时间:376761
分析:
ArrayList的迭代遍历和索引遍历效率差不多,因为ArrayList使用数组实现,迭代遍历也是通过移动指针实现,总的来说迭代会多一个指针操作,所以慢一点点。
LinkedLisr遍历效率比ArrayList效率低,因为LinkedList使用链表实现,遍历需要一个一个往后移。索引遍历跟迭代遍历效率相差极大,因为迭代遍历是一个个后移,但是索引遍历需要每次都从头找到指定元素。