一绩鸣、上節(jié)課回顧
Collection接口:add()穴豫,remove()凡简,size(),iterator()精肃。秤涩。。
List子接口:add(index,E),remove(index),get(index),set(index,E),subList(),indexOf(),listIterator()...
有序司抱,有下標筐眷,index
允許存儲重復的元素
實現(xiàn)類:
ArrayList:底層采用數(shù)組結構來實現(xiàn)。
LinkedList:底層采用雙向鏈表來實現(xiàn)习柠。
Vector:舊的類匀谣,線程安全,效率低资溃。被ArrayList替代武翎。
Set子接口:
無序
不允許存儲相同的元素——>去重
實現(xiàn)類:
HashSet:底層采用哈希表結構來實現(xiàn)。
step1:對象的hashCode碼溶锭,不相同就直接存儲了宝恶。如果相同,進入第二步
step1:對象的equals()方法。
true:相同對象
false:不同對象
重寫以上兩個方法:Object類:hashCode(),equals()
對象的各個屬性值都相同——>相同的元素卑惜,重復的膏执。
同時重寫hashCode()和equals()
規(guī)則:
hashCode:如果對象相同,保證哈希值必須相同露久。如果對象不同更米,哈希值盡可能不同。
equals:如果對象相同毫痕,必須返回true征峦。如果對象不同,必須返回false消请。
TreeSet:底層采用二叉樹結構來實現(xiàn)栏笆。
TreeSet--->SortedSet接口--->Set接口
去重的同時,還給元素進行排序臊泰。
對象:人類:張三蛉加,王二狗,李小花
對象:狗類:毛毛缸逃,嘯天针饥,豆豆
對象具有可比性:能夠進行比較,誰在前誰在后需频。誰大誰小
接口:比較器
java.lang.Comparable接口:強行對該接口的實現(xiàn)類對象進行比較排序丁眼。
compareTo(o)--->int
o1,o2比較大小
正數(shù):this對象>o對象,排后面昭殉。
負數(shù):this對象<o對象苞七,排前面
零:this對象和o對象相同,不存儲挪丢□宸纾——>去重
java.lang.Comparable接口:比較器
java.util.Comparator接口:比較器
二、本節(jié)課內容
2.1乾蓬、Comparable接口
java.lang.Comparable接口:給對象強行排序的硫眨。默認的比較器。
intcompareTo(To)
將此對象與指定的對象進行比較以進行排序巢块。
比較的兩個對象:this對象和參數(shù)o對象比較
說明:排序的規(guī)則
正數(shù):this對象>o對象,排后面巧号。
負數(shù):this對象<o對象族奢,排前面
零:this對象和o對象相同,不存儲丹鸿≡阶撸——>去重
2.2、Comparator接口
java.util.Comparator接口:給對象強行排序的。自定義的比較器廊敌。
intcompare(To1,To2)
比較其兩個參數(shù)的順序铜跑。
比較的兩個對象:o1和o2
說明:排序的規(guī)則
正數(shù):o1對象>o2對象,排后面骡澈。
負數(shù):o1對象<o2對象锅纺,排前面
零:o1對象和o2對象相同,不存儲肋殴《陲保——>去重
注意點:創(chuàng)建一個TreeSet集合,到底使用哪個比較器护锤?Comparable官地?Comparator?
無參構造:new TreeSet();-->使用默認的比較器:Comparable
有參構造:new TreeSet(Comparator)-->使用自定義的比較器:Comparator
2.3烙懦、LinkedHashSet集合
回憶:HashSet存儲特點驱入?1、無序氯析。2亏较、去重
HashSet存儲數(shù)據(jù),記錄存儲的順序魄鸦。
Set集合的另一個實現(xiàn)類:LinkedHashSet
存儲原理同HashSet相同宴杀,但是外層套了一個鏈表結構。用于記錄存儲的順序拾因。
2.4旺罢、Map接口
詞義:映射,理解為對應绢记。
map每次操作的元素是成對的扁达。兩個:key(鍵),value(值)蠢熄。
map中存儲的元素跪解,鍵值對。其中鍵不能重復签孔。值可以重復叉讥。鍵和值,必須是一一對應的饥追。
成對的:鍵和值對應
程序中图仓,很多數(shù)據(jù)都是成對出現(xiàn)。
? ? json但绕,xml救崔,mysql惶看,map。六孵。纬黎。
Map是一個接口:
Map中的常用方法:
添加/修改元素:
put(key,value);向map中添加鍵值對劫窒,鍵不能重復本今。如果鍵重復了,那么value會被覆蓋的烛亦。
刪除元素:
remove(key)-->value
查詢元素:
containsKey(key)-->boolean
containsValue(value)-->boolean
get(key)-->value
size()-->鍵值對的個數(shù)
?
?
keySet()-->Set<key>
values()-->Collection<value>
entrySet()-->Set<Entry>
2.5诈泼、HashMap實現(xiàn)類
HashSet集合——>如何去重?step1:hashCode()煤禽,step2:equals()
HashMap集合——>key如何去重铐达?原理同HashSet相同。
step1:對象的hashCode()-->哈希值
如果哈希值不同檬果,就直接存儲瓮孙。
如果哈希值相同,就進入第二步
step2:對象的equals()-->boolean
如果true:相同的元素选脊,key是相同的了杭抠。value值,會覆蓋map中相同的key的之前的value恳啥。
如果false:不同的元素偏灿,key,value都可以進行存儲钝的。
如果使用HashMap集合翁垂,key的對象所屬于的類,必須同時重寫hashCode和equals硝桩,必須同時重寫沿猜。重寫的規(guī)則
hashCode:
相同的對象,屬性都相同碗脊,那么哈希值必須相同
不同的對象啼肩,有的屬性值不同,那么哈希值盡量不同
equals:
相同的對象衙伶,屬性都相同祈坠,必須返回true。
不同的對象矢劲,屬性值不同颁虐,必須返回false。
對比HashSet和HashMap
1卧须、都要求同時重寫hashCode()和equals()
2、不保證順序
? ? HashSet不關心存儲的元素的順序。添加的順序和迭代的順序不一定一致花嘶。
? ? HashMap不關心key的順序笋籽。
補充一句話:HashSet的底層就是HashMap,只不過只要key椭员,不要value值车海。
2.6、TreeMap實現(xiàn)類
TreeMap要給key去重隘击,而且還要排序:從小到大侍芝。怎么排序?要看排序的規(guī)則
Comparable接口就是默認的排序規(guī)則埋同。
compareTo(o)-->this和o
正數(shù):this > o州叠,排后面
負數(shù):this < o,排前面
零:相同的對象凶赁,這個key對應的value要替換掉原來的value咧栗。
對比TreeSet和TreeMap
1、都要求對象具有可比性虱肄。
? ? TreeSet來講:里面所存儲的元素致板,能夠進行比較大小。
? ? TreeMap來講咏窿,所存儲 key斟或,能夠進行比較大小。
2集嵌、區(qū)別于HashSet和HashMap萝挤,要給排序。從小到大排序纸淮。
? ? Comparable接口:默認的
? ? Comparator接口:自定義
TreeMap也可以指定Comparator接口作為比較器平斩。
compare(o1,o2)-->int
正數(shù):o1 > o2,排后面
負數(shù):o1< o2咽块,排前面
零:相同的對象绘面,這個key對應的value要替換掉原來的value