小豬學(xué)習(xí)
小小白慢慢學(xué)習(xí)中ing 第二十五天
努力努力
本日內(nèi)容(HashSet集合容劳、TreeSet集合)
1辉词、Set集合
Set詞義:數(shù)學(xué)中集合的概念必孤。也是Collection的子接口。
Set作為Collection集合的子接口瑞躺,沒(méi)有新增的功能敷搪。但是有自己的存儲(chǔ)特點(diǎn)。
無(wú)序幢哨。
不允許存儲(chǔ)重復(fù)的元素赡勘。
2、HashSet集合
Set接口的一個(gè)具體的實(shí)現(xiàn)類捞镰。
????底層是由哈希表實(shí)現(xiàn)闸与。它不保證迭代的順序。特別是不保證順序一直不變曼振。
????真正判斷元素是否是重復(fù),是否是相同的:看equals()蔚龙。
Object類:equals()-->boolean冰评,判斷對(duì)象是否相等。
子類是否重寫:
String木羹,Integer甲雅,Date,坑填。抛人。。脐瑰。
重點(diǎn)重點(diǎn)重點(diǎn)Q丁!苍在!HashSet集合去重的流程:
step1:先獲取對(duì)象的hashCode绝页,對(duì)象的哈希值不同,直接存儲(chǔ)到HashSet容器中寂恬。
step2:如果哈希值相同续誉,調(diào)用equals()比較。
true:認(rèn)為是相同的元素初肉,不存儲(chǔ)
false:不同的元素酷鸦,存儲(chǔ)
原則:hashCode()和equals()的原則:
重寫hashCode()的規(guī)則:自己生成hashCode值。公式
????????對(duì)象相同:屬性值相同。那么哈希碼必須相同臼隔。
????????對(duì)象不同:屬性值不同嘹裂。哈希碼盡量不同。
????????哈希碼可能相同躬翁,也可能不同焦蘑,但是我們希望不同。
重寫equals()的原則:"權(quán)威的"
????????如果兩個(gè)對(duì)象的屬性值相同盒发,認(rèn)為是相同的對(duì)象例嘱,返回true。
????????如果兩個(gè)對(duì)象的屬性值有不同宁舰,就不是相同的對(duì)象拼卵,返回false。
結(jié)論:如果想使用HashSet集合蛮艰,那么必須同時(shí)重寫對(duì)象的hashCode()和equals()這兩個(gè)方法腋腮。
重寫的規(guī)則:
hashCode()
????????對(duì)象相同,屬性值相同壤蚜。哈希碼必須相同即寡。
????????對(duì)象不同,屬性值不同袜刷。哈希碼盡量不同聪富。
equals()
????????對(duì)象相同:屬性值相同。必須true著蟹。
????????對(duì)象不同:屬性值不同墩蔓。必須false。
底層是一個(gè)哈希表:
????????酒店:HashSet集合
????????????顧客1:元素
????????房間號(hào):哈希值--->進(jìn)房間萧豆,1003
????????????顧客2:元素
????????房間號(hào):哈希值--->進(jìn)房間奸披,1004
????????????顧客3:元素
????????房間號(hào):哈希值-->1005
判斷:顧客2和顧客3是否是同一個(gè)人
看equals-->好比身份證號(hào)
3、TreeSet集合
TreeSet作為Set的一個(gè)實(shí)現(xiàn)類涮雷,也要去除重復(fù)的元素阵面。可以給存儲(chǔ)的元素進(jìn)行整理排序洪鸭。
????????排序:就要有排序的規(guī)則膜钓。
????????默認(rèn)的規(guī)則:Comparable接口,定義排序的規(guī)則卿嘲。
要想把元素存入到TreeSet集合中颂斜。就要求元素所屬的類,必須實(shí)現(xiàn)Comparable接口拾枣。
interface Comparable{
????????int compareTo(T obj);//排序的規(guī)則
}
String沃疮,Integer盒让,。司蔬。邑茄。。
java.lang.Comparable接口的用途:強(qiáng)行對(duì)實(shí)現(xiàn)類的對(duì)象進(jìn)行排序俊啼。
????????compareTo()-->此方法用于排序肺缕,返回值int類型類型
????????o1.compareTo(o2)-->int
????????正數(shù):o1 > o2,將o1排在o2的后面授帕。
????????負(fù)數(shù):o1 < o2同木,將o1排在o2的前面。
????????零:認(rèn)為o1和o2相同跛十,不存儲(chǔ)了彤路。
示例代碼:
Set<Person> set = new TreeSet<>();
Person p1 = new Person("王二狗", 19);
Person p2 = new Person("李小花", 18);
Person p3 = new Person("王二狗", 19);
Person p4 = new Person("李小花", 18);
Person p5 = new Person("Rose", 20);
/*
* java.lang.ClassCastException: com.qf.demo02.Person cannot be cast to java.lang.Comparable
* 直接向treeSet集合中存儲(chǔ)元素,報(bào)錯(cuò)了
*/
set.add(p1);
set.add(p2);
set.add(p3);
set.add(p4);
set.add(p5);
System.out.println(set.size());
System.out.println(set);
?
java.lang.ClassCastException: com.qf.demo02.Person cannot be cast to java.lang.Comparable
直接向treeSet集合中存儲(chǔ)元素芥映,報(bào)錯(cuò)了洲尊。Person類,不能轉(zhuǎn)為Comparable對(duì)象
?
java.lang.Comparable:查API
經(jīng)由查詢之后奈偏,發(fā)現(xiàn):
Comparable是一個(gè)接口:該接口對(duì)實(shí)現(xiàn)它的每個(gè)類的對(duì)象強(qiáng)加一個(gè)整體排序坞嘀。 這個(gè)排序被稱為類的自然排序 ,類的compareTo方法被稱為其自然比較方法 惊来。
?
該接口中有一個(gè)唯一的方法:compareTo(T)-->int
擴(kuò)展內(nèi)容:
紅黑樹(shù)--->平衡二叉樹(shù)--->二叉樹(shù)--->樹(shù)
想了解平衡二叉樹(shù)丽涩,可以參照此網(wǎng)址:https://baijiahao.baidu.com/s?id=1651427207567199156&wfr=spider&for=pc
4、Comparable接口
java.lang.Comparable接口
java.lang.Comparable接口的用途:強(qiáng)行對(duì)實(shí)現(xiàn)類的對(duì)象進(jìn)行排序唁盏。
僅有唯一的一個(gè)方法:compareTo()-->此方法用于排序内狸,返回值int類型類型
o1.compareTo(o2)-->int
????????正數(shù):o1 > o2检眯,將o1排在o2的后面厘擂。
????????負(fù)數(shù):o1 < o2,將o1排在o2的前面锰瘸。
????????零:認(rèn)為o1和o2相同刽严,不存儲(chǔ)了。
默認(rèn)的TreeSet集合避凝,使用的是Comparable接口舞萄,來(lái)給對(duì)象進(jìn)行排序。以及去重管削。