一矾瑰、重點知識
集合中調(diào)用equals(Object obj):比較兩個集合,要想返回true隘擎,需要當(dāng)前集合和形參集合的元素都相同殴穴。而且集合中元素的個數(shù)也要相同。
comparactor最好用匿名內(nèi)部類的方式實現(xiàn)货葬,定制排序推正,想改變或定制排序時候用,不然用自然排序就好了
集合實際使用的是comparable還是comparactor主要看你創(chuàng)建TreeSet集合時用的構(gòu)造器
map中的put方法有返回值宝惰,如果發(fā)生覆蓋行為時(也就是key相同,此時心得value會覆蓋原來的value)返回的為被覆蓋得value值再沧,沒有覆蓋返回的為null
collection顯示時用[ ]包裹數(shù)據(jù)
Map顯示時用{}包裹數(shù)據(jù)
Map中的getkey如果key不存在尼夺,返回的為null
存儲信息的方式:創(chuàng)建多個map每個人的信息存一個Map,然后把所有得map存入list中管理炒瘸,或者寫一個類來存儲信息,把類存儲到Map中淤堵。
注意Map里面發(fā)生key相同時,不是舍棄顷扩,而是覆蓋
TreeMap 實現(xiàn)了sortedMap---->map
二拐邪、重點問題
關(guān)于comparable 和 comparactor兩種比較器的的對比
1、自然排序:使用Comparable接口
像String隘截、包裝類等實現(xiàn)了Comparable接口扎阶,重寫了compareTo(obj)方法,給出了比較兩個對象大小的方式婶芭。進(jìn)行了從小到大的排列
自定義類實現(xiàn)Comparable接口东臀,重寫compareTo(obj)方法。在compareTo(obj)方法中指明如何排序犀农,實現(xiàn)Comparable接口的自定義類就可以往TreeSet惰赋、TreeMap中添加了,他的可排序性是隨著自定義類的存在而存在的呵哨。
重寫compareTo(obj)的規(guī)則:
? ? 如果當(dāng)前對象this大于形參對象obj赁濒,則返回正整數(shù),
? ? 如果當(dāng)前對象this小于形參對象obj孟害,則返回負(fù)整數(shù)拒炎,
? ? 如果當(dāng)前對象this等于形參對象obj,則返回零纹坐。
2枝冀、定制排序:使用Comparator接口
當(dāng)元素的類型沒實現(xiàn)java.lang.Comparable接口而又不方便修改代碼舞丛,或者實現(xiàn)了java.lang.Comparable接口的排序規(guī)則不適合當(dāng)前的操作,那么可以考慮使用 Comparator 的對象來排序
重寫compare(Object o1,Object o2)方法果漾,比較o1和o2的大星蚯小:
如果方法返回正整數(shù),則表示o1大于o2绒障;
如果返回0吨凑,表示相等;
返回負(fù)整數(shù)户辱,表示o1小于o2鸵钝。
總結(jié)
Comparable接口的方式一旦一定,保證Comparable接口實現(xiàn)類的對象在任何位置都可以比較大小庐镐。
Comparator接口屬于臨時性的比較恩商。
在集合TreeSet、TreeMap中Comparator接口也可以用在添加元素類的接口聲明上必逆,但是這樣會顯得比較復(fù)雜怠堪,還是建議寫在元素類用Comparable接口、定制排序就用Comparator接口的匿名內(nèi)部類名眉。
他們創(chuàng)建集合時使用的構(gòu)造方法也不一樣
無參構(gòu)造:new TreeSet();-->使用默認(rèn)的比較器:Comparable
有參構(gòu)造:new TreeSet(Comparator)-->使用自定義的比較器:Comparator
比較器中的理解難點※
TreeSet粟矿、TreeMap里面有排序的方法,而且都是從小到大排序的损拢,需要添加進(jìn)入其中的類實現(xiàn)comparable 和 comparactor是因為陌粹,TreeSet、TreeMap不能進(jìn)行比較福压,需要添加進(jìn)去的元素實現(xiàn)比較的方法掏秩,所以comparable 和 comparactor又叫比較器,然后TreeSet荆姆、TreeMap根據(jù)比較結(jié)果為正數(shù)負(fù)數(shù)或者零來判斷他們的大小哗讥,注意我們平時習(xí)慣寫結(jié)果為1,-1胞枕,0杆煞,但是是別的數(shù)值也可以,TreeSet腐泻、TreeMap在排序時候只看正負(fù)决乎,不看數(shù)值。
三派桩、課堂知識
3.1构诚、Comparable接口
java.lang.Comparable接口:給對象強(qiáng)行排序的。默認(rèn)的比較器铆惑。
int? compareTo(To)
將此對象與指定的對象進(jìn)行比較以進(jìn)行排序范嘱。
比較的兩個對象:this對象和參數(shù)o對象比較
說明:排序的規(guī)則
正數(shù):this對象>o對象送膳,排后面。
負(fù)數(shù):this對象<o對象丑蛤,排前面
零:this對象和o對象相同叠聋,不存儲∈芄——>去重
3.2碌补、Comparator接口
java.util.Comparator接口:給對象強(qiáng)行排序的。自定義的比較器棉饶。
int? compare(To1,To2)
比較其兩個參數(shù)的順序厦章。
比較的兩個對象:o1和o2
說明:排序的規(guī)則
正數(shù):o1對象>o2對象,排后面照藻。
負(fù)數(shù):o1對象<o2對象袜啃,排前面
零:o1對象和o2對象相同,不存儲幸缕∧抑瑁——>去重
注意點:創(chuàng)建一個TreeSet集合,到底使用哪個比較器冀值?Comparable?Comparator宫屠?
無參構(gòu)造:new TreeSet();-->使用默認(rèn)的比較器:Comparable
有參構(gòu)造:new TreeSet(Comparator)-->使用自定義的比較器:Comparator
3.3列疗、LinkedHashSet集合
LinkedHashSet:作為HashSet的子類;遍歷其內(nèi)部數(shù)據(jù)時浪蹂,可以按照添加的順序遍歷
在添加數(shù)據(jù)的同時抵栈,每個數(shù)據(jù)還維護(hù)了兩個引用,記錄此數(shù)據(jù)前一個數(shù)據(jù)和后一個數(shù)據(jù)坤次。? ? ? ? ? ? ? ? ? 對于頻繁的遍歷操作古劲,LinkedHashSet效率高于HashSet.
3.4、Map接口
映射缰猴,類似于函數(shù)
map每次操作的元素是成對的产艾。兩個:key(鍵),value(值)滑绒。
map中存儲的元素闷堡,鍵值對。其中鍵不能重復(fù)疑故。值可以重復(fù)杠览。鍵和值,必須是一一對應(yīng)的纵势。
成對的:鍵和值對應(yīng)
Map是一個接口:
Map中的常用方法:
添加/修改元素:
put(key,value)踱阿;向map中添加鍵值對管钳,鍵不能重復(fù)。如果鍵重復(fù)了软舌,那么value會被覆蓋的才漆。
刪除元素:
remove(key)-->value
查詢元素:
containsKey(key)-->boolean
containsValue(value)-->boolean
獲得元素:
get(key)-->value
size()-->鍵值對的個數(shù)
遍歷的方法調(diào)用:
?keySet()-->Set<key>
values()-->Collection<value>
entrySet()-->Set<Entry>
3.5、HashMap實現(xiàn)類
HashSet集合——>去重? step1:hashCode()葫隙,step2:equals()
HashMap集合——>key去重原理同HashSet相同栽烂。
step1:對象的hashCode()-->哈希值
如果哈希值不同,就直接存儲恋脚。
如果哈希值相同腺办,就進(jìn)入第二步
step2:對象的equals()-->boolean
如果true:相同的元素,key是相同的了糟描。value值怀喉,會覆蓋map中相同的key的之前的value。
如果false:不同的元素船响,key躬拢,value都可以進(jìn)行存儲。
如果使用HashMap集合见间,key的對象所屬于的類聊闯,必須同時重寫hashCode和equals,必須同時重寫米诉。重寫的規(guī)則
hashCode:
相同的對象菱蔬,屬性都相同,那么哈希值必須相同
不同的對象史侣,有的屬性值不同拴泌,那么哈希值盡量不同
equals:
相同的對象,屬性都相同惊橱,必須返回true蚪腐。
不同的對象,屬性值不同税朴,必須返回false回季。
對比HashSet和HashMap
1、都要求同時重寫hashCode()和equals()
2正林、不保證順序
? ? HashSet不關(guān)心存儲的元素的順序茧跋。添加的順序和迭代的順序不一定一致。
? ? HashMap不關(guān)心key的順序卓囚。
HashSet的底層就是HashMap瘾杭,實例化HashMap時等于實例化了一個HashMap.
3.6、TreeMap實現(xiàn)類
TreeMap要給key去重哪亿,而且還要排序:
Comparable接口就是默認(rèn)的排序規(guī)則粥烁。
compareTo(o)-->this和o
正數(shù):this > o贤笆,排后面
負(fù)數(shù):this < o,排前面
零:相同的對象讨阻,這個key對應(yīng)的value要替換掉原來的value芥永。
對比TreeSet和TreeMap
1、都要求對象具有可比性钝吮。
? ? TreeSet來講:里面所存儲的元素埋涧,能夠進(jìn)行比較大小。
? ? TreeMap來講奇瘦,所存儲 key棘催,能夠進(jìn)行比較大小。
2耳标、區(qū)別于HashSet和HashMap醇坝,要給排序。從小到大排序次坡。
? ? Comparable接口:默認(rèn)的
? ? Comparator接口:自定義
TreeMap也可以指定Comparator接口作為比較器呼猪。
compare(o1,o2)-->int
正數(shù):o1 > o2,排后面
負(fù)數(shù):o1< o2砸琅,排前面
零:相同的對象宋距,這個key對應(yīng)的value要替換掉原來的value。