Set

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方法是比較兩個對象指向的對象在內存中存儲的地址的值是否相等。
    如果利用對象里的某個值來判斷是否相同,則應該怎么處理呢?
  1. 首先需要重寫hashCode方法.(必須重寫hashCode方法!)
  2. 其次需要重寫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 來說比較慢
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容