第八章 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算法來存儲集合中的元素却桶,因此具有很好的存取和查找性能
特點:
- 不能保證順序
- 不是同步的
- 集合元素值可以是null
HashSet集合判斷兩個元素相等的標(biāo)準(zhǔn)是兩個對象通過equals()方法比較相等,并且兩個對象的hashCode()方法返回值也是相等的蔗牡。
如果多個元素的 hashCode值相同颖系,但是它們通過equals返回false,則需要在一個桶里面保存多個元素辩越,導(dǎo)致性能的下降嘁扼。
重寫hashCode()方法的基本規(guī)則 - 在程序運行過程中,同一個對象多次調(diào)用hashCode()返回值相同
- 當(dāng)兩個對象通過equals()方法返回true時黔攒,這兩個對象的hashCode()方法返回值相同
- 對象用作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 各種線性表的性能對比
- 如果需要遍歷集合元素荒椭,ArrayList更好,使用隨機訪問方法(get)來遍歷
- 如果經(jīng)常執(zhí)行插入刪除舰蟆,LinkedList更好
- 如果多個線程同時訪問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ù)載極限