zoukankan      html  css  js  c++  java
  • Java连载88-HashSet集合与hashCode方法重写

    一、Set集合

    1.HashSet底层实际上是一个HashMap,HashMap底层采用了哈希表数据结构。

    2.哈希表又称为散列表,哈希表底层是一个数组,这个数组中每一个元素是一个单向链表,每个单向链表都有一个独一无二的hash值,代表数组的下标。在某个单向链表中的每一个节点上的hash值是相等的,hash值实际上是key调用hashCode方法,再通过"hash function"转化成的值。

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

    先调用被存储的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());
    
        } 
    
      }
    
    }

    二、重写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方法​

    三、源码:

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

     

  • 相关阅读:
    window 安装使用npm
    php 身份证验证类
    php nl2br 将 变成<br />
    win10 system guard运行时监视器,关闭服务
    PHP7 引入的“??” 和“?:”的区别
    git 本地删除修改文件后从远程拉取
    深入解读阿里云Redis开发规范
    阿里云Redis开发规范
    Centos7 安装docker
    api-doc-php
  • 原文地址:https://www.cnblogs.com/ruigege0000/p/12359680.html
Copyright © 2011-2022 走看看