黑马程序员_日记42_HashSet自定义对象去重练习

Tomcat漏洞——弱口令爆破 靶机:CentOS7 IP:192.168.100.40。攻击机:kali IP:192.168.100.60。版 权 声 明:本博客所有文章除特别声明外,均采用。文章版权归作者所有,未经允许请勿转载!作 者:PeiyuJue。 阅读详情

 ——- android培训、java培训、期待与您交流! ———-

往hashSet集合中存入自定对象
姓名和年龄相同为同一个人,重复元素。

思路:
1 把数据存入Person,建立Person类
2 把Person对象存入HashSet,建立HashSet集
先运行一遍,观察运行结果,进行分析。

import java.util.*;
//1 把数据存入Person,建立Person类
class Person
{
    private String name;//姓名
    private int age;//年龄

    Person(String name,int age)
    {
        this.name = name;
        this.age = age;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public String getName()
    {
        return name;
    }

    public void setAge(int age)
    {
        this.age =age;
    }

    public int getAge()
    {
        return age;
    }
}

//主类
class HashSetTest
{
    public static void main(String[] args)
    {
        //1 创建HashSet集
        HashSet hs = new HashSet();

        //2 把Person对象存入集合
        hs.add(new Person("Jack",20));
        hs.add(new Person("Jack",20));
        hs.add(new Person("Tom",18));
        hs.add(new Person("Tom",18));
        hs.add(new Person("Mike",19));
        hs.add(new Person("Jane",26));

        //3 取出元素
        for(Iterator it = hs.iterator(); it.hasNext(); )
        {
            //强制转换为Person
            Person p = (Person)it.next();
            System.out.println(p.getName()+"---"+p.getAge());
        }
    }
}

这里写图片描述
运行结果为:
Tom—18
Jack—20
Jane—26
Jack—20
Tom—18
Mike—19
观察发现,元素并没有去重,这是为什么呢??
这是因为HashSet调用了Object中的hashCode方法!
程序是这样工作的:
JVM调用hashCode方法计算了元素的地址值,
如果地址值不冲突,则存入HashSet。
而上面调用add方法时,每一个Person对象都是在内存新开辟一块空间,
地址值都是不一样的,不可能发生地址冲突,所以都成功的存入了HashSet。

所以,首先必须要做的事就是在Person类中覆盖Object的hashCode方法!
那么到底该怎么重写呢?
这里提供两种方式:
方式一:

public int hashCode()
{
    return 60;
}

方式二:

public int hashCode()
{
    return name.hashCode()+age*37;
}

需要解释的地方:
使用方式一,程序是这样走的:
每一个对象返回的哈希值都一样,发生了冲突,
那么它们就以链表的方式链接存储,
这样存入的元素越多,效率就越低,
为了减少比较次数,
就设计到了hashCode()的算法优化能力!
这里采用了简单的处理,如方式二。

使用方式二:
name是String类型的,String类已经覆盖了hashCode()方法,
所以,可以通过调用得到name的哈希值。
而age*37是为了减少哈希值相等的几率,
减少计算量,提高效率!
同时应该考虑到int的取值范围,应当用“+”求和,
而不是直接把name的哈希值乘以age。

接着上面的思路:
3 重写Person类中的hashCode方法
运行程序,观察结果。
发现仍然有重复的元素,这是为什么呢?
这是因为在判断元素的哈希值之后,
如果哈希值相同,会调用equals方法判断内容是否一样。
这就要求:
4 重写equals方法.

import java.util.*;
//1 把数据存入Person,建立Person类
class Person
{
    private String name;//姓名
    private int age;//年龄

    Person(String name,int age)
    {
        this.name = name;
        this.age = age;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public String getName()
    {
        return name;
    }

    public void setAge(int age)
    {
        this.age =age;
    }

    public int getAge()
    {
        return age;
    }

    //重写hashCode方法
    public int hashCode()
    {
        return name.hashCode()+age*37;
    }

    //重写equals方法
    public boolean equals(Object obj)
    {
        //强制转换Person类型
        Person p = (Person)obj;

        //判断是否为同一个人
        return this.getName().equals(p.getName()) && this.getAge()==p.getAge();
    }
}

//主类
class HashSetTest
{
    public static void main(String[] args)
    {
        //1 创建HashSet集
        HashSet hs = new HashSet();

        //2 把Person对象存入集合
        hs.add(new Person("Jack",20));
        hs.add(new Person("Jack",20));
        hs.add(new Person("Tom",18));
        hs.add(new Person("Tom",18));
        hs.add(new Person("Mike",19));
        hs.add(new Person("Jane",26));

        //3 取出元素
        for(Iterator it = hs.iterator(); it.hasNext(); )
        {
            //强制转换为Person
            Person p = (Person)it.next();
            System.out.println(p.getName()+"---"+p.getAge());
        }
    }
}

这里写图片描述
运行结果:
Tom—18
Jane—26
Jack—20
Mike—19
说明已经成功去重了,HashSet中已经不存在同名同年龄的人了!

总结:在HashSet中,存入元素是先判断哈希值是否一样,再判断内容是否一样!
hashset为了保证元素唯一:
1 如果元素哈希值相同,就判断equals是否为true;
2 如果哈希值不相同,不会调用equals方法。
此外,contains()和remove()等操作,HashSet都是依赖hashCode()和equals方法。
所以在类中必须重写这两个方法,才能保证元素唯一!

微信小程序转发功能异常报错 由于小程序违规分享功能暂时无法使用的解决办法 小程序右上角转发功能被封,不代表你违规了,而可能是你没认证、没备案!很多功能都是“先合规、后开发”,踩坑就晚了,别像我一样绕了三圈才发现问题。 阅读详情

相关推荐

告别过热焦虑:用Ansys Icepak给你的电子设备做个“水冷体检”(附冷板案例全流程)

本文详细介绍了如何利用Ansys Icepak进行电子设备水冷系统的热仿真分析,帮助工程师解决设备过热问题。通过冷板案例全流程演示,展示了从几何处理、材料设定到求解器设置和后处理的关键步骤,提升散热设计效率与准确性。

weixin_29299807的博客 440

集合的知识点+ 案例练习

集合的知识点+ 案例练习

aichixuanmai的博客 1374

Python+QMT量化交易实战:从零搭建你的第一个极速策略(附完整代码)

本文提供了一份详细的Python+QMT量化交易实战指南,手把手教你从零搭建一个可回测、可实盘的极速策略。内容涵盖环境配置、QMT核心机制解析、双均线策略的完整代码实现、回测优化方法以及实盘部署要点,帮助量化交易新手快速入门并掌握核心开发流程。

b9c0d的博客 1012

JAVA_ArrayList和HashSet

ArrayListArrayList在Java中主要是以线性表的形式进行存储,其本质是数组,不过相对于数组的长度不可变这一缺点,其实行了长度可变策略,使你在使用时,感觉到其就是一个无限长度的数组,而在底层中,则是通过动态增加长度来实现的,ArrayList就像是排队,没来一个对象或者元素,都会被添加到末尾位置(默认情况下),当然也免不了熟人插队的情况,此时就要指定相应位置,位置之前的元素...

weixin_30784945的博客 149

L3 级自动驾驶 2025:法规突破与车企技术路线竞争

2025年L3级自动驾驶迎来规模化商业落地关键期。全球主要经济体在法规、技术、市场三方面取得突破:中国通过《北京市自动驾驶汽车条例》明确责任划分,欧盟设立严格技术认证标准。技术路线呈现"多传感器融合为主流,纯视觉为补充"格局,华为、特斯拉等企业展开硬件军备竞赛与算法架构革新。中国车企在技术验证和规模化应用方面领先,而欧美车企侧重生态整合。尽管面临成本控制、责任认定和用户信任等挑战,随着技术进步和车路协同发展,L3自动驾驶正从高端选配向大众化普及迈进,为L4级奠定基础。

2301_77933942的博客 3097

MATLAB多项式计算

MATLAB多项式计算 在MATLAB中,n次多项式用一个长度为n+1的行向量表示(因为是n个幂次项系数加上一个常数项),缺少的幂次项系数为0。 例如 n次多项式: P(x)=anxn+an-1xn-1+an-2xn-2+…+a1x+a0 表示为: [an,an-1,an-2,…,a1,a0] 目录MATLAB多项式计算1.多项式的加减运算2.多项式的乘法运算3.多项式的除法运算4.多项式的导函数5.代数多项式求值6.矩阵多项式求值7.多项式求根 1.多项式的加减运算 事实上,多项式的加减运算就是其所对应的

路遥芝麻的博客 1万+

自定义对象排序Java

在项目开发中,有时API提供的方法不能满足实际需求,就需要自定义方法来进行,比如说,对一组对象进行排序,先根据学号排序,学号一样(假设有学号一样的学生),再根据年龄进行排序,年龄一样的再根据姓名排序,下面用两种方式实现。 第一种:Comparable接口实现 测试类: import java.util.Set; import java.util.TreeSet; public class Tex...

青云----小凡 197

1篇2章1节:在 Mac 上安装 Python,从环境检查到工具配置的完整指南

Python 是当今最流行的高级编程语言之一,广泛应用于数据分析、人工智能、自动化脚本和 Web 开发。虽然 macOS 曾自带 Python,但从 macOS 12.3 开始,系统不再默认提供可直接使用的版本,因此需要手动安装。本文将详细讲解如何在 Mac 上安装最新版本的 Python,如何验证安装是否成功,以及如何配置 IDLE 和 Python Launcher 等工具,为日常开发和学习打下坚实基础。即便你是完全的新手,也能按步骤完成环境搭建。

MD Code 848

浅谈Java中的hashcode方法

 浅谈Java中的hashcode方法   哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率。在Java的Object类中有一个方法: public native int hashCode();   根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法,因此在Object类中并没有给出具体的实现。   为何Object类...

weixin_30586085的博客 485

终于找到两个稳定好用的Docker镜像加速源,拉取速度提升几十倍!

国内使用Docker经常遇到镜像拉取慢、超时失败的问题🐳 本文分享两个亲测好用的免费镜像加速源⚡ 实测拉取速度从十几分钟缩短到几十秒,稳定性接近100%📊 支持一键配置脚本,支持多平台使用✨

XiaoqiangClub的博客 947

Python李峋同款跳动的爱心(完整代码)

Python语言实现李峋同款可写字版跳动的爱心的完整代码。

AIGC 4万+

在HashSet集合中添加三个Person对象,把姓名相同的人当做同一个人,禁止重复添加

16、在HashSet集合中添加三个Person对象,把姓名相同的人当做同一个人,禁止重复添加。 提示: 1)Person类中定义name和age属性,重写hashCode()方法和equals()方法,针对Person类的name属性进行比较,如果name相同,hashCode()方法的返回值相同,equals方法返回true。 import java.util.*; public cla

:)一位靓仔偶然路过的博客 2万+

杰理可视化SDK开发-杰理AC1123N芯片SDK开发笔记合集

该文档主要描述 AC112N开发相关的使用说明和注意事项,收集并持续更新开发调试过程中的相关疑问和解答,对SDK介绍文档做一个补充说明。写作人:李永奉,参考项目MD-026H; AC112N-SDK项目帮助文档在杰理开发者平台(JL DP)'帮助'处进入,如本文档有与后续帮助文档或工具注释说明冲突,以后者为标准。

李永奉的博客 180

黑马程序员-HashSet讲解学习日记

package heimaLog; import java.util.*; /*  * set集合特点是元素无序,(存入和取出的顺序不一定一致)元素不可以重复。  * set集合的功能和Collection功能一致  *    set常见子类  *        HashSet :底层数据结构式哈希表  *        TreeSet :底层数据是二叉树  *  * Hash

qq330772290的专栏 439

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

VC中sqlite的使用

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

黑马程序员 学习日记(六)

Java里的集合框架 以下介绍经常使用的集合类,这里不介绍集合类的使用方法,只介绍每个集合类的用途和特点,然后通过比较相关集合类的不同特点来让我们更深入的了解它们。   Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。 所有实现Collection接口的类都必须提供两个

jwx555的专栏 429

温度PID控制PLC程序

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

黑马程序员——学习日记5

Set类集合   Set接口:Collection接口的子接口,元素不可以重复,是无序。         Set接口中的方法和Collection接口的一致。         |--HashSet:内部数据结构是哈希表,是不同步的。         |--TreeSet:内部数据结构是二叉树,是不同步的。 1、HashSet类     哈希表确定元素是否相同   1、判断的是两个

afiyo的博客 369

黑马程序员 课后日记-集合方法

---------------------- android培训、java培训、期待与您交流! ---------------------- 直接开写 因为List有角标,是具备增删改查的集合。 addFirst() addLast() getFirst() removeFirst()这一类方法是linkedList特有的方法 getFirst() 获取但不删除 re

Rofire的专栏 444

黑马程序员——基础学习日记(集合)

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 学习日记:集合部分 为什么出现集合类? 面向对象对事物的体现都是以对象的形式,为了方便对多个对象的操作,就对对象进行存储。 集合就是存储对象最常用的一种方式. 数组和集合都是容器,两者有何不同? **数组长度固定,而集合长度是可变的 **数组值可以存储对象,还可以存储基

wjy1090233191的专栏 531

黑马程序员-HashSet存储自定对象如何确定元素唯一学习日记

---------------------- "http://www.itheima.com"target="blank">ASP.Net+Unity开发、"http://www.itheima.com"target="blank">.Net培训、期待与您交流! ----------------------

qq330772290的专栏 399

黑马程序员日记-19

1:泛型(次重点)  (1)不确定的类型,广泛的类型。  (2)基本格式: 注意了:数据类型必须是引用数据类型  (3)泛型的定义方式   A:泛型定义在类上    class Demo    {     public void show(QQ qq){}    }   B:泛型定义在方法上    class Demo    {     public void sho

sinat_32832713的博客 362

黑马学习日记11

黑马程序员-学习日记11 ------http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 一  集合:java语言是面向对象的语言,对事物的体现都是以对象存在的。我们要对多个对象进行存储和操作,以前只能用数组,而数组有弊端,长度固定。所以有了新的容器集合供我们使用

qq_26857297的专栏 316

黑马程序员-学习日记07

7.、Set Set容器的特点是,元素的存入和取出的顺序不一致,且不能出现重复元素。 其常用实现类包括HashSet、TreeSet. (1)HashSet HashSet是线程不同步的容器,底层实现方式是Hash表,所以在该类的很多方法中,底层都掉用了HashCode()方法的返回值,除此之外,还用到了equals()方法。 例如在向一个HashSet实例中,添加一个元素,会首先看该对

qq_31131735的博客 307

黑马程序员_日记41_HashSetDemo

——- android培训、java培训、期待与您交流! ———-Set集其实就是一个不包含重复元素的 collection。 Set元素存取是无序的,就是说元素取出和存入的顺序不一致; Set元素是不可以重复的,就是说Set元素具有唯一性。 Set和Collecion的功能是一样的。Set常见的子类有: HashSet和TreeSet。HashSet的底层是哈希表,多线程实现是不同步的,这

itheima_1llt的专栏 421

黑马程序员_JAVA学习日记_JAVA中API:集合框架1(Collection,List,Set及其子类和迭代器的应用)

黑马程序员-学习日记   黑马程序员_JAVA中集合框架1(Collection,List,Set及其子类和迭代器的应用)   ------- android培训、java培训、期待与您交流! ----------   一:集合是用于存储对象的一个工具。 集合和数组的特点: 1.相同点:        集合和数组都一个容器。 2.集合:     1,可以存储对象,只能存储对象

Java程序员命运之改变 1164

黑马程序员Java基础加强25-32学习日记

1,hashCode方法,将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,根据一个对象的哈希码就可以确定该对象应该存储在哪个区域,用哈希算法可以提高从集合查找元素的效率。2,HashSet就是采用哈希算法存储对象的集合,它内部采

qiyun2012的专栏 366

黑马程序员Java学习日记(4)集合(一)

------- android培训、java培训、期待与您交流! ----------                    黑马程序员Java学习日记(4)集合(一) 1.前言: (1)为什么会出现集合类:     面向对象对事物的体现都是以对象的形式体现的,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的的一种方式。   (2)数组和集合类的区别:  

zhanghao_abc的专栏 679

黑马程序员 学习日记(七)

Java中的集合框架-续 上一篇重点介绍了常用的类、j

jwx555的专栏 450
上一篇: 黑马程序员_日记41_HashSetDemo
下一篇: 黑马程序员_日记43_初学TreeSet
回到未来2020
博客等级 码龄12年 27粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值