Java連載88-HashSet集合與hashCode方法重寫

1、Set集合java

1.HashSet底層其實是一個HashMap,HashMap底層採用了哈希表數據結構。node

2.哈希表又稱爲散列表,哈希表底層是一個數組,這個數組中每個元素是一個單向鏈表,每一個單向鏈表都有一個獨一無二的hash值,表明數組的下標。在某個單向鏈表中的每個節點上的hash值是相等的,hash值其實是key調用hashCode方法,再經過"hash function"轉化成的值。git

3.如何向哈希表中添加元素github

先調用被存儲的key的hashCode方法,通過某個算法得出的hash值,若是在這個哈希表中不存在這個hash值,則直接加入元素。若是該hash值已經存在,繼續調用key之間的equals方法,若是equals方法返回false,則將該元素添加。若是equals方法返回true,則放棄添加該元素。算法

4.HashSet實際上是HashMap中的key部分,HashSet有什麼特色,HashMap中的key應該具備相同的特色。數組

5.HashMap和HashSet初始化容量都是16,默認加載因子0.75微信

 

package com.bjpowernode.java_learning;

​

import java.util.HashSet;

import java.util.Set;

import java.util.Iterator;

​

public class D88_2_ {

  public static void main(String[] args) {

    Set s = new HashSet();

    s.add(1);

    s.add(1);

   

    s.add(100);

    Iterator i = s.iterator();

    while(i.hasNext()) {

      System.out.println(i.next());

    } 

  }

}

2、重寫hashCode和equals方法(​有一個原則:散列均勻分佈)數據結構

 

package com.bjpowernode.java_learning;

import java.util.*;

​

public class D88_2_HasCodeAndEqualsMethod {

  public static void main(String[] args) {

    //建立集合

    Set s = new HashSet();

    Employee88 e1 = new Employee88("1000","Jack");

    Employee88 e2 = new Employee88("1001","Jack");

    Employee88 e3 = new Employee88("1001","Scott");

    Employee88 e4 = new Employee88("1000","Jack");

    Employee88 e5 = new Employee88("3000","JIN");

    Employee88 e6 = new Employee88("3001","Cook");

    //添加元素

    s.add(e1);

    s.add(e2);

    s.add(e3);

    s.add(e4);

    s.add(e5);

    s.add(e6);

   

    System.out.println(s.size());

  }

}

//根據現實的業務邏輯能夠得知,該公司的員工編號是:1000-9999

class Employee88{

  //編號

  String no;

  //姓名

  String name;

  //Constructor

  Employee88(String no,String name){

    this.no = no;

    this.name = name;

  }

  //咱們下面重寫了hashCode方法的目的就是:

  //可以對同工號同名字的員工判斷爲同一個元素

  //若是不重寫hashCode方法,那麼會對對象的內存地址進行hashCode計算,這樣就不會有相同的元素了

  //重寫hashCode方法以後,相同的hashCode值,就會接下來的判斷

  //也就是重寫equals方法

  //若是員工編號相同,而且名字相同,則是同一個對象

  public boolean equals(Object o) {

    if(this==o) {

      return true;

    }

    if(o instanceof Employee88) {

      Employee88 e = (Employee88)o;

      if(e.no.equals(this.no) && e.name.equals(this.name)) {

        return true;

      }

    }

    return false;

  }

 

  //重寫hashCode方法

  public int hashCode() {

    //以員工編號分組

    return no.hashCode();

  }

}

​

​解釋:六個對象裏面有一個徹底相同,所以會輸出五個元素​;若是不重寫的話,就會輸出六個元素​。學習

總結​:存儲在HashSet集合或者HashMap集合key部分的元素,須要同時重寫hashCode和equals方法​大數據

3、源碼:

D88_1_HashSetExample.java

D88_2_HasCodeAndEqualsMethod.java

https://github.com/ruigege66/Java/blob/master/D88_1_HashSetExample.java

https://github.com/ruigege66/Java/blob/master/D88_2_HasCodeAndEqualsMethod.java

2.CSDN:https://blog.csdn.net/weixin_44630050

3.博客園:https://www.cnblogs.com/ruigege0000/

4.歡迎關注微信公衆號:傅里葉變換,我的公衆號,僅用於學習交流,後臺回覆」禮包「,獲取大數據學習資料

 

相關文章
相關標籤/搜索