`

覆盖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()`方法。这是因为`equals()`和`hashCode()`方法在Java集合框架中扮演着重要的角色,特别是在使用`HashMap`、`HashSet`等基于哈希表的集合类时。...

      hashcode和equals方法

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

      java中hashcode()和equals()方法详解

      - 为了避免哈希冲突带来的性能问题,在覆盖`equals()`方法的同时,通常也需要覆盖`hashCode()`方法。 #### 实现示例 以下是一个简单的类`Person`,展示了如何正确覆盖`equals()`和`hashCode()`方法: ```java ...

      effectice_java第二版 英文

      7. **条目7:覆盖equals时总要覆盖hashCode(Override equals() and hashCode() in pairs)** 当重写equals()方法时,必须同时重写hashCode(),以确保一致性,否则会影响集合类的行为。 8. **条目8:始终重写...

      set接口经常用的hashCode和equals方法详解

      为了实现元素的唯一性,`Set`接口要求覆盖`equals`方法,使其能够根据元素的实际内容来进行比较。 - **内容比较**: 在`Set`接口的不同实现中,通常会根据元素的属性或内容来进行比较。例如,在`String`类中,`...

      java中hashcode()和equals()的详解.docx

      - **一致性**:在覆盖`equals()`方法时,也需要确保同时覆盖`hashCode()`方法,并且两个方法的实现要保持一致,以避免潜在的哈希冲突问题。 - **性能考量**:在设计`hashCode()`方法时,应尽可能选择分布均匀的哈希...

      java 序列化和重写 hashCode 的原因

      2. 对于不相等的对象,`equals`返回`false`时,`hashCode`应尽可能不同,以减少哈希冲突。 3. `equals`方法的重写应遵循自反性、对称性、传递性和一致性原则。 4. 如果重写了`equals`,那么通常也应重写`hashCode`,...

      hashcode与eqault比较

      在Java编程语言中,`hashCode`和`equals`方法是非常重要的概念,它们在处理对象的比较、存储以及检索时扮演着关键角色。本文将深入探讨这两个方法之间的区别,并通过具体例子来说明它们的重要性。 #### 一、`equals...

      为什么在重写 equals方法的同时必须重写 hashcode方法

      首先,根据键的 `hashCode` 定位到对应的桶,然后遍历桶中的条目,如果找到一个条目的键与要插入的键 `equals` 并且哈希值相同,那么就会覆盖旧的值,否则会在桶中添加新的条目。如果两个键的 `equals` 返回 true 但...

      面试官瞬间就饱了,重写equals函数,需要重写hashCode函数吗?

      因此,重写 `equals()` 时务必考虑 `hashCode()`。不一致的 `equals()` 和 `hashCode()` 实现可能导致违反哈希表的语义,影响程序的正确性和性能。Java 文档明确指出,如果你重写了 `equals()`,也应该重写 `...

      java中hashCode方法与equals方法的用法总结

      4. **覆盖两者**:如果只覆盖 `equals()` 不覆盖 `hashCode()`,可能会导致集合行为异常,因为哈希表依赖于两者的一致性。 在具体实现时,可以使用对象属性的哈希码组合来生成自定义的哈希码,例如: ```java @...

      jv-equals-hashcode

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

      学习Object类——为什么要重写equeals和hashcode方法

      此外,Object 类的设计是为了扩展,它提供了一些非 final 方法,如 equals、hashCode、toString、clone 和 finalize,这些方法都有通用的约定,需要在子类中被覆盖(override)。如果不遵守这些约定,依赖这些约定的...

      如何正确实现Java中的HashCode共6页.pdf.z

      - 如果类的实例不会与其他类型对象相等(即没有覆盖`equals()`),则无需重写`hashCode()`。 综上所述,正确实现`hashCode()`方法对于优化Java应用程序的性能和正确性至关重要。在设计和实现类时,必须考虑到`...

      Joshua Bloch 所著《Effective Java 第二版》一书摘要.zip

      Joshua Bloch 所著《Effective Java 第二版》一书摘要这是我对 Joshua Bloch 所著《Effective Java 第 2 ... 覆盖equals时遵守一般约定9.重写equals时务必重写hashCode10. 始终覆盖toString11.明智地覆盖克隆12.考虑实

      关于equals()方法,jdk源码给出如下五点建议

      5. **覆盖`hashCode()`**:如果两个对象根据`equals()`方法比较相等,它们的`hashCode()`方法必须返回相同的值。反之不成立,因为不同的对象可能有相同的`hashCode()`。 遵循这些准则,我们可以编写符合预期的`...

      Java常见笔试、面试系列深度剖析第六讲

      五、覆盖equals()时的注意事项 当重写equals()方法时,务必同时重写hashCode()方法,以保持equals()和hashCode()的一致性。此外,要遵循以下原则: 1. 自反性:对于任何非null引用x,x.equals(x)应返回true。 2. ...

    Global site tag (gtag.js) - Google Analytics