HashSet

 - 向Hash表中添加元素的过程?

          1. 先调用将要被存储的值key的HashCode方法得出Hash值,如果该Hash值在现有Hash表中不存在,那么直接加入元素。

          2. 如果该Hash值已经存在于当前hash表中,那么就需要继续调用key的equals()方法,如果equals()方法返回false,证明该key的值和哈希表中当前数组元素中的链表中的数据的值不相等,又因为Set集合的特定点
是无序不可重复,所以只有Key值和已存在于链表中的值不相等的情况下才能将该Key添加进去。 3. 如果key调用equal()方法返回true,证明该key值和哈希表当前数组元素中的链表中的值存在重复,则放弃添加。 - 当我们向set集合中添加值相等的对象(key)时,为什么可以添加进去呢? * 因为该对象类中没有重写HashCode()方法,两条数据的数据值虽然相同,但是两条数据的内存地址是不同的,所以得到的HashCode值也是不同的。所以就需要在该类中重写HashCode方法。 * 如果想要equals()方法百分之百被执行,怎么办? - 重写HashCode()方法,让HashCode()方法返回一个固定值就可以了, 因为当Set集合中的所有元素的hashCode值都相等的时候,就会使用equals方法继续比较。 - 但是这样操作就会造成一个问题,因为所有元素的hashCode值都是相等的,hashCode值又指向了底层hash表中数组的下标,当hashCode值相等的时候,也就指向了数组中的同一个元素,所以加进去的所有元素都
会加在一个单向链表上,这样底层的hash表也就失去了意义。所以hashCode()方法不能返回一个固定值。 - 存储在HashSet集合 或者 HashMap集合中的元素,需要同时重写HashCode()方法 和 HashMap()方法 - 重写HashCode()方法,要尽量做到散列均匀分布,以便数据合理存储,提高检索效率。 - 代码实例 ```
员工类 public class Employee { //属性
String empno; // 规定 该公司员工编号是 1000~9999
String ename; // 构造方法
Employee(){}
Employee(String empno,String ename){
this.empno=empno;
this.ename=ename;
} // 重写equals()方法 如果员工的姓名和员工号都相等那么就返回true
public boolean equals(Object object){
if(this==object){
return true;
}
if(object instanceof Employee){
Employee employee=(Employee) object;
if(employee.empno.equals(this.empno) && employee.ename.equals(this.ename)){
return true;
}
}
return false; } // 重写HashCode()方法 重写HashCode()方法 只有一个目的,那就是尽量做到散列均匀分布。 // 如果想要equals()方法百分之百被执行,那么HashCode返回一个固定值就可以了。
// 因为当Set集合中的所有元素的hashCode值相等的时候,就会使用equals方法继续比较。
// 但是这样操作就会造成一个问题,因为所有元素的hashCode值都是相等的,所以加进去的所有元素都会加在一个单向链表上,这样底层的hash表也就失去了意义。 public int hashCode(){ //以员工编号分组,将String类型的empno转换为int类型。然后除以1000,那么所有编号为1的是一组,为2的是一组,以此类推。
int groupId= Integer.parseInt(empno.toString());
return groupId/1000; } //重写toString方法
@Override
public String toString() {
return "Employee{" +
"empno='" + empno + '\'' +
", ename='" + ename + '\'' +
'}';
}
} ```
主类: mport java.util.HashSet;
import java.util.Iterator;
import java.util.Set; public class SetTest02 {
public static void main(String[] args) { //创建员工set集合
Set emp= new HashSet(); //父类引用指向子类对象 // 创建员工对象
Employee employee1=new Employee("1000","Smith");
Employee employee2=new Employee("1001","Eva");
Employee employee3=new Employee("1002","Morty");
Employee employee4=new Employee("1003","Rick");
Employee employee5=new Employee("1004","Michael");
Employee employee6=new Employee("2000","Jack");
Employee employee7=new Employee("3000","Mike"); // 添加元素
emp.add(employee1);
emp.add(employee2);
emp.add(employee3);
emp.add(employee4);
emp.add(employee5); // 查看集合中的元素个数
int empNumber=emp.size();
System.out.println(empNumber); // 此时再向集合中加入一条数据,该条数据和上面的数据重合
//emp.add(employee6);
System.out.println(emp.size()); //6 // 获取HashCode
System.out.println(employee1.hashCode()); //460141958
System.out.println(employee2.hashCode()); //21685669 // 集合长度输出为6,证明和集合中已有数据值相同的最后一条数据也成功加载到了Set集合中,可是Set集合是无序不可重复的集合,为什么可以加进去呢?
// 因为: 没有重写HashCode()方法,两条数据的数据值虽然相同,但是两条数据的内存地址是不同的,所以得到的HashCode值也是不同的。所以需要重写HashCode方法 //再次向集合中添加元素
emp.add(employee6);
emp.add(employee7);
System.out.println(emp.size()); //遍历集合
Iterator iterator=emp.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
} // 获取HashCode
System.out.println(employee3.hashCode()); // 1
System.out.println(employee4.hashCode()); // 1
System.out.println(employee6.hashCode()); // 2
System.out.println(employee7.hashCode()); // 3 }
}

Day09_43_Set集合_HashSet_02(HashCode方法 与 equals方法 )的更多相关文章

  1. java 集合 HashSet 实现随机双色球 HashSet addAll() 实现去重后合并 HashSet对象去重 复写 HashCode()方法和equals方法 ArrayList去重

    package com.swift.lianxi; import java.util.HashSet; import java.util.Random; /*训练知识点:HashSet 训练描述 双色 ...

  2. 为什么要重写hashCode()方法和equals()方法及如何重写

    我想写的问题有三个: 1.首先我们为什么需要重写hashCode()方法和equals()方法 2.在什么情况下需要重写hashCode()方法和equals()方法 3.如何重写这两个方法 **** ...

  3. hashCode()方法与equals()方法

    摘自别人的评论:http://blog.csdn.net/fhm727/article/details/5221792 当向集合Set中增加对象时,首先集合计算要增加对象的hashCode码,根据该值 ...

  4. JavaSE-28 hashCode()方法、equals()方法和==相关概念

    概述 Java中,Object类是所有类的基类:如果一个类没有明确继承其他已定义的类,则默认继承Object类. Object类提供了以下方法,对于其他方法,请参考前期专题描述. hashCode() ...

  5. 浅谈Java中的hashcode方法以及equals方法

    哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 根据这个 ...

  6. hashCode()方法和equals方法的重要性。

    在Object中有两个重要的方法:hashCode()和equals(Object obj)方法,并且当你按ctrl+alt+s时会有Generator hashCode()和equals().我们不 ...

  7. java中hashCode方法与equals方法的用法总结

    首先,想要明白hashCode的作用,必须要先知道Java中的集合. 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重 ...

  8. Java 重写hashCode 方法和equals方法

    package Container; import java.util.HashSet; import java.util.Iterator; /* Set 元素是无序的(存入和取出的顺序不一定一致) ...

  9. hashCode()方法与equals()方法的说明

    1,一般我们自己用时,只使用equals()方法,用于判断两个对象是否是业务上等价的.2,在重写equals()方法时,强烈推荐也要重写hashCode()方法,因为有的集合用到了hashCode() ...

随机推荐

  1. es初步搭建

    1.es tar包传至linux上 并解压 tar -zxvf elasticsearch-7.4.0-linux-x86_64.tar.gz 2.新建用户 useradd xxxname passw ...

  2. vue的el-select标签全选以及出现需要有禁用选项

    首先说一下遇到这种问题的解决思路吧,很简单先去https://element.eleme.cn/#/zh-CN 这个官网上找到对应的需求,然后就是拼接数据的问题. 以下是全选的例子: <el-s ...

  3. DRF 三大认证的配置及使用方法

    目录 三大认证 一.身份认证 1.身份认证配置 1.1 全局配置身份认证模块 1.2 局部配置身份认证模块 2.drf提供的身份认证类(了解) 3.rf-jwt提供的身份认证类(常用) 4.自定义身份 ...

  4. Svelte 码半功倍

    你未注意到的最重要的指标. 注意:原文发表于2019-04-20,随着框架不断演进,部分内容可能已不适用. 所有代码都有 BUG,你写的越多,BUG 越多,这很合情合理. 同时,写的越多,费时越多,留 ...

  5. 第29天学习打卡(迭代器、泛型 、Collection工具类、set集合的特点及应用、Map集合的特点及应用)

    迭代器 对过程的重复,称为迭代. 迭代器是遍历Collection集合的通用方式,可以在对集合遍历的同时进行添加.删除等操作. 迭代器的常用方法 next():返回迭代的下一个元素对象 hasNext ...

  6. JWT原理及常见攻击方式

    JWT的全称是Json Web Token.它遵循JSON格式,将用户信息加密到token里,服务器不保存任何用户信息,只保存密钥信息,通过使用特定加密算法验证token,通过token验证用户身份. ...

  7. brew安装MySQL V5.7

    目录 安装 设置密码 启动 安装 brew install mysql@5.7 // 安装 brew link --force mysql@5.7 // 链接 brew services start ...

  8. 漫漫Java路1—基础知识—初涉java

    前言 主学信息安全,在编程的路上还是一个孩子,还在一步一步探索,有些东西可能是站在自己的位置思考的,很可能会出现一些啼笑皆非的错误,如果有误,还希望各位斧正. Java安装 jdk的安装 甲骨文官网选 ...

  9. 如何在 ASP.Net Core 中使用 Serilog

    记录日志的一个作用就是方便对应用程序进行跟踪和排错调查,在实际应用上都是引入 日志框架,但如果你的 日志文件 包含非结构化的数据,那么查询起来将是一个噩梦,所以需要在记录日志的时候采用结构化方式. 将 ...

  10. [THUPC2019] 找树

    一.题目 点此看题 二.解法 这道题很离谱啊,看上去是求一个最大值,其实是把生成树权值为 \(i\) 的个数都给算出来,因为权值很小. 既然是生成树可以考虑矩阵树定理,我们考虑他是求这样一个式子: \ ...