Java中List、Set和Map的區(qū)別

Collection
├ List
│ ├ LinkedList(非線程安全)
│ ├ ArrayList(非線程安全)
│ └ Vector(線程安全)
│   └ Stack
└ Set(非線程安全)
│ ├ HashSet
│ └ TreeSet

Map
├ Hashtable(線程安全)
├ HashMap(非線程安全)
└ WeekHashMap

list、Set與Map

  • List、Set都是繼承Collection接口,而Map不是
  • List元素放入有序,可重復(fù),而Set元素放入無序,且不重復(fù)。List支持for循環(huán)便利,但Set不能(元素在Set中的位置是由該元素的HashCode決定,位置是固定的)
  • Set檢索元素效率低,但刪除和插入效率高(因為插入和刪除不會引起元素位置改變);List查找效率高,但插入刪除效率低。
  • Map適合儲存鍵值對的數(shù)據(jù)

ArrayList與LinkedList

ArrayList查詢效率高,插入刪除效率低
LinkedList查詢效率低,插入刪除效率高
原因:在于ArrayList是基于動態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),地址連續(xù)。而LinkedList是基于鏈表的數(shù)據(jù)結(jié)構(gòu),地址是任意的,在開辟內(nèi)存空間的時候不需要等一個連續(xù)的地址。

public ArrayList()//構(gòu)造一個初始容量為10的空列表。

HashSet與Treeset

TreeSet是二叉樹(紅黑樹的樹據(jù)結(jié)構(gòu))實現(xiàn)的,Treeset中的數(shù)據(jù)是自動 排好序 的,不允許放入null值
HashSet是哈希表實現(xiàn)的,HashSet中的數(shù)據(jù)是 無序 的,可以放入null,但只能放入一個null


總結(jié)

  • 如果涉及到堆棧,隊列等操作,應(yīng)該考慮用List
    • 對于需要快速插入,刪除元素,應(yīng)該使用LinkedList
    • 如果需要快速隨機(jī)訪問元素,應(yīng)該使用ArrayList
  • 如果程序在單線程環(huán)境中,或者訪問僅僅在一個線程中進(jìn)行,考慮非同步的類,其效率較高,如果多個線程可能同時操作一個類,應(yīng)該使用同步的類
  • 要特別注意對哈希表的操作,作為key的對象要正確復(fù)寫equals和hashCode方法
  • 盡量返回接口而非實際的類型,如返回List而非ArrayList,這樣如果以后需要將ArrayList換成LinkedList時,客戶端代碼不用改變。這就是針對抽象編程。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容