瘋狂java講義第八章筆記

第八章 java集合

8.1 java集合

集合用來保存數(shù)量不確定的數(shù)據(jù)棍苹,以及保存具有映射關(guān)系的數(shù)據(jù)。也被稱為容器類。集合類都位于java.util包下斋攀。集合只能保存對象。
java集合由 collection和map兩個接口派生梧田。

8.2 Collection和Iterator接口

添加對象淳蔼,刪除對象,清空容器裁眯,判斷容器是否為空
當(dāng)使用System.out.println()時會輸出[ ele1,ele2...]這是因為所有的Collection都重寫了toString的方法鹉梨。如果想一次訪問集合中的每個元素,需要使用下面的方法遍歷元素穿稳。

8.2.1 使用Lambda表達(dá)式遍歷集合

Collection可以直接調(diào)用foreach(Consumer action)方法存皂,因為Consumer是函數(shù)式接口,所以可以用Lambda表達(dá)式

8.2.2 使用java8增強的Iterator遍歷集合元素

Iterator也是java集合框架的成員逢艘,但是主要用于遍歷Collection中的元素旦袋,Iterator對象也被稱為迭代器。
Iterator it=books.iterator();Iterator必須依賴Collection對象
it.hasNext();
it.next();
it.remove();
iterator對集合進(jìn)行迭代時它改,只是把集合元素的值傳遞給了迭代變量猜憎,所以修改迭代變量的值不會對集合元素本身有任何影響。
如果在iterator迭代collection集合過程中修改collection集合搔课。程序會在運行時發(fā)生異常胰柑。

8.2.3 使用Lambda表達(dá)式遍歷Iterator

forEachRemaining(Consumer action)

8.2.4 使用foreach循環(huán)遍歷集合元素

for(Object obj:book)

8.2.5 使用java8新增的predicate操作集合

removeIf(predicate filter)把滿足predicate的方法留下來

8.2.6使用java新增的Stream操作集合

Stream是一個通用的流接口截亦,
獨立使用Stream的步驟:
1.調(diào)用Builder()
2.add()
3 調(diào)用build()
4.使用聚集方法,大部分聚集方法柬讨,每個只能執(zhí)行一次
Stream提供了大量的方法進(jìn)行聚類操作
分為:中間方法 末端方法
有狀態(tài)的方法 短路方法

8.3 Set集合

實際上Set就是Collection 崩瓤,只是Set不允許包含重復(fù)元素。

8.3.1 HashSet類

HashSet是Set接口的典型實現(xiàn)踩官,HashSet按Hash算法來存儲集合中的元素却桶,因此具有很好的存取和查找性能
特點:

  1. 不能保證順序
  2. 不是同步的
  3. 集合元素值可以是null
    HashSet集合判斷兩個元素相等的標(biāo)準(zhǔn)是兩個對象通過equals()方法比較相等,并且兩個對象的hashCode()方法返回值也是相等的蔗牡。
    如果多個元素的 hashCode值相同颖系,但是它們通過equals返回false,則需要在一個桶里面保存多個元素辩越,導(dǎo)致性能的下降嘁扼。
    重寫hashCode()方法的基本規(guī)則
  4. 在程序運行過程中,同一個對象多次調(diào)用hashCode()返回值相同
  5. 當(dāng)兩個對象通過equals()方法返回true時黔攒,這兩個對象的hashCode()方法返回值相同
  6. 對象用作equals()方法比較標(biāo)準(zhǔn)的實例變量趁啸,都應(yīng)該用于計算hashcode值
    注意?:當(dāng)程序吧對象添加到hashSet后,盡量不要更改集合元素中參與計算hashCode() equals()的實例變量督惰,否則將導(dǎo)致無法正確操作這些元素不傅。

8.3.2 LinkedHashSet

LinkedHashSet是HashSet的子類,但是總是按照添加的順序保存對象赏胚。但是仍然不能有重復(fù)访娶。

8.3.3 TreeSet類

TreeSet類是SortedSet接口的實現(xiàn)類。TreeSet可以確保集合元素處于排序狀態(tài)觉阅。
1.自然排序
調(diào)用集合元素的compareTo(Object obj)來比較元素之間的大小關(guān)系震肮,然后把集合元素按升序排列。
注意?:
試圖把一個對象加入TreeSet時留拾,該對象必須實現(xiàn)Comparatable接口戳晌,否則程序?qū)伋霎惓!?br> 總結(jié)一句話:TreeSet如果想正常運行痴柔,必須只能添加同一種類型的對象沦偎。
TreeSet集合判斷兩個對象是否相等的唯一標(biāo)準(zhǔn)是:兩個對象通過compareTo()方法比較是否返回0。
注意?:不要修改TreeSet集合元素的關(guān)鍵實例變量咳蔚。
2.定制排序
實現(xiàn)定制排序豪嚎,在創(chuàng)建TreeSet對象時,提供一個Comparator對象與該TreeSet集合關(guān)聯(lián)谈火,由該Comparator對象負(fù)責(zé)集合元素的排序邏輯侈询。

EnumSet類

EnumSet是專門為枚舉類設(shè)計的集合類,EnumSet中所有元素都必須是指定枚舉類型的枚舉值糯耍,元素是有序的扔字,EnumSet以枚舉值在Enum類內(nèi)定義順序來決定集合的順序囊嘉,
EnumSet 集合不允許加入null, 且必須用類方法創(chuàng)建。
當(dāng)試圖復(fù)制一個Collection集合里的元素來創(chuàng)建EnumSet集合時革为,必須保證Collection集合里面的所有元素都是同一個枚舉類的枚舉值扭粱。

8.3.5 各Set實現(xiàn)類的性能分析

HashSet性能總是比TreeSet好,
只有當(dāng)需要一個保持排序的Set時震檩,在應(yīng)該使用TreeSet'
LinkHashSet遍歷起來更加方便琢蛤,普通的操作不如HashSet
EnumSet性能最好,但是有局限
這三個都是線程不安全的抛虏。必須手動同步博其。

8.4 List集合

List集合代表一個元素有序,可重復(fù)的集合迂猴。集合中每個元素都有其對應(yīng)的順序索引慕淡。

8.4.1 java8改進(jìn)的List接口和ListIterator接口

List集合增加了一些根據(jù)索引來操作集合元素的方法。
List判斷兩個對象相等只要通過equals()方法比較返回true.
set(int index,Object element)方法不會改變List集合的長度错忱。
ListIterator方法來遍歷List元素。它增加了向前迭代的功能挂据。hasPrevious() lit.previous()

8.4.2 ArrayList和vector實現(xiàn)類

不要用vector stack
用ArrayList ArrayDeque

8.4.3 固定長度的List

有一個操作數(shù)組的工具類Arrays,有一個asList()方法以清,可以把一個數(shù)組或者指定個數(shù)的對象轉(zhuǎn)換成list集合,這個集合時Array的內(nèi)部類ArrayList的實例崎逃,時固定長度的List集合掷倔。

8.5 Queue集合

Queen用于模擬隊列這種數(shù)據(jù)結(jié)構(gòu),隊列通常是“先進(jìn)先出”的容器个绍。

8.5.1 PriorityQueen實現(xiàn)類

PriorityQueen是一個比較標(biāo)準(zhǔn)隊列實現(xiàn)類勒葱,因為保存隊列元素的順序并不是按照加入的順序,而是按照隊列元素的大小重新排列巴柿。
注意?:不允許插入null元素

8.5.2 Deque接口與ArrayDeque實現(xiàn)類

Deque接口是Queen 接口的子接口凛虽,代表一個雙短隊列
Deque接口提供了一個典型的實現(xiàn)類:ArrayDeque」慊郑基于數(shù)組實現(xiàn)的雙端隊列凯旋。既可以當(dāng)棧,也可以當(dāng)隊列钉迷。當(dāng)棧的話至非,就用push peek pop
當(dāng)隊列的話,就用offer peek poll.

8.5.3 LinkedList實現(xiàn)類

既可以當(dāng)棧糠聪,也可以當(dāng)隊列

8.5.4 各種線性表的性能對比

  1. 如果需要遍歷集合元素荒椭,ArrayList更好,使用隨機訪問方法(get)來遍歷
  2. 如果經(jīng)常執(zhí)行插入刪除舰蟆,LinkedList更好
  3. 如果多個線程同時訪問List 集合中元素趣惠,考慮使用Collections將集合包裝成線程安全

8.6 java8增強的Map集合

Map又叫字典狸棍,或者關(guān)聯(lián)數(shù)組。

8.6.2 java8改進(jìn)的HashMap和Hashtable實現(xiàn)類

判斷兩個key相等的條件:兩個key通過equals()比較返回true信卡,并且hatched相等隔缀。
判斷兩個value相等的雕件:通過equals返回true
注意?:盡量不要使用可變對象作為hashmap的key,如果做了傍菇,也盡量不要改變猾瘸。

8.6.3 LinkedHashMap實現(xiàn)類

使用雙向鏈表維護(hù)key-value的次序,迭代順序與key-value對的插入順序一致

8.6.4 使用Properties讀寫屬性文件

可以把map對象和屬性文件聯(lián)系起來丢习,從而把Map 對象中的key-value對寫入屬性文件牵触,也可以把文件中的key-value加載到map中,key和value都是字符串類型咐低。

8.6.5 SortedMap接口和TreeMap實現(xiàn)類

8.6.6 WeakHashMap實現(xiàn)類

8.6.7 IdentityHashMap

當(dāng)且僅當(dāng)兩個key嚴(yán)格相等(==)揽思,才認(rèn)為兩個key相等。

8.6.8 EnumMap實現(xiàn)類

8.6.9 性能分析

HashMap最常用

8.7 HashSet和HashMap的性能選項

負(fù)載極限

8.8 操作集合的工具類:Collections

8.8.1 排序操作

8.8.2 查找替換操作

8.8.3 同步控制

8.8.4 設(shè)置不可變集合

8.9 麻煩的接口:Enumeration

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末见擦,一起剝皮案震驚了整個濱河市钉汗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鲤屡,老刑警劉巖损痰,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異酒来,居然都是意外死亡卢未,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門堰汉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來辽社,“玉大人,你說我怎么就攤上這事翘鸭〉吻Γ” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵就乓,是天一觀的道長失息。 經(jīng)常有香客問我,道長档址,這世上最難降的妖魔是什么盹兢? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮守伸,結(jié)果婚禮上绎秒,老公的妹妹穿的比我還像新娘。我一直安慰自己尼摹,他們只是感情好见芹,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布剂娄。 她就那樣靜靜地躺著,像睡著了一般玄呛。 火紅的嫁衣襯著肌膚如雪阅懦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天徘铝,我揣著相機與錄音耳胎,去河邊找鬼。 笑死惕它,一個胖子當(dāng)著我的面吹牛怕午,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播淹魄,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼郁惜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了甲锡?” 一聲冷哼從身側(cè)響起兆蕉,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缤沦,沒想到半個月后虎韵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡疚俱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年劝术,在試婚紗的時候發(fā)現(xiàn)自己被綠了缩多。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片呆奕。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖衬吆,靈堂內(nèi)的尸體忽然破棺而出梁钾,到底是詐尸還是另有隱情,我是刑警寧澤逊抡,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布姆泻,位于F島的核電站,受9級特大地震影響冒嫡,放射性物質(zhì)發(fā)生泄漏拇勃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一孝凌、第九天 我趴在偏房一處隱蔽的房頂上張望方咆。 院中可真熱鬧,春花似錦蟀架、人聲如沸瓣赂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽煌集。三九已至妓肢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間苫纤,已是汗流浹背碉钠。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留方面,地道東北人放钦。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像恭金,于是被迫代替她去往敵國和親操禀。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法横腿,類相關(guān)的語法颓屑,內(nèi)部類的語法,繼承相關(guān)的語法耿焊,異常的語法揪惦,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • java筆記第一天 == 和 equals ==比較的比較的是兩個變量的值是否相等,對于引用型變量表示的是兩個變量...
    jmychou閱讀 1,485評論 0 3
  • 第十天 權(quán)限修飾符 public protected default private 同一類 true true ...
    炙冰閱讀 525評論 0 1
  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX閱讀 869評論 0 1
  • 大家對以上的gradle的依賴管理都不陌生罗侯,Gradle只要簡單的這樣引入eventbus,okhttp之后就可以...
    kecai閱讀 1,987評論 0 3