HashSet是無(wú)重復(fù)的集合,那么問(wèn)題就是如何判定一個(gè)元素是否和另一個(gè)元素是相等的。這里需要自定義相等性。當(dāng)有對(duì)象加入HashSet時(shí),首先java會(huì)通過(guò)對(duì)象的hashcode值來(lái)判斷對(duì)象加入的位置及是否有重復(fù)的hashcode键痛。如果沒(méi)有重復(fù)的hashcode就認(rèn)為沒(méi)有相同的對(duì)象炫彩。如果有重復(fù)的hashcode,會(huì)再調(diào)用equals()方法判斷有重復(fù)hashcode的兩個(gè)對(duì)象是否真的相等絮短。如果相等那么HashSet就知道要加入的項(xiàng)目已經(jīng)重復(fù)了江兢,加入的操作就不會(huì)發(fā)生。相等性有兩個(gè)層次
- 引用相等性: 如果只認(rèn)為引用指向同一個(gè)對(duì)象才算相等丁频,那么什么都不用做杉允。對(duì)引用調(diào)用hashCode()會(huì)返回引用指向的對(duì)象特有的序號(hào)(大部分是對(duì)對(duì)象在堆上的地址的映射,因此不會(huì)有重復(fù)的序號(hào)席里。但也有像String一樣的其實(shí)是字面值的映射)
- 對(duì)象相等性:如果實(shí)際需要把不同的對(duì)象視為相等的叔磷,需要覆蓋從Object繼承下來(lái)的hashCode()才能確保兩個(gè)對(duì)象有相同的hashcode,然后需要覆蓋equals()方法奖磁。之所以需要有equals()方法是因?yàn)閔ashcode相同的對(duì)象未必相同改基,hashCode()所使用的雜湊算法可能會(huì)湊巧讓多個(gè)對(duì)象返回相同的雜湊值,但這種情況也比較少咖为,所以equals其實(shí)很少會(huì)被調(diào)用秕狰。