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.欢迎关注微信公众号:傅里叶变换,我的公众号,仅用于学习交流,后台回复”礼包“,获取大数据学习资料

 

相关文章
相关标签/搜索