java入門 -- Set接口的實現(xiàn)類HashSet

import java.util.HashSet;

import java.util.Set;

/*

* Collection

* ------| List 有序列表接口列表 實現(xiàn)了List集合接口的類,特點是有序不可重復(fù)

*-----------| ArrayList 內(nèi)部維護了一個對象數(shù)據(jù),增刪慢,但是查詢塊

*-----------| LinedList 內(nèi)部是一個鏈表的數(shù)據(jù)結(jié)構(gòu),增刪改塊,查詢慢

*-----------| Vector? 底層維護了一個Object的數(shù)組對象,和ArrayList實現(xiàn)一樣,但是線程安全的,操作效率低,已經(jīng)被ArrayList取代。

*

* ------| Set 無序列表接口 實現(xiàn)Set集合接口的類,特點是無序不可重復(fù)

* ---------| HashSet Hash表? Set接口實現(xiàn)類? 底層使用Hash表來實現(xiàn)的,特點:存儲速度快。

* ---------| TreeSet Set接口實現(xiàn)類

* 無序: 元素添加進入的順序和遍歷出來的順序是不一致的。

* 不可重復(fù):如果添加重復(fù)元素,添加不會報錯,但是不會添加成功;

* Set 接口的實現(xiàn)類

* HashSet 集合類添加元素的原理:

* 當(dāng)向HashSet集合中添加元素的時候,HashSet對象會先調(diào)用元素的HashCode方法返回值,然后通過

*? 移位等運算就可以得出元素在Hash表中的存儲位置。也就是說如果HashSet得到的hash就是元素的hashCode方法

*? 返回的值,如果該值已經(jīng)在Hash表中存在,就不能再添加了》可能發(fā)生的情況:

*

*? 1. 如果Hash表算出的存儲位置目前沒有元素存儲,那么就可以將元素進行存儲:

*? 2. 如果Hash表算出的存儲位置目前已經(jīng)有元素存儲,就會再調(diào)用元素的equals()方法進行比較,如果返回true,

*? 說明元素重復(fù),不會進行添加,如果不相等,說明元素不重復(fù),就科技繼續(xù)添加,也就是說一個位置放了兩個元素。

*? 因此在Hash表中添加元素,一般要同時重寫元素的equals()和hashCode()方法,如果hashCode()的值相等,就通過

*? 再次判斷equels的返回值來判斷是否重復(fù)了。也就是說調(diào)用equals方法的前提是hashCode()返回的值是一樣的,

*? 所以并不是每次都會調(diào)用equals()方法;

*

* 注意:HashCode默認(rèn)情況下是對象的內(nèi)地地址,但是String對象改寫了Object的HashCode()方法

*/

class Perso2n{

String name; //姓名

int id; //id號:

public Person2(int id, String name){

this.id = id;

this.name = name;

}

@Override

public boolean equals(Object obj) {

// TODO Auto-generated method stub

Person2 p = (Person2)obj;

return this.id==p.id;

}

@Override

public int hashCode() {

// TODO Auto-generated method stub

//測試添加元素的時候調(diào)用了HashCode()方法;

System.out.println("HashCode()方法被調(diào)用了");

return this.id;

}

@Override

public String toString() {

// TODO Auto-generated method stub

return "{"+ this.id + this.name +"}";

}

}

public class Demo4 {

public static void main(String[] args){

HashSet hs = new HashSet();

/*

hs.add("1");

hs.add("2");

hs.add("3");

*/

hs.add(new Person2(100, "大舅"));

hs.add(new Person2(101, "二舅"));

hs.add(new Person2(102, "三舅"));

hs.add(new Person2(101, "四舅"));

System.out.println(hs);

String str = "hello world";

String str1 = new String("hello world");

str1.hashCode();

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容