Set是元素無序并且不可以重復的集合,被成為集
HashSet 哈希集,是Set的一個重要實現(xiàn)類
主要方法
- boolean add(E e) 如果當前列表中不存在e, 則將e加入列表
- void clear() 從列表中刪除所有元素
- boolean contains(Object j) 判斷列表中是否有元素j
- Iterator<E> terator() 得到當前列表的遍歷器
- boolean remove(Object j) 如果列表中存在元素j,則將其從列表中刪除
- int size() 得到列表中元素的個數(shù)
使用中我發(fā)現(xiàn),在set中添加String類型的數(shù)據(jù)時,如果同時添加兩個相同的字符串,那么實際上只能添加一個,因為HashSet不允許添加相同的元素。而添加兩個相同的對象的時候卻可以添加成功,那應該怎么處理呢?
淺顯的說,String重寫了Object類的equals方法和hashCode方法。因此,在比較的時候,HashSet調用了String類中重寫的equals方法和hashCode方法。因此會按照String類中定義的判斷方式來比較對象是否相同。
判斷兩個對象是否相等的方式
首先兩個對象的hashCode是否相等,假如相等的話,那么就認為兩個對象相等
假如兩個對象的hashCode值不等,那么就通過equals方法來判斷兩個對象是否相等。默認的equals方法是比較兩個對象指向的對象在內存中存儲的地址的值是否相等。
如果利用對象里的某個值來判斷是否相同,則應該怎么處理呢?
- 首先需要重寫hashCode方法.(必須重寫hashCode方法!)
- 其次需要重寫equals方法。
假如只重寫equals方法會出現(xiàn)什么情況呢?
只重寫equals方法,那么重寫的equals方法是無效的!
原因是添加對象時首先會調用父類Object類中的hashCode方法(本地方法,無法根據(jù)散列碼得到對象的內存地址,但實際上,hashcode是根據(jù)對象的內存地址經(jīng)哈希算法得來的)。因此兩個對象的hashCode的值是不相等的!這樣就會認為這是兩個不同的元素.
public class Student implements Cloneable {
private int age;
private String name;
public Student(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student [age=" + age + ", name=" + name + "]";
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
public int hashCode() {
return name.hashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
Student other = (Student) obj;
return other.name.equals(this.name);
}
}
這樣就根據(jù)Student里的name字段判斷是是否傳入的是同一個學生對象。
HashMap和HashSet的區(qū)別
- HashMap 實現(xiàn)了 Map 接口而HashSet 實現(xiàn)了 Set 接口
- HashMap 儲存鍵值對而HashSet 僅僅存儲對象
- 使用 put() 方法將元素放入 map 中而HashSet使用 add() 方法將元素放入 set 中
- HashMap 中使用鍵對象來計算 hashcode 值而HashSet 使用成員對象來計算 hashcode 值,對于兩個對象來說 hashcode 可能相同,所以 equals() 方法用來判斷對象的相等性,如果兩個對象不同的話,那么返回 false
- HashMap 比較快,因為是使用唯一的鍵來獲取對象而HashSet 較 HashMap 來說比較慢