import java.util.HashSet;
import java.util.Set;
/*
* Collection
* ------| List 有序列表接口列表 實現(xiàn)了List集合接口的類骆撇,特點是有序不可重復(fù)
*-----------| ArrayList 內(nèi)部維護(hù)了一個對象數(shù)據(jù),增刪慢胆建,但是查詢塊
*-----------| LinedList 內(nèi)部是一個鏈表的數(shù)據(jù)結(jié)構(gòu),增刪改塊畜埋,查詢慢
*-----------| Vector? 底層維護(hù)了一個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)類
* 無序: 元素添加進(jìn)入的順序和遍歷出來的順序是不一致的竿滨。
* 不可重復(fù):如果添加重復(fù)元素,添加不會報錯捏境,但是不會添加成功;
* Set 接口的實現(xiàn)類
* HashSet 集合類添加元素的原理:
* 當(dāng)向HashSet集合中添加元素的時候于游,HashSet對象會先調(diào)用元素的HashCode方法返回值,然后通過
*? 移位等運算就可以得出元素在Hash表中的存儲位置垫言。也就是說如果HashSet得到的hash就是元素的hashCode方法
*? 返回的值贰剥,如果該值已經(jīng)在Hash表中存在,就不能再添加了》可能發(fā)生的情況:
*
*? 1. 如果Hash表算出的存儲位置目前沒有元素存儲筷频,那么就可以將元素進(jìn)行存儲:
*? 2. 如果Hash表算出的存儲位置目前已經(jīng)有元素存儲蚌成,就會再調(diào)用元素的equals()方法進(jìn)行比較,如果返回true,
*? 說明元素重復(fù)凛捏,不會進(jìn)行添加担忧,如果不相等,說明元素不重復(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();
}
}