注:剛開(kāi)始學(xué)習(xí)java玄叠,寫文章為了加深印象祸穷,同時(shí)也希望能對(duì)別的初學(xué)者有一定幫助,主要內(nèi)容來(lái)源是李剛的《瘋狂Java講義》停蕉。
HashSet類 實(shí)現(xiàn)了Set接口愕鼓,若使用Set集合時(shí),一般就使用HashSet類來(lái)實(shí)現(xiàn)慧起。
HashSet類按Hash算法來(lái)實(shí)現(xiàn)元素的存儲(chǔ)菇晃,那什么是Hash算法呢?
Hash算法:http://blog.csdn.net/tanggao1314/
HashSet特點(diǎn):
1蚓挤、無(wú)序
2磺送、元素可以為 null
import java.util.HashSet;
public class HashSetDemo1
{
public static void main(String[] args)
{
HashSet packet1 = new HashSet();
HashSet packet2 = new HashSet();
packet1.add("Lipstick");
packet1.add("Eyebrow pencil");
packet1.add("books");
packet1.add("food");
packet1.add("BB");
System.out.println("packet1 : "+packet1);
System.out.println("packet2 : "+packet2);
}
}//輸出結(jié)果為:packet1 :[BB,books,Eyebrow pencil,Lipstick,food]
// packet2 :[]
3驻子、不同步
當(dāng)向HashSet集合存入某個(gè)元素:
1 首先調(diào)用該元素的hashCode()方法,得到對(duì)應(yīng)hashCode值
2 根據(jù)hashCode值決定存儲(chǔ)位置估灿。如果兩個(gè)元素通過(guò)其自身的equals()方法比較為真崇呵,但其hashCode值不相等,HashSet會(huì)把它們放在不同的位置上馅袁。
如果兩個(gè)元素的hashCode值相等域慷,equals()方法比較為假:由于hashCode值相同,試圖將他們放在一個(gè)位置上汗销,但是又不行犹褒,實(shí)際上是在這個(gè)位置上用鏈?zhǔn)浇Y(jié)構(gòu)保存多個(gè)對(duì)象,訪問(wèn)時(shí)也是根據(jù)hashCode值來(lái)訪問(wèn)大溜,導(dǎo)致性能下降化漆。
即在HashSet集合中兩個(gè)元素相等的標(biāo)準(zhǔn)是:
1 equals()方法比較相等;2 hashCode值相等钦奋。
兩者必須相等才為同一個(gè)元素座云。所以重寫某個(gè)對(duì)象(元素)的equals()方法時(shí),也要重寫hashCode()方法付材,以保證與Set集合規(guī)則一致: 元素不可重復(fù)朦拖。
所以重寫hashCode()方法的基本規(guī)則是:
- 程序運(yùn)行中,同一個(gè)對(duì)象多次調(diào)用hashCode()厌衔,返回值應(yīng)該一樣
- equals()比較為真璧帝,hashCode()應(yīng)返回相同值
- 對(duì)象中用作equals()方法比較標(biāo)準(zhǔn)的實(shí)例變量,都應(yīng)該用于計(jì)算hashCode值
重寫hashCode()步驟:
1富寿、把對(duì)象內(nèi)每個(gè)有意義的實(shí)例變量(即每個(gè)參與equals()比較標(biāo)準(zhǔn)的實(shí)例變量)計(jì)算出一個(gè)int類型的hashCode值睬隶,計(jì)算方式如下:
2、用第1步計(jì)算得到的多個(gè)hashCode值組合計(jì)算出一個(gè)hashCode值返回页徐,且為避免直接想加產(chǎn)生偶然相等苏潜,可為每個(gè)實(shí)例變量的hashCode值乘以一個(gè)質(zhì)數(shù)后再想加。