java常用數據結構的比較

java常用數據結構的比較

java中有很數據結構如key value中有haspmap,treemap,LinkedHashMap ,那麼這些數據結構有何區別,我們如何根據應用場景去選擇合適的數據結構,合適的數據結構將能夠有效的提高程序的運行效率和提升程序的安全性正確性。

Array、ArrayList、LinkList和vector

Array,arrayList 和linkList都是用來存放元素的,在實際應用中三者的區別如下:
* Array數組是 Java中最基本的數據結構,提供動態創建和訪問java數組的方法,根據定義的Array類型,其中的元素與類型必須相同。Array是一個固定大小的容器,底層採用的是線性連續空間來存放元素;
* ArrayList 繼承了 AbstractList 實現了Serializable, Cloneable, Iterable, Collection, List, RandomAccess 接口,ArrayList同樣也是一個容器,但是其大小不固定,底層採用的也是線性連續空間來存放元素,當線性連續空間不足以存放元素時,又重新申請一片更大的空間(大約是原空間的2倍),將原有的內容移過去。ArrayList是線程不安全的;
* LinkList也是一個容器,但底層採用的是鏈表,因此不存在擴容問題,除非整個內存空間都不足了,由於採用的是鏈表,因此查找效率也比較低,但刪除效率比較高。

  • vector爲存儲的對象分配一塊連續的地址空間,因此對vector中的元素隨機訪問效率很高。在vecotor中插入或者刪除某個元素,需要將現有元素進行復制,移動。vector是線程安全的

所以在應用上ArrayList用作讀取比較多的時候,而lLinkedList用在刪除比較多的時候。


HaspMap、TreeMap和linkedHashMap

HashMap,LinkedHashMap,TreeMap都屬於Map;Map 主要用於存儲鍵(key)值(value)對,根據鍵得到值,因此鍵不允許鍵重複,但允許值重複。
區別如下:
1、HashMap裏面存入的鍵值對在取出的時候是隨機的,也是我們最常用的一個Map.它根據鍵的HashCode值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度。在Map 中插入、刪除和定位元素,HashMap 是最好的選擇。(輸入的順序對應輸出的順序是不確定的)
2、TreeMap(基於紅黑樹)取出來的是排序後的鍵值對。但如果您要按自然順序或自定義順序遍歷鍵,那麼TreeMap會更好。(如果你按照A=>AA,O=>OO,D=>DD這樣的順序put進去,iterator遍歷輸出的是按照字典順序排列好的順序輸出,如A=>AA,D=>DD,O=>OO)
3、 LinkedHashMap 是HashMap的一個子類,如果需要輸出的順序和輸入的相同,那麼用LinkedHashMap可以實現. (以怎樣的順序輸入就以怎樣的順序輸出)


HashMap和HashTable

  • Hashmap 是一個最常用的Map,它根據鍵的HashCode 值存儲數據,根據鍵可以直接獲取它的值,具有很快的訪問速度,遍歷時,取得數據的順序是完全隨機的。HashMap最多隻允許一條記錄的鍵爲Null;允許多條記錄的值爲 Null;HashMap不支持線程的同步,即任一時刻可以有多個線程同時寫HashMap;可能會導致數據的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。
  • Hashtable與 HashMap類似,它繼承自Dictionary類,不同的是:它不允許記錄的鍵或者值爲空;它支持線程的同步,即任一時刻只有一個線程能寫Hashtable,因此也導致了 Hashtable在寫入時會比較慢。

String、String build和StringBuffer

  • 從執行速度上來說,StringBuilder > StringBuffer > String,因爲String是字符串常量StringBuild 和StringBuffer都是字符串變量,
    String定義的變量是不可變的如下面一段程序

    String s = "abcd";
    s = s+1;
    System.out.print(s);// result : abcd1

這裏雖然s最後輸出是abcd1,但其實abcd這個對象是沒有改變的它仍然在內存中等待GC回收;只是新建了一個String abcd1對象;

  • AbstractStringBuilder是StringBuilder與StringBuffer的公共父類,定義了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。

    StringBuffer對方法加了同步鎖或者對調用的方法加了同步鎖,所以是線程安全的,Stringbuilder是非線程安全的。

**

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章