Java中List集合的遍歷(三種遍歷方式效率的比較)
阿新 • • 發佈:2018-11-28
public static void main(String args[]){ compare(); } public static void compare() { List<String> list = new ArrayList<>(); // Set<String> set = new HashSet<>(); for(int i=0;i<10000000;i++) { list.add("測試"+i); } Object temp; long t1,t2; t1 = System.currentTimeMillis(); for(String s : list) { // set.add(s); temp = s; } t2 = System.currentTimeMillis(); System.out.println("forEach遍歷的時間為:"+(t2-t1)+"ms"); t1 = System.currentTimeMillis(); for(int i=0; i<list.size(); i++) { // set2.add(list.get(i)); temp = list.get(i); } t2 = System.currentTimeMillis(); System.out.println("size遍歷的時間為:"+(t2-t1)+"ms"); t1 = System.currentTimeMillis(); Iterator<String> iterator = list.iterator(); while(iterator.hasNext()) { // set3.add(iterator.next()); temp = iterator.next(); } t2 = System.currentTimeMillis(); System.out.println("iterator遍歷的時間為:"+(t2-t1)+"ms"); }
為了測試,建立一個Object的temp作為快取
得到的結果
forEach遍歷的時間為:68ms
size遍歷的時間為:4ms
iterator遍歷的時間為:7ms
使用size方法較迭代器的方法快一些速度,但是不是很明顯。
但都比forEach的方法快了很多
因為for each方法 底層呼叫了迭代器的方法,所以很慢。
使用iterator方法迴圈執行過程中會進行資料鎖定,如果想在遍歷過程中去掉某個元素,只能呼叫it.remove方法,不能使用list.remove方法,否則一定出現併發訪問的錯誤.
所以使用size方法是遍歷list的較好方法~
但是如果是,迴圈裡還進行了別的操作,時間可能就不太一樣了~
public static void main(String args[]){ compare(); } public static void compare() { List<String> list = new ArrayList<>(); Set<String> set = new HashSet<>(); Set<String> set2 = new HashSet<>(); Set<String> set3 = new HashSet<>(); for(int i=0;i<10000000;i++) { list.add("測試"+i); } Object temp; long t1,t2; t1 = System.currentTimeMillis(); for(String s : list) { set.add(s); temp = s; } t2 = System.currentTimeMillis(); System.out.println("forEach遍歷的時間為:"+(t2-t1)+"ms"); t1 = System.currentTimeMillis(); for(int i=0; i<list.size(); i++) { set2.add(list.get(i)); temp = list.get(i); } t2 = System.currentTimeMillis(); System.out.println("size遍歷的時間為:"+(t2-t1)+"ms"); t1 = System.currentTimeMillis(); Iterator<String> iterator = list.iterator(); while(iterator.hasNext()) { set3.add(iterator.next()); temp = iterator.next(); } t2 = System.currentTimeMillis(); System.out.println("iterator遍歷的時間為:"+(t2-t1)+"ms"); }
得到的結果呢:
forEach遍歷的時間為:5511ms
size遍歷的時間為:3337ms
iterator遍歷的時間為:791ms
迭代器反而這種遍歷方式會更具優勢~ 因為看不到底層的原始碼,所以大概猜測迭代器對於set比較友好吧~