Java(8):Java中的容器


前言

在Objective-C中,我們常用的容易有三種,分別是NSSet、NSArray、NSDictionary三種(PS:當然了,存儲對象還要分可變和非可變).那么在Java中,容器到底有什么不同呢?下面我們分別來對Java中的各種容器詳情進行說明.

圖片來源于網絡


Collection

Collection是一個獨立元素的序列,是一個接口類,也就是說它并沒有直接實現,遵循Collection這個接口類的主要有三個子類接口,分別是ListSetQueue.List必須按照插入的順序保存元素,而Set不能有重復元素.Queue按照排隊規則來確定對象產生的順序(通常與它們被插入的順序相同,先進先出).Collection接口概括了序列的概念 ---一種存放一組對象的方式.下面我們就看一下實際中具體是如何體現的,如下代碼所示.其中<Integer>表示數組中的元素類型為Integer類型.

        Collection<Integer> numberArray = new ArrayList<Integer>();
        for (int i = 0; i < 3; i++) {
            numberArray.add(i);
        }


List

對于List接口時在Collection的基礎上添加上添加了大量的方法,使得可以在List的中間插入和移除元素.通過前言中的Java中集合框架圖對于List接口的具體實現類主要有兩個,一個是ArrayList,另外一個是LinkedList,那么這兩種數組有何不同呢?

  • ArrayList是實現了基于動態數組的數據結構,LinkedList基于鏈表的數據結構。
  • 對于隨機訪問get和set,ArrayList覺得優于LinkedList,因為LinkedList要移動指針。
  • 對于新增和刪除操作add和remove,LinedList比較占優勢,因為ArrayList要移動數據。

下面我們就對List接口類中的一些常用的方法進行簡單的說明概述.

接口方法 方法簡介
contains() contains()方法是用來確定某個元素是否在當前數組中.
remove() remove()是數組刪除一個元素的方法
indexOf() indexOf()可以找到該對象在List中的所處位置的索引編號,這里我要額外的說明一點,那就是上面的三個方法都是基于equals()這個方法的,也就說我們需要注意所找的對象是否是同一對象.
subList() 這個方法是用來從數組中截取出一個子數組,我們可以通過參數來確定它需要從什么位置截取到什么位置
retainAll() retainAll()這個方法是一種有效的"交集"操作.
removeAll() removeAll()也是基于equals()方法的,它是將List中移除在參數List中的所有元素.
set() set()這個方法主要作用是替換,在指定的索引處(第一個參數),用第二個參數替換整個位置的元素.但是這個方法的命名顯得很不合時宜,因為它是和Set類存在潛在沖突的.


Set

Set不保存重復的元素,這樣我們很容易的詢問某個對象是否在某個Set中.正是因為有這樣的特性,查找就成為Set中最重要的操作,我們經常會使用HashSet來進行快速查找操作.Set具有和Collection一樣的接口,因此沒有額外的的功能,不想前面有兩個不同的List,下面我們看一下遵循Set接口的兩個具體類HashSetTreeSet的特點.

HashSet TreeSet
簡介 HashSet 是哈希表實現的,HashSet中的數據是無序的,可以放入null,但只能放入一個null,兩者中的值都不能重復,就如數據庫中唯一約束。 TreeSet 是二差樹實現的,Treeset中的數據是自動排好序的,不允許放入null值。
排序 無序 TreeSet支持兩種排序方式,自然排序 和定制排序,其中自然排序為默認的排序方式。向TreeSet中加入的應該是同一個類的對象。


Map

Map主要作用是一種對象映射成另外的一種對象,在Map中我們通過對象來對對象進行索引,用來索引的對象叫做key,其對應的對象叫做value.這就是我們平時說的鍵值對.下面我們看一下遵循Map接口的兩個具體類HashMapTreeMap的特點.這兩者的比較類似于上一個模塊的HashSetTreeSet.

HashMap TreeMap
簡介 基于哈希表實現。使用HashMap要求添加的鍵類明確定義了hashCode()和equals()[可以重寫hashCode()和equals()],為了優化HashMap空間的使用,您可以調優初始容量和負載因子。 基于紅黑樹實現。TreeMap沒有調優選項,因為該樹總處于平衡狀態。
排序 無序 適用于按自然順序或自定義順序遍歷鍵(key)
總結 HashMap通常比TreeMap快一點(樹和哈希表的數據結構使然),建議多使用HashMap,在需要排序的Map時候才用TreeMap. 同左


本文參考文章:Java——HashSet和TreeSet的區別
本文參考文章:Java中HashMap和TreeMap的區別



本文所有內容詳情可查看Think in Java(Java編程思想)第十一章的持有對象部分,所以還是建議大家去看原書.本文只是作為學習筆記,如有紕漏,歡迎指出.


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,533評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,055評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,365評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,561評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,346評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,889評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,978評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,118評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,637評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,558評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,739評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,246評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,980評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,619評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,347評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,702評論 2 370

推薦閱讀更多精彩內容