Java 中常用集合效能比較

2021-06-09 12:23:08 字數 3137 閱讀 5535

list 集合:

list: 有順序的,元素可以重複 

遍歷:for 迭代

排序:comparable comparator collections.sort()

arraylist:底層用陣列實現的list

特點:查詢效率高,增刪效率低 輕量級 執行緒不安全

遍歷: arraylistal=new arraylist();

al.add("winsun"); al.add("weixin"); al.add("mybole");

for(int i=0;i

hashtable類   

hashtable繼承map介面,實現乙個key-value對映的雜湊表。任何非空(non-null)的物件都可作為key或者value。   

新增資料使用put(key,   value),取出資料使用get(key),這兩個基本操作的時間開銷為常數。   

hashtable通過initial   capacity和load   factor兩個引數調整效能。通常預設的load   factor   0.75較好地實現了時間和空間的均衡。增大load   factor可以節省空間但相應的查詢時間將增大,這會影響像get和put這樣的操作。   

使用hashtable的簡單示例如下,將1,2,3放到hashtable中,他們的key分別是」one」,」two」,」three」:   

hashtable   numbers   =   new   hashtable();   

numbers.put(「one」,   new   integer(1));   

numbers.put(「two」,   new   integer(2));   

numbers.put(「three」,   new   integer(3));   

要取出乙個數,比如2,用相應的key:   

integer   n   =   (integer)numbers.get(「two」);   

system.out.println(「two   =   」   +   n);   

由於作為key的物件將通過計算其雜湊函式來確定與之對應的value的位置,因此任何作為key的物件都必須實現hashcode和equals方法。hashcode和equals方法繼承自根類object,如果你用自定義的類當作key的話,要相當小心,按照雜湊函式的定義,如果兩個物件相同,即obj1.equals(obj2)=true,則它們的hashcode必須相同,但如果兩個物件不同,則它們的hashcode不一定不同,如果兩個不同物件的hashcode相同,這種現象稱為衝突,衝突會導致操作雜湊表的時間開銷增大,所以盡量定義好的hashcode()方法,能加快雜湊表的操作。   

如果相同的物件有不同的hashcode,對雜湊表的操作會出現意想不到的結果(期待的get方法返回null),要避免這種問題,只需要牢記一條:要同時複寫equals方法和hashcode方法,而不要只寫其中乙個。   

hashtable是同步的。   

hashmap類   

hashmap和hashtable類似,不同之處在於hashmap是非同步的,並且允許null,即null   value和null   key。,但是將hashmap視為collection時(values()方法可返回collection),其迭代子操作時間開銷和hashmap的容量成比例。因此,如果迭代操作的效能相當重要的話,不要將hashmap的初始化容量設得過高,或者load   factor過低。   

weakhashmap類   

weakhashmap是一種改進的hashmap,它對key實行「弱引用」,如果乙個key不再被外部所引用,那麼該key可以被gc**。 

hashset請參考對set的描述   

set是一種不包含重複的元素的collection,即任意的兩個元素e1和e2都有e1.equals(e2)=false,set最多有乙個null元素。   

set的建構函式有乙個約束條件,傳入的collection引數不能包含重複的元素。  請注意:必須小心操作可變物件(mutable   object)。如果乙個set中的可變元素改變了自身狀態導致object.equals(object)=true將導致一些問題。

兩個通用set實現是hashset   和treeset。要決定用哪乙個,那是非常簡單明瞭的。   hashset   要快得多   (對大多數操作是常數時間之於對數時間(constant   time   vs.   log   time)),   但不提供排序保證。如果你需要使用   sortedset   中的操作,或者按順序迭代對你來說是重要的,那麼請使用   treeset。   否則,使用   hashset。   在大多數時間都不使用   hashset   ,對你來說是個公平的賭博。     

關於   hashset,有一件事應該牢記,即就條目數和容量之和來講,迭代是線性的。因此,如果迭代效能很重要,那就應該慎重選擇乙個適當的初始容量。容量選得太大,既浪費空間,也浪費時間。   預設的初試容量是101,   一般來講,它比你所需要的要多。可以使用   int   建構函式來指定初始容量。要分配   hashset   的初始容量為17:     

set   s=   new   hashset(17);     

hashsets   另有乙個稱作   裝載因數(load   factor)   的"調整引數(tuning   parameter)"   。如果你非常在乎你的   hashset   的空間的使用,請閱讀   hashset   文字以獲取詳細資訊。否則,就使用預設值吧。如果你接受預設裝載因數,但你確實又想指定初始容量,那麼,選乙個大約是你期望你的   set   將增長到的容量的兩倍的數。如果你的猜測不著邊,它也可以增長,或只是浪費一點空間。但都沒有大問題。如果你知道有關正確尺寸的乙個最佳值,用它吧;如果不知道,那就使用乙個舊的值,或使用乙個偶數值。它真的不是非常重要。這些事情只能使   hashset   稍稍變好一點點。     

treeset   沒有調整引數。除   clone   之外,hashset   和   treeset   都僅有那些由它們各自的介面所要求的操作   (set   和   treeset),而沒有任何別的操作。     

C 六種集合效能比較

一.先來說說陣列的不足 也可以說集合與陣列的區別 1.陣列是固定大小的,不能伸縮。雖然system.array.resize這個泛型方法可以重置陣列大小,但是該方法是重新建立新設定大小的陣列,用的是舊陣列的元素初始化。隨後以前的陣列就廢棄!而集合卻是可變長的 2.陣列要宣告元素的型別,集合類的元素型...

redis memcache 效能比較

from redis和memcache非常像的,都是key,value的方式,將資料存放記憶體中。最近在學習redis,在網上看了一些這方面的資料,有三種觀點 1,redis讀寫記憶體比memcache快 2,memcache讀寫記憶體比redis快 3,memcache讀寫記憶體比redis快,但...

apache resin ngnix 效能比較

靜態頁面測試,靜態頁面包括css,js,img ab c 20 n 30 併發測試 高數值的也測過,結論一致 resin2.17 平均響應時間為0.521ms nginx 0.7.65 平均響應時間為1.042ms 少許幾次小於1.042 apache2.0 平均響應時間為最低1.042ms 在re...