Java 集合中的方法性能分析
文章目錄
- 前言
- 一、List集合
- 1.1、Collection 中 get() 和 remove()方法的效率
- 示例一
- 示例二
- 總結
前言
??????暫無
??????
??????
??????
??????
一、List集合
1.1、Collection 中 get() 和 remove()方法的效率
示例一
public static int sum(List<Integer> ls){int total=0;for(int i=0;i<ls.size();i++){total+=ls.get(i);}return total;}??????上面這個求一個 List 的所有元素和的代碼,在 ArrayList 中的時間復雜度為 O(n),在 LinkedList 中的時間復雜度為 O(n2)。
??????區別在于 get() 方法,它在 ArrayList 中的為常數時間,在 LinkedList 中為線性時間。當然 remove() 方法也是一樣的。但是采用迭代器來實現的話,上面代碼的運行時間不管是 ArrayList 還是 LinkedList ,都是線性時間 O(n)。
??????contains() 方法在這二者中均為線性時間。
示例二
??????刪除一個表中的所有偶數元素。
.
??????可能的想法是:創建一個新的只包含舊表中奇數元素的表,刪除舊表中元素,再將新表拷貝過去即可。
??????如果不采用這種創建新表的話,比如采用 remove() 方法的話,見代碼1:
public static void removeEvens(List<Integer> ls){int i=0;while(i<ls.size()){if(ls.get(i)%2==0)ls.remove(i);else++i;}}??????代碼1在 ArrayList 上由于 remove() 的原因(數組移動花費線性時間),它花費二次時間。而 LinkedLIst 由于 get() 和 remove() 的原因(元素搜索花費線性時間),所以它也花費二次時間。
??????采用迭代器來實現,見代碼2
public static void removeEvens(List<Integer> ls){Iterator it=ls.iterator();while(it.hasNext()){int tmp=(int)it.next();if(tmp%2==0)it.remove();}}??????用迭代器的話有什么不同呢?對于 ArrayList 而言,迭代器的 remove() 仍然花費線性時間,因為數組需要移動,而整個程序仍然花費二次時間;但是對于 LinkedList 而言,迭代器的 remove() 花費常數時間,因為該迭代器總是位于需要被刪除的節點(或者在其附近),所以整個程序僅花費線性時間,而不是二次時間。
??????需要說明的是 ListIterator 接口中的 add(Object o) 方法和 remove() 方法類似,在 LinkedList 中花費常數時間。
??????自定義的 ArrayList 和 LinkedList 參見博客:https://blog.csdn.net/Little_ant_/article/details/121637930 通過其中的細節可以體會上面所說這幾個方法的效率。
??????
??????
??????
??????
??????
??????
??????
??????
??????
??????
??????
??????
??????
??????
??????
??????
??????
??????
??????
??????
??????
??????
??????
??????
??????
??????
??????
總結
??????未完~
總結
以上是生活随笔為你收集整理的Java 集合中的方法性能分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法杂项~
- 下一篇: ArrayList 和 LinkedLi