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
[]

说明了什么?

马士兵的解释:

容器类对象在调用remove,contains等方法时,需要比较两个对象是不是相等,它比较这两个对象是不是相等的时候,比较的主要用到的是equals方法,但是有的时候也会用到hashCode方法,什么时候呢?
当这个对象用在map接口里头作为键,就是作为字典的那个索引,作为那个东西使用的时候,它会使用hashCode这个方法。为什么?因为hashCode 的效率会更高。所以重写equals方法应该重写hashCode方法,也就是两个对象互相的equals,那么他们两个必须具备相同的hashCode。
Object里面有hashCode方法,你可以通过这个hashCode实际上可以找到它在内存里的地址,当然不是绝对的物理地址,但是你通过这个hashCode你大概很快的就可以找的着它在内存里头到底存在什么位置上。所以hashCode这个东西呢,非常的适合做索引。因此,咱们有的对象,用做Map接口一对一对的往里存的时候,一个叫索引,一个叫值,用做索引的时候,很有可能别人会用它的hashCode方法。所以在这里,记得一个原则,你要重写这个对象的equals方法,你必须要重写这个对象的hashCode方法。两个对象互相的equals,两个对象必须具备相同的hashCode。
比方说,你查字典的时候,一般的首先在索引里面查,查到某个条目的时候才去找相对应的字,在这个意义上来讲,那个索引,是一个对象,那个字是一个值,你不能说我找着了一个索引,这两个索引一样,我索引到的是不同的字,这个是不行的。
重写equals方法,必须重写hashCode方法,什么时候有用? 这个对象当做索引的时候,当做键的时候。

转载于:https://www.cnblogs.com/tenWood/p/8282617.html

关于equals和hashCode相关推荐

  1. hash 值重复_程序员:判断对象是否重复,不重写equals和hashcode不行吗?

    前言 大家都知道如果要判断一个对象是否相同,都要在对象实体中重写equals和hashcode方法,那你知道为什么重写这两个方法就能根据自己定义的规则实现相等比较了吗? 今天带大家来了解一下equal ...

  2. 重写equals方法的hashcode_Java equals 和 hashCode 的这几个问题可以说明白吗?

    前言 上一篇文章 如何妙用Spring 数据绑定机制,灵魂追问 环节留下了一个有关 equals 和 hashcode 问题 .基础面试经常会碰到与之相关的问题,这不是一个复杂的问题,但很多朋友都苦于 ...

  3. 程序猿的日常——Java基础之equals与hashCode

    equals和hashCode是我们日常开发最常使用的方法,但是因为一般都使用默认的规则,因此也很少会引起关注.不过了解他们的用途和设计的原则,还是会帮助我们更好的设计代码. equals equal ...

  4. Java的equals() 和 hashCode()

    2019独角兽企业重金招聘Python工程师标准>>> 首先,equals()方法和hashCode()方法都来自于Object类的定义,Java类都继承了这两个方法,都定义了自己的 ...

  5. Java实战equals()与hashCode()

    2019独角兽企业重金招聘Python工程师标准>>> 一.equals()方法详解 equals()方法在object类中定义如下: 代码 public boolean equal ...

  6. 通过 SpringBoot 中使用 lombok 实现自动创建JavaBean的get/set方法、全参/无参构造方法、toString()、equals()、hashCode()

    通过SpringBoot中使用lombok实现 先导入依赖 <dependency><groupId>org.projectlombok</groupId>< ...

  7. 关于 equals 和 hashCode,看这一篇真的够了!

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

  8. 不同时重写equals和hashCode又会怎样?

    作者:flyhero 微信公众号:码上实战(ID:Push-Code) 可能一问到equals和hashCode相关的问题,就会有人讲他们的自反性,对称性,一致性,传递性等几条约定了,此时我不得不佩服 ...

  9. Java基础提升篇:equals()与hashCode()方法详解

    概述 java.lang.Object类中有两个非常重要的方法: public boolean equals(Object obj) public int hashCode() Object类是类继承 ...

  10. java baseentity_如何在JPA的BaseEntity中实现equals()和hashcode()方法?

    我有一个BaseEntity类,它是我的应用程序中所有JPA实体的超类. @MappedSuperclass public abstract class BaseEntity implements S ...

最新文章

  1. win7没有个性化如何把计算机放到桌面,win7系统家庭版右键没有个性化设置桌面壁纸...
  2. 我的第一个Windows Phone 7应用程序
  3. 2020年度智能音箱主控方案汇总,涵盖15大芯片品牌推出的34款解决方案
  4. 中国计算机学会CCF招聘-信息系统项目管理/技术支持
  5. 数据结构与算法之递推算法 C++与PHP实现
  6. python怎么安装scrapy_Python-2.7安装Scrapy 1.0爬虫实例
  7. cordic ip核 vivado_Xilinx Vivado Cordic 核的使用
  8. 关于技术人员的非技术能力
  9. 几个网站收录提交入口,让自己的博客被搜索引擎收录(最新版)
  10. Eclipse插件Target Management (RSE)
  11. Python + seleniume 清除chrome浏览器历史记录
  12. MSP430单片机GPIO编程入门教程
  13. python实现自动答题详解含代码
  14. [PTA] 7-2 I Love GPLT
  15. python tkinter控件_Python——Tkinter窗口的函数,Pythontkinter,视窗,功能,部件
  16. 到底什么是SDWAN服务?
  17. 计算机配件进口关税走势,计算机类产品关税降50% 从20%下调至10%
  18. kil -9杀不死mysql守护进程
  19. MindMap软件介绍
  20. verdi简单使用方法

热门文章

  1. Windows Internet Explorer 7 正式发布
  2. 从Mysql数据库中导入导出表结构
  3. Image Upload based on jQuery
  4. 腾讯惹谁了?为什么用QQ邮箱投简历不受人待见
  5. C#反射的Assembly的简单应用
  6. Java并发之Thread类的使用
  7. pyqt5 -——菜单和工具栏
  8. 设计模式之责任链模式(Chain of Responsibility )
  9. [最小生成树] 继续畅通工程
  10. Flex事件机制(三)