关于equals和hashCode
Collection中的remove和contains方法,都是挨个比较每个对象是否equals参数中的对象,如果equals了,就remove掉或者包含。
看下面例子:
package com.cy.container;import java.util.ArrayList; import java.util.Collection; import java.util.HashSet;public class BasicContainer {public static void main(String[] args) {Collection c = new ArrayList();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")));System.out.println(c);} }class Name{private String firstName, lastName;public Name(String firstName, String lastName) {super();this.firstName = firstName;this.lastName = lastName;}public String getFirstName() {return firstName;}public String getLastName() {return lastName;}@Overridepublic String toString() {return "Name [firstName=" + firstName + ", lastName=" + lastName + "]";}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Name other = (Name) obj;if (firstName == null) {if (other.firstName != null)return false;} else if (!firstName.equals(other.firstName))return false;if (lastName == null) {if (other.lastName != null)return false;} else if (!lastName.equals(other.lastName))return false;return true;}}
View Code
Collection是使用Arraylist的,只是重写了Name的equals方法,console打印:
true []
说明ArrayList的remove和contains中只是比较了equals,没有使用到hashCode。
例子2:
package com.cy.container;import java.util.ArrayList; import java.util.Collection; import java.util.HashSet;public class BasicContainer {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")));System.out.println(c);} }class Name{private String firstName, lastName;public Name(String firstName, String lastName) {super();this.firstName = firstName;this.lastName = lastName;}public String getFirstName() {return firstName;}public String getLastName() {return lastName;}@Overridepublic String toString() {return "Name [firstName=" + firstName + ", lastName=" + lastName + "]";}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Name other = (Name) obj;if (firstName == null) {if (other.firstName != null)return false;} else if (!firstName.equals(other.firstName))return false;if (lastName == null) {if (other.lastName != null)return false;} else if (!lastName.equals(other.lastName))return false;return true;}}
View Code
Collection是使用HashSet来实现的,也只是重写了equals方法,console打印:
false [Name [firstName=f1, lastName=l1]]
并没有成功的remove掉,说明仅仅重写equals方法不行。
那么补上hashCode方法:
class Name{private String firstName, lastName;public Name(String firstName, String lastName) {super();this.firstName = firstName;this.lastName = lastName;}public String getFirstName() {return firstName;}public String getLastName() {return lastName;}@Overridepublic String toString() {return "Name [firstName=" + firstName + ", lastName=" + lastName + "]";}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result+ ((firstName == null) ? 0 : firstName.hashCode());result = prime * result+ ((lastName == null) ? 0 : lastName.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Name other = (Name) obj;if (firstName == null) {if (other.firstName != null)return false;} else if (!firstName.equals(other.firstName))return false;if (lastName == null) {if (other.lastName != null)return false;} else if (!lastName.equals(other.lastName))return false;return true;}}
View Code
再次执行:
true []
说明了什么?
马士兵的解释:
转载于:https://www.cnblogs.com/tenWood/p/8282617.html
关于equals和hashCode相关推荐
- hash 值重复_程序员:判断对象是否重复,不重写equals和hashcode不行吗?
前言 大家都知道如果要判断一个对象是否相同,都要在对象实体中重写equals和hashcode方法,那你知道为什么重写这两个方法就能根据自己定义的规则实现相等比较了吗? 今天带大家来了解一下equal ...
- 重写equals方法的hashcode_Java equals 和 hashCode 的这几个问题可以说明白吗?
前言 上一篇文章 如何妙用Spring 数据绑定机制,灵魂追问 环节留下了一个有关 equals 和 hashcode 问题 .基础面试经常会碰到与之相关的问题,这不是一个复杂的问题,但很多朋友都苦于 ...
- 程序猿的日常——Java基础之equals与hashCode
equals和hashCode是我们日常开发最常使用的方法,但是因为一般都使用默认的规则,因此也很少会引起关注.不过了解他们的用途和设计的原则,还是会帮助我们更好的设计代码. equals equal ...
- Java的equals() 和 hashCode()
2019独角兽企业重金招聘Python工程师标准>>> 首先,equals()方法和hashCode()方法都来自于Object类的定义,Java类都继承了这两个方法,都定义了自己的 ...
- Java实战equals()与hashCode()
2019独角兽企业重金招聘Python工程师标准>>> 一.equals()方法详解 equals()方法在object类中定义如下: 代码 public boolean equal ...
- 通过 SpringBoot 中使用 lombok 实现自动创建JavaBean的get/set方法、全参/无参构造方法、toString()、equals()、hashCode()
通过SpringBoot中使用lombok实现 先导入依赖 <dependency><groupId>org.projectlombok</groupId>< ...
- 关于 equals 和 hashCode,看这一篇真的够了!
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接: https://blog.csdn.net/CringKong/article/de ...
- 不同时重写equals和hashCode又会怎样?
作者:flyhero 微信公众号:码上实战(ID:Push-Code) 可能一问到equals和hashCode相关的问题,就会有人讲他们的自反性,对称性,一致性,传递性等几条约定了,此时我不得不佩服 ...
- Java基础提升篇:equals()与hashCode()方法详解
概述 java.lang.Object类中有两个非常重要的方法: public boolean equals(Object obj) public int hashCode() Object类是类继承 ...
- java baseentity_如何在JPA的BaseEntity中实现equals()和hashcode()方法?
我有一个BaseEntity类,它是我的应用程序中所有JPA实体的超类. @MappedSuperclass public abstract class BaseEntity implements S ...
最新文章
- win7没有个性化如何把计算机放到桌面,win7系统家庭版右键没有个性化设置桌面壁纸...
- 我的第一个Windows Phone 7应用程序
- 2020年度智能音箱主控方案汇总,涵盖15大芯片品牌推出的34款解决方案
- 中国计算机学会CCF招聘-信息系统项目管理/技术支持
- 数据结构与算法之递推算法 C++与PHP实现
- python怎么安装scrapy_Python-2.7安装Scrapy 1.0爬虫实例
- cordic ip核 vivado_Xilinx Vivado Cordic 核的使用
- 关于技术人员的非技术能力
- 几个网站收录提交入口,让自己的博客被搜索引擎收录(最新版)
- Eclipse插件Target Management (RSE)
- Python + seleniume 清除chrome浏览器历史记录
- MSP430单片机GPIO编程入门教程
- python实现自动答题详解含代码
- [PTA] 7-2 I Love GPLT
- python tkinter控件_Python——Tkinter窗口的函数,Pythontkinter,视窗,功能,部件
- 到底什么是SDWAN服务?
- 计算机配件进口关税走势,计算机类产品关税降50% 从20%下调至10%
- kil -9杀不死mysql守护进程
- MindMap软件介绍
- verdi简单使用方法