JAVA中list.contains()方法,要重写equals(),hashcode()方法_list.contains重写equals方法-程序员宅基地

技术标签: 【数据结构和算法】  

object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true;
注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。如下:
(1)当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true
(2)当obj1.hashCode() == obj2.hashCode()为false时,obj1.equals(obj2)必须为false
如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址,重写之后目的是为了比较两个对象的value值是否相等。特别指出利用equals比较八大包装对象
(如int,float等)和String类(因为该类已重写了equals和hashcode方法)对象时,默认比较的是值,在比较其它自定义对象时都是比较的引用地址
hashcode是用于散列数据的快速存取,如利用HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashcode值来进行判断是否相同的。
这样如果我们对一个对象重写了euqals,意思是只要对象的成员变量值都相等那么euqals就等于true,但不重写hashcode,那么我们再new一个新的对象,
当原对象.equals(新对象)等于true时,两者的hashcode却是不一样的,由此将产生了理解的不一致,如在存储散列集合时(如Set类),将会存储了两个值一样的对象,
导致混淆,因此,就也需要重写hashcode()
举例说明:

import java.util.*;

public class HelloWorld {
    public static void main(String[] args) {
        /*
        Collection c = new HashSet();
        c.add("hello");
        c.add(new Name("f1","l1"));
        c.add(new Integer(100));
        c.remove("hello"); 
        c.remove(new Integer(100));
        System.out.println(c.remove(new Name("f1","l1")));
        */
        Name n1 = new Name("01");
        Name n2 = new Name("01");

        Collection c = new HashSet();
        c.add(n1);
        System.out.println("------------");
        c.add(n2);
        System.out.println("------------");
        System.out.println(n1.equals(n2));
        System.out.println("------------");
        System.out.println(n1.hashCode());
        System.out.println(n2.hashCode());
        System.out.println(c);
    }


}
class Name {
    private String id;
    public Name(String id) {
        this.id = id; 
    }

    public String toString(){
        return this.id;
    }
    public boolean equals(Object obj) {
        if (obj instanceof Name) {
            Name name = (Name) obj;
            System.out.println("equal"+ name.id);
            return (id.equals(name.id));
        }
        return super.equals(obj);
    }

    public int hashCode() {
        Name name = (Name) this;
        System.out.println("Hash" + name.id);
        return id.hashCode();

    }
}

image.png

就这个程序进行分析,在第一次添加时,调用了hashcode()方法,将hashcode存入对象中,第二次也一样,然后对hashcode进行比较。hashcode也只用于HashSet/HashMap/Hashtable类存储数据,所以会用于比较,需要重写
总结,自定义类要重写equals方法来进行等值比较,自定义类要重写compareTo方法来进行不同对象大小的比较,重写hashcode方法为了将数据存入HashSet/HashMap/Hashtable类时进行比较

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ccj659/article/details/80495427

智能推荐

数字孪生模型构建理论及应用-程序员宅基地

文章浏览阅读5.4k次,点赞3次,收藏42次。源自:计算机集成制造系统作者:陶飞 张贺 戚庆林 徐 俊 孙铮 胡天亮 刘晓军 刘庭煜 关俊涛 陈畅宇 孟凡伟 张辰源 李志远 魏永利 朱铭浩 肖斌数字孪生作为实现数字化转型和促进智能化升级的重要使能途径,一直备受各行各业关注,已从理论研究走向了实际应用阶段。数字孪生是以多维虚拟模型和融合数据双驱动,通过虚实闭环交互,来实现监控、仿真、预测、优化等实际功能服务和应用需求,其中数字孪生模型构建是实现数字孪生落地应用的前提。_数字孪生模型

spring揭秘总结(一)——spring的Ioc容器_spring ioc容器-程序员宅基地

文章浏览阅读1.3k次。spring揭秘这本权威书籍阅读后的总结分享,希望能帮助到你_spring ioc容器

SQLServer中top关键字的用法_sql server top-程序员宅基地

文章浏览阅读6.4k次,点赞2次,收藏12次。实例1.select top 10 * from 成绩信息 作用:查询前十行数据2.select top 10 percent * from 成绩信息 作用:查询前10%行的数据3.declare @i int set @i=20 select top (@i) percent * from 成绩信息声明了一个变量i为整型,然后对变量i复制为20,然后就可以限制20%行数的数据了。4.declare @i int set @i=20 ..._sql server top

2020牛客国庆集训派对day5 B.Hyperdrome_b\hyperdrome-程序员宅基地

文章浏览阅读2.9k次。2020牛客国庆集训派对day5 B.Hyperdrome题目链接题目描述Hypergnome planet is famous for its Great Universal Games between gnomes — the Games between gnomes from each part of the galaxy in various disciplines.The most popular discipline in the Games is the Hyperdrome disc_b\hyperdrome

Python界面 PyQT可视化开发(python3+PyQt5+Qt Designer)-程序员宅基地

文章浏览阅读7.5k次,点赞15次,收藏71次。前言 以前制作一个Python窗体界面,我都是用GUI窗口视窗设计的模块Tkinter一点一点敲出来的,今天朋友问我有没有Python窗体的设计工具,“用鼠标拖拖”就能完成窗体设计,我查了查相关资料,果然有一款好用的工具——Qt Designer。1.安装Qt Designer 这里需要安装两个东西:PyQt5和PyQt5-tools:安装PyQt5:打开CMD或者PowerShell,在命令窗中输入 pip install PyQt5 执行结果如下:..._pyqt可视化

工具类更新第二弹,继续加速中!_java 更新设备状态的工具类-程序员宅基地

文章浏览阅读1.2k次。转载请注明出处:王亟亟的大牛之路5号的时候把自己的老版工具类贴了出来,然后今天上午又加了一点内容进去,然后也是简单的几个Button跑下,看看效果。 新增了两个类,一个手机信息类,一个数据格式转换类。PhoneUtilpublic class PhoneUtil { /*获取手机CPU信息*/ public static String[] getCpuInfo() {_java 更新设备状态的工具类

随便推点

ezcad旋转轴标刻参数_激光打标机软件ezcad中的曲线圆弧排文本参数说明及设置...-程序员宅基地

文章浏览阅读2.9k次。或者单击FI 图标。在绘制文字命令下,按下鼠标左键即可创建文字对象。4.7.2 激光打标机软件EzCad2 支持曲线排文字,如果您单击的位置足够接近于一条曲线图形,那么您输入的文字将会随着该曲线的轨迹排列。当前文字是曲线排文字时,点击 后系统弹出如图 4-12 所示对话框 。图 4-12 曲线文字表示文字总是平行于曲 线的切线放置,如图 4-13 所示。图 4-13 正常放置表示文字总是垂直放置,..._ezcad激光打标详细教程

打开视频文件提示服务器异常,视频解析服务器异常-程序员宅基地

文章浏览阅读1.2k次。视频解析服务器异常 内容精选换一换修改DNS服务器可以很快同步到顶级域服务器并在网络中生效。但是,域名服务商处NS记录的TTL值通常设置为48小时,这样假如某些地区Local DNS缓存了域名的NS记录,则最长需要48小时才能刷新成新的NS记录,变更为修改后的DNS服务器。因此,修改域名DNS服务器的生效时间请以域名服务商处的说明为准。在等待修改生效期间,请勿删除域名在原反向解析主要应用于自建邮箱..._云聚鹰视频解析错误

K-means算法和高斯混合模型的异同_高斯混合模型和kmeans之间有什么区别-程序员宅基地

文章浏览阅读1.5w次,点赞11次,收藏52次。写这篇文章的缘由是因为早上的机器学习讨论班大家对于一句话:用于向量化的k均值是高斯混合模型的一个硬版本(出处:机器学习导论,隐马尔科夫模型,p247,(15-36))产生了深刻的思考然后不理解,在结合老师的讲解以及搜索资料后,决定记录下来。这一部分属于无监督学习的内容,无监督学习内容主要包括:Kmeans聚类算法、高斯混合模型GMM及EM算法等。Kmeans聚类其实聚类算法除了Kmeans,还有其..._高斯混合模型和kmeans之间有什么区别

精简指令集(RISC)和复杂指令集(CISC)的区别_精简指令集和复杂指令集-程序员宅基地

文章浏览阅读2.4k次。RISC是精简指令集CPU,指令位数较短,内部还有快速处理指令的电路,使得指令的译码与数据的处理较快,所以执行效率比CISC高,不过,必须经过编译程序的处理,才能发挥它的效率,我所知道的IBM的 Power PC为RISC CPU的结构,CISCO 的CPU也是RISC的结构。复杂指令集CPU内部为将较复杂的指令译码,也就是指令较长,分成几个微指令去执行,正是如此开发程序比较容易(指令多的缘故),但是由于指令复杂,执行工作效率较差,处理数据速度较慢,PC 中 Pentium的结构都为CISC CPU。_精简指令集和复杂指令集

wps 字体对系统无效_linux版WPS系统缺失字体的解决办法-程序员宅基地

文章浏览阅读1.3k次。每次启动linux版WPS就会弹出“系统缺失字体……”提醒对话框,对于系统缺失字体有以下几种:wingdings、wingdings 2、wingdings 3、Webdings、MT Extra,下面就来讲解如何让系统不缺失这些字体呢?从网上找到wingdings、wingdings 2、wingdings 3、Webdings、MT Extra这些字体进入主文件夹,按Ctrl+h键(显示隐藏文..._wps提示方正黑体_gbk对系统无效

利用MATLAB对图像中物体进行计数_matlab特殊形状计数-程序员宅基地

文章浏览阅读1.6w次,点赞18次,收藏178次。**利用MATLAB对一张图片中相同得物体进行计数。**MATLAB中已有函数可对二值化中的白色区域进行计数。[labeled,numObjects]=bwlabel(‘图像名’,8);运行后numObjects(即物体个数)的值会显示在右侧的工作区中。因此我们需要做的是对图像进行处理,包括二值化,除噪等。若直接将图像转化为二值图像进行计数,则无法得到正确数据。如clc;clo..._matlab特殊形状计数

推荐文章

热门文章

相关标签