向HashSet插入自定义对象判断是否重复

Java集合方面的面试题:Set集合是如何判断重复 在这个部分总结了2019年到目前为止Java常见面试问题,取其面试核心编写成这份文档笔记,从中分析面试官的心理,摸清面试官的“套路”,可以说搞定90%以上的Java中高级面试没一点难度。本节总结的内容涵盖了:消息队列、Redis缓存、分库分表、读写分离、设计高并发系统、分布式系统、高可用系统、SpringCloud微服务架构等一系列互联网主流高级技术的知识点。(上述只是一个整体目录大纲,每个点里面都有如下所示的详细内容,从面试问题——分析面试官心理——剖析面试题——完美解答的一个过程) 阅读详情

一.HashSet概述

HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元素。

二.存储方式与实现

如果不等,则添加到该数组索引对应的链表中。

Set的实现类的集合对象中不能够有重复元素,HashSet也一样他是使用了一种标识来确定元素的不重复,HashSet用一种算法来保证HashSet中的元素是不重复的,HashSet采用哈希算法,底层用数组存储数据。默认初始化容量16,加载因子0.75

Object类中的hashCode()的方法是所有子类都会继承这个方法,这个方法会用Hash算法算出一个Hash(哈希)码值返回,HashSet会用Hash码值去和数组长度取模, 模(这个模就是对象要存放在数组中的位置)相同时才会判断数组中的元素和要加入的对象的内容是否相同,如果不同才会添加进去。

三.Hashset在判断是否重复机制

当调用了 HashSet 的 add 方法存放对象 obj , HashSet 会首先调用 obj 的 hasCode 方法得到该对象的哈希码, HashSet 会使用一个算法把它的哈希码转换成一个数组下标,该下标“标记”了 obj 的位置。如果这个位置上的链表中没有元素,那么就把 obj 对象添加到链表上。如果这个位置上的链表中已经有了元素,则遍历这个链表,调用 obj 的 equals 方法,判断 obj 是否和其中的某个元素重复,如果没有重复的元素,那么就将 obj 添加到链表上;如果有重复的元素,则不会将 obj 对象存入 HashSet 中。


四.自定义对象重复判断

所以,如果自定义类的插入查重,就要重写equals方法,在这同时,我们还的先重写hashCode方法,不然的话,HashSet插入的时候首先判断的是所生成的hashcode是否相同,如果相同的话,才会调用之前重写的equals方法。

自定义类:

public class Person {

    private String name;
    private int age;

    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

    public boolean equals(Object obj) {
        //System.out.println("执行了吗");
        Person p = (Person)obj;
        return this.name.equals(p.name) && this.age == p.age;
    }

    @Override
    public int hashCode() {
        return 10;   
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
}

在重写hashCode方法的时候,对于每个对象返回的hashcode码是都是10,所以在向HashSet中添加元素的时候都会调用equals方法,通过自己定义的相同规则,来判断是否相同。

注意点:
1.上面重写的hashcode方法中,返回的是同一个值,这样,不管对象是否相等都会调用equals方法,如果相容的元素与比较多的话,就会大大降低代码的运行效率。
2.在重写的equals方法中,并没有考虑较多的情况,代码没有健壮性。


解决:eclipse开发工具可以一键生成我们所需要的hashCode()方法,以及equals方法,我们来看看他们是怎么实现的。具体的解释都放在了源码中。

五.重构代码

public class Person {

    private String name;
    private int age;

    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

    /*
     * 为什么是31?
     * 1,31是一个质数,质数是能被1和自己本身整除的数
     * 2,31这个数既不大也不小
     * 3,31这个数好算,2的五次方-1,2向左移动5位
     */
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)                        //调用的对象和传入的对象是同一个对象
            return true;                        //直接返回true
        if (obj == null)                        //传入的对象为null
            return false;                       //返回false
        if (getClass() != obj.getClass())       //判断两个对象对应的字节码文件是否是同一个字节码
            return false;                       //如果不是直接返回false
        Person other = (Person) obj;            //向下转型
        if (age != other.age)                   //调用对象的年龄不等于传入对象的年龄
            return false;                       //返回false
        if (name == null) {                     //调用对象的姓名为null
            if (other.name != null)             //传入对象的姓名不为null
                return false;                   //返回false
        } else if (!name.equals(other.name))    //调用对象的姓名不等于传入对象的姓名
            return false;                       //返回false
        return true;                            //返回true
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
}
汽车LED驱动芯片TPS92682-Q1 SPI接口配置与调试实战指南 SPI(串行外设接口)作为一种高速、全双工的同步串行通信总线,广泛应用于微控制器与外围设备之间的数据交换。其工作原理基于主从架构,通过时钟、数据线和片选信号实现设备间的精准时序控制。在汽车电子和工业控制领域,SPI因其简单高效、易于扩展的特性,成为配置复杂电源管理芯片、传感器和存储器的关键技术。通过SPI接口,工程师能够动态调整设备参数、实时读取状态信息,并实现复杂的故障诊断与保护策略,极大地提升了系统的灵活性与可靠性。本文以汽车级双通道LED恒流驱动器TPS92682-Q1为例,深入解析如何通过SPI接口 阅读详情

相关推荐

Kindle使用USB数据线传书封面无法显示问题

不建议按这个解决封面问题,首先USB多次插拔麻烦,其次就是我起初按博主方法没啥问题,后面无论我怎么个顺序都出现了‘暂无图片’,我的建议是在亚马逊退出国内只能USB传书的情况下,下载一个calibre 和。飞行模式下用calibre传书到kindle ,然后用Fix Kindle Ebook Cover 修复一下,后面你要继续飞行模式还是连网随你便,两步完事。2,‘’发送到设备’的时候也最好选择 ‘发送特定格式至’ 选择具体的电子书格式,你的电子书是azw3就选azw3,是mobi就选mobi。

meser88的博客 7416

Java----HashSet集合、equals(判断两个字符串是否相等)、LinkedHashSet集合、迭代器、可变参数、泛型

修饰符 返回值类型 方法名(参数类型... 形参名){ }. 用在参数上,称之为可变参数。

今天会营业的博客 1406

【编译原理】龙书第三章作业答案

【编译原理】龙书第三章作业答案 练习3.1.1:根据3.1.2节中的讨论,将下面的C++程序划分成正确的词素序列。哪些词素应该有相关联的词法值?应该具有什么值? 答案: 左列为词素,右列为值,划分如下: < float> 值为它本身 <id,limitedSquare> 值为*limitedSquare指针 <(> 标点符号无值 ...

作业报告杂物间 2万+

Java中HashSet如何检查重复

HashSet是基于哈希表实现的无序的、不重复的集合类。它在添加元素时会自动检查是否存在重复元素,通过hashCode()和equals()方法来确定元素的相等性。

m0_62129859的博客 1346

Aspose Java 25.10 版本深度破解:基于字节码修改的实战指南

本文提供了Aspose Java 25.10版本基于字节码修改的实战指南。详细介绍了如何通过Javassist工具逆向分析并修改Aspose Cells、Words、Slides及PDF组件的许可证验证逻辑,从而实现绕过限制,并完成最终的打包与功能验证。

stone的博客 1352

【gcc】跨版本兼容实战:高版本编译程序在低版本glibc环境下的部署方案

本文针对高版本gcc编译的程序在低版本glibc环境下部署的兼容性问题,提供了四种实战解决方案:静态编译的局限性、容器化部署的优雅方案、使用Devtoolset工具链的官方支持,以及最通用灵活的打包依赖SO发布方案。重点剖析了通过设置RPATH和Interpreter或使用patchelf工具,实现程序与自带库的独立部署,有效解决glibc版本鸿沟。

weixin_29237635的博客 362

HashSet自定义元素类型的重复判定问题

HashSet是无重复的集合,那么问题就是如何判定一个元素是否和另一个元素是相等的。这里需要自定义相等性。相等性有两个层次 引用相等性: 如果只认为引用指向同一个对象才算相等,那么什么都不用做。对引用调用hashCode()会返回引用指向的对象特有的序号(大部分是对对象在堆上的地址的映射,因此不会有重复的序号。但也有像String一样的其实是字面值的映射),比较引用调用的hashcode()就可...

mogolola的博客 465

RouterOS网桥VLAN实战:从零构建安全隔离的二层虚拟网络

本文详细讲解了如何在RouterOS上利用网桥和VLAN功能,从零开始构建安全隔离的二层虚拟网络。通过分步实战演示,涵盖核心概念、网桥创建、PVID设置、VLAN规则配置及安全过滤,帮助网络管理员实现办公、访客与服务器网络的逻辑隔离与灵活管理,提升网络安全性。

u9v0w的博客 504

C# HashSet解决自定义对象重复的问题

之前一直在用Java,今天写WPF程序的时候需要用到Set,发现c#里只有HashSet,为解决自定义对象在HashSet中重复的问题,按照Java里的思路即可解决 思路: HashSet 判断元素是否相等 ,: 首先调用hashCode方法, 如果hashCode的值一样, 那么调用equals方法, 如果equals方法也一样, 那么才算重复元素, 不再添加 即:1>重写 GethashCode() 2>重写Equals() 这样HashSet在存储数据的时候即...

zyz的博客 1377

Briefings in Bioinformatics投稿经验分享

Briefings in Bioinformatics投稿经验分享

LiRongLu_的博客 3337

多无人车协同探索开源包部署教程及常见报错解决方式

本博客将介绍项目的基本概念、部署步骤以及常见问题的解决方案。该项目利用 RRT(Rapidly-exploring Random Tree)算法,通过多机器人协作进行高效的环境探索,适用于自动化与自主导航任务。项目简介:介绍该项目的核心算法、特点及应用场景,展示如何通过多个机器人共同工作来提升探索效率。部署教程:详细讲解如何在 ROS Noetic 环境中部署该项目,安装依赖、创建工作空间、克隆代码并编译项目。项目运行:包括单机器人与多机器人自主探索的示例,帮助读者快速理解和实践项目。

慕羽★的博客 1764

HashSet 如何检查重复?

方法来确保集合内不会出现重复元素。即使两个不同对象可能有相同的哈希码,只有当它们也通过。根据这个哈希码确定对象在集合内部存储数组中的索引位置。当一个对象被尝试添加到 HashSet 中时,首先调用该对象的。综上所述,HashSet 通过结合对象的。方法判断为相等时才会被认为是重复项。

学亮编程手记 1193

杰理 JL701N/JL703N USB MIDI 使用教程

摘要:本教程介绍如何在杰理JL701N/JL703N音箱的可视化SDK中配置USB MIDI功能。主要步骤包括:1)启用PC模式;2)修改SDK宏定义启用USB MIDI;3)实现MIDI数据接收处理逻辑;4)调用接口发送MIDI数据;5)使用MIDI-OX测试功能。针对低版本SDK可能出现的设备识别问题,提供了在midi.c文件中添加特定代码行的解决方案。使用前需确保SDK版本达标,并注意备份原始文件。

qq_42014563的博客 1263

HashSet存储自定义类型元素去重原理

HashSet是用Hash算法实现存取对象,所以每个对象都有自己的hashCode; 1.当存储自定义类型元素时,在类中必须重写hashCode()和equals()方法: 将hashCode()方法重写为属性相同的对象值返回值一样,属性不同的返回值不一样; 将equals()方法重写为属性相同时返回true,属性不同时返回false。 2.存取对象时,HashSet会调用对象的hashCode来比较Se...

wangxx的博客 602

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Set接口与HashSet、HashCode 、LinkedHashSet

Set 具有与 Collection 完全一样的接口,只是行为上不同,Set 不保存重复的元素,而且Set接口中元素无序。 package MONA.demo04_set; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class Demo01 { public static void main(String[] args) {

Mona_lxh的博客 1436

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

HashSet添加元素是怎么判断对象是否重复的?

HashSet添加元素是怎么判断对象是否重复的? 个人学习笔记,仅供参考,如有错误,望指正学习交流 说到hashset可以看到hash而想到哈希函数,通过一个函数将对象的属性字段转算出一列整数(散列码),而这个散列码便作为存储地址,这样可以极大提高查找的效率。不过再优秀的hash函数也会出现两个不同对象计算出相同散列码的情况。那么,hashset存储两个相同对象的时候到底发生了什么? 关键在于自定义类是否重写了hashcode和equals方法。 1.首先,每个自定义类都继承了Object类的hashcod

Givenchy 2032

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

HashSet如何保证元素不重复

HashSet如何保证元素不重复

2301_77752359的博客 2643

HashSet判断重复原理

这个知识点完全属于今天的意外收获\(≧▽≦)/ 首先会调用Object的hashCode方法判hashCode是否已经存在,如不存在则直接插入元素; 如果已存在则调用Object对象的equals方法判断是否返回true,如果为true则说明元素已经存在,如为false则插入元素。 注:图片是借鉴他人博客,我再上面添加了一些额外标记 首先我们看HashSet的源码中add方法 ...

Peacock__的博客 1294

JAVA基础——HashSet怎样判断元素重复

Java开发经常需要借助各种集合类,常用的集合有List、Set和Map。Map存放的是key-value形式的数据,List与Set直接存放数据。List与Set的显著区别就是,List中的数据是有序、可重复,而Set恰好相反,数据是无序且不可重复。那么Set是如何实现数据的不可重复插入,本文以HashSet为例,分析HashSet是如何实现元素不可重复。

Young的专栏 9162

HashSet如何判断插入元素重复的研究

上次面试时被面试官被到这个问题,当时没有答对,后来自己研究了下,到今天总算是弄明白了。 先定义一个类,当然既然要放入到hashSet中当然要重写hashcode()方法和equal()方法。package com.map.test;/** * Created by 74039 on 2017-02-26. */ public class Cat { private int a;

yiwuxia23的博客 664

HashSet 是如何保证元素不重复的?

本文已收录Git仓库,开源地址:gitee.com/mydb/interv… HashSet 实现了 Set 接口,由哈希表(实际是 HashMap)提供支持。HashSet 不保证集合的迭代顺序,但允许插入 null 值。也就是说 HashSet 不能保证元素插入顺序和迭代顺序相同。 HashSet 具备去重的特性,也就是说它可以将集合中的重复元素自动过滤掉,保证存储在 HashSet 中的元素都是唯一的。 1.HashSet 基本用法 HashSet 基本操作方法有:add(添加)...

欢迎来到我的博客 4139

java HashSet 如何判断元素是否存在

HashSet不能添加重复的元素,当调用add(Object)方法时候, 首先会调用Object的hashCode方法判hashCode是否已经存在,如不存在则直接插入元素; 如果已存在则调用Object对象的equals方法判断是否返回true,如果为true则说明元素已经存在,如为false则插入元素。 package test2; import java.util.HashS

xavihernandez的博客 1万+

HashSet如何保证元素不重复?

HashSet 实现了 Set 接口,由哈希表(实际是 HashMap)提供支持。HashSet 不保证集合的迭代顺序,但允许插入 null 值。也就是说 HashSet 不能保证元素插入顺序和迭代顺序相同。HashSet 具备去重的特性,也就是说它可以将集合中的重复元素自动过滤掉,保存存储在 HashSet 中的元素都是唯一的。

2401_83384536的博客 914

深入解析Java:HashSet是如何保证元素不重复的

在Java的集合框架中,HashSet是我们日常开发中最常用的去重集合工具,它能高效存储唯一元素,杜绝重复数据插入。但很多开发者只知其然,不知其所以然:HashSet底层究竟是如何实现去重的?为什么自定义对象存入HashSet必须重写hashCode()和equals()方法?本文将从源码剖析、底层原理、执行流程、流程图四个维度,深度拆解HashSet保证元素不重复的核心逻辑,彻底吃透这个经典面试高频考点。HashSet 是 Java 集合框架的成员,实现了Set接口,核心特性不允许存储重复元素;

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 1714

HashSet中是如何判断元素是否重复的

HashSet不能添加重复的元素,当调用add(Object)方法时候, 首先会调用Object的hashCode方法判hashCode是否已经存在,如不存在则直接插入元素; 如果已存在则调用Object对象的equals方法判断是否返回true,如果为true则说明元素已经存在,如为false则插入元素。 以下转载自:http://www.hijava.org/2010/02/how-to

ning109314的专栏 2万+

向HashSet中添加自定义对象如何区别添加的对象

一、问题来源 当向HashSet中添加String类型的数据时,如果同时添加两个相同的字符串,那么实际上只能添加一个,因为HashSet不允许添加相同的元素. 二、问题分析 问题来了,HashSet是如何区别两个对象(String类型的数据是引用数据类型)的? 浅显的说,String重写了Object类的equals方法和hashCode方法.因此,在比较的时候,HashSet调用了Stri...

Clearlight's Blog 1469
上一篇: java 集合之ArrayList集合元素重复删除
下一篇: java集合之TreeSet的整理
Kindle_code
博客等级 码龄12年 21粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值