`

覆盖equals时总要覆盖hashCode

阅读更多
Object规范[JavaSE6]:
  • 在应用程序执行期间,对同一样对象调用多次,hashCode方法必须始终如一地返回同一个整数,在同一个应用程序多次执行过程中,每次执行所返回的整数可以不一致
  • 如果两个对象根据equals(Object)方法比较是相等的,那么调用这两个对象中任意一个对象的hashCode方法必须产生相同的整数结果
  • 如果两个对象更具equals方法比较是不相等的,那么调用hashCode方法,不一定要产生不同的结构,但是程序员应该知道,给不相等的对象产生不同的整数结果,有可能提高Hash Table的性能.

  • 1.以下创建一个没有自定义hashCode()方法的Boy类
    package com.perficient.basic;
    
    import java.util.HashSet;
    import java.util.Set;
    
    public class Boy {
    	private String name;
    	private int age;
    	
    	public Boy(String name, int age) {
    		this.name = name;
    		this.age = age;
    	}
        // Getters and Setters......	
    	public boolean equals(Object o){
    		if (this == o) return true;
    		if (!(o instanceof Object)) return false;
    		
    		final Boy other = (Boy)o;
    		if (this.name.equals(other.getName()) && this.age==other.getAge())
    			return true;
    		else
    			return false;		
    	}
    }
    


    2.在main()方法中向HashSet中增加两个相等的对象
    public static void main(String[] args){
    		Set<Boy> boys = new HashSet<Boy>();
    		Boy boy1 = new Boy("James", 28);
    		Boy boy2 = new Boy("James", 28);
    		
    		boys.add(boy1);
    		boys.add(boy2);
    		
    		System.out.println("The total number of boy is:" + boys.size());
    	}
    

    结果会显示
    The total number of boy is:2

    3.增加如下hashCode()方法:
    	public int hashCode(){
    		int result=18;
    		result = 31* result + age;
    		return result;
    	}
    


    再次运行,显示The total number of boy is:1

  • 总结:覆盖equals时总要覆盖hashCode,并且使Equals()为True的对象,返回相同的hashCode


  • 参考资料:<Effective Java(第二版)>,<Java面向对象编程>
    分享到:
    评论

    相关推荐

      Java 覆盖equals时总要覆盖hashcode

      主要介绍了Java 覆盖equals时总要覆盖hashcode的相关资料,这里附有实例代码,具有参考价值,需要的朋友可以参考下

      hashcode和equals方法

      equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.

      java 序列化和重写 hashCode 的原因

      java 序列化和重写 hashCode 以及 equals 方法的例子

      jv-equals-hashcode

      jv-equals-hashcode 给定的类—矩形。 覆盖它的方法equals()和hashCode()所以equals()通过其字段(颜色,宽度和长度equals()比较Rectangle对象。 还要确保hashCode()遵循equals和hashcode之间的约定。

      commons-lang

      6. EqualsBuilder/HashCodeBuilder提供了方便的方法来覆盖equals() 和hashCode()方法 7.以Range结尾的类主要提供一些范围的操作,包括判断某些字符,数字等是否在这个范围以内 8.ArrayUtils 提供了数组的复制,查找,...

      java集合知识-map、set等

      记住:如果元素要存储到HashSet集合中,必须覆盖hashCode方法和equals方法。 一般情况下,如果自定义的类会产生很多对象,比如人,学生,书,通常都需要覆盖equals,hashCode方法。 建立对象判断是否相同的依据。...

      安卓java读取网页源码-InterviewQuation:安卓面试的一些问题

      3)默认情况(没有覆盖equals方法)下equals方法都是调用Object类的equals方法, 而Object的equals方法主要用于判断对象的内存地址引用是不是同一个地址(是不是同一个对象) 4)要是类中覆盖了equals方法,那么就要...

      Task_3-4-8_ComplexNumber

      覆盖其中的equals()和hashCode()方法,以便equals()通过re和im字段的内容比较ComplexNumber实例,并且hashCode()与equals()实现一致。 返回常数或未考虑re和im的小数部分的hashCode()的实现将不计算...

      jdk 的集合框架的主体结构

      jdk 的集合框架的主体结构: Set 成员不能重复 HashSet 外部无序地遍历成员。 成员可为任意Object子类的对象,但如果覆盖了equals方法,同时注意修改hashCode方法。

      java7源码-Java-for-Android-Interview-Outline:android-必填面试大纲欢迎Star,关注

      而开发中,我们往往不关心是否是同一块内存地址,我们关心的是两个对象的数据是否相同,所以官方建议:所有的Object子类,都应该重新覆盖equals方法. public int hashCode():返回一个hashCode值,hashCode值决定了该对象在...

      jdk-8u202-linux-x64.tar

      如果对应的索引处没有元素,直接存放,如果有对象在,那么比较它们的equals方法比较内容,如果内容一样,后一个value会将前一个value的值覆盖,如果不一样,在1.7的时候,后加的放在前面,形成一个链表,形成了碰撞...

      jdk-8u112-windows-x64.zip

      在1.8之后,在数组+链表+红黑树来实现hashmap,当碰撞的元素个数大于8时 & 总容量大于64,会有红黑树的引入 除了添加之后,效率都比链表高,1.8之后链表新进元素加到末尾 ConcurrentHashMap (锁分段机制),...

      jdk1.8.0_60_linux.zip

      在1.8之后,在数组+链表+红黑树来实现hashmap,当碰撞的元素个数大于8时 & 总容量大于64,会有红黑树的引入 除了添加之后,效率都比链表高,1.8之后链表新进元素加到末尾 ConcurrentHashMap (锁分段机制),...

      architect-awesome-code

      )因此,如果对象所属的类没有覆盖Object的hashCode(),指向同一对象的引用调用hashCode的值相等,而不同对象的引用的hashCode值是不可能相等的。HashSet不存入重复元素的规则是:hashCode()和equals()。元素的哈希...

      java面试常见问题(超详细).pdf

      Java中的equals方法和hashCode方法有什么关系? Java中什么是重载【Overloading】?什么是覆盖【Overriding】?它们有什么区别? Java中什么是多态?如何实现多态? Java中什么是接口?它有什么作用? Java中什么是...

      sesvc.exe 阿萨德

      如果桶是一个链表则需要遍历判断里面的 hashcode、key 是否和传入 key 相等,如果相等则进行覆盖,并返回原来的值。 如果桶是空的,说明当前位置没有数据存入;新增一个 Entry 对象写入当前位置。 void addEntry(int...

      hibernate-types:Hibernate Types库为您提供了Hibernate ORM核心不支持的其他类型

      将JSON列类型映射到List或Map&lt;String&gt; ,需要确保POJO类型覆盖默认的equals和hashCode方法,并根据JSON对象的内容实现它们。 否则,Hibernate脏检查机制可能会触发意外的UPDATE语句。 查看。 Oracle 您应该使用...

      Java服务器端开发面试.doc

      Java服务器端开发面试题 Java服务器端开发面试题篇1 Hashcode()和equals(), 明白背后的原理,包括hashcode()的用法,各自的区别,如何,何时覆盖,为何覆盖 区别new String()和 申明的字符串的区别,String不变量,堆...

      见面试官前,掏出来看看系列(三)之——JavaSE思维导图(持续更新中……)

      文章目录输入输出流(Java IO)字节流字符流File 类Socket(套字节)NIO(非阻塞 IO)容器Map面向对象技术重载和覆盖的区别面向对象的特征字符串和数组字符串创建与存储的机制”==“、equals()和hashCode有什么区别...

      哈希运算过程

      ● key.hashCode() 获得键的哈希值 ● 用哈希值和数组长度来计算下标值 i ● 把键值对封装成 Entry 实例,放入 i 位置 ■ 如果有空位置,直接放入 ■ 如果该位置存在数据,依次用equals()比较key是否相等 ◆ 如果...

    Global site tag (gtag.js) - Google Analytics