`
flylynne
  • 浏览: 373708 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

如何重写equals方法呢?

阅读更多

如何重写equals方法呢?

我们先看下Object类中式如何定义equals方法的:
public boolean equals(Object obj) {
   return (this == obj);
}
该方法指示其他某个对象是否与此对象“相等”。 通常情况下,我们只需要比较两个对象的内容是否相等直接使用equals方法即可,而当关注它们的内存地址是相等时才相等,我们就要重写equals方法,注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

下面我们来举个例子:
相关代码一:
public class Point {

private int x;
private int y;

public Point(int x, int y) {
    super();
    this.x = x;
    this.y = y;
}

public static void main(String[] args) {
    Point p1 = new Point(3, 3);
    Point p2 = new Point(5, 5);
    Point p3 = new Point(3, 3);

    Collection<Point> collection = new HashSet<Point>();
    collection.add(p1);
    collection.add(p2);
    collection.add(p3);
    System.out.println(collection.size());// 3
}
}

//相信大家对上面的代码运行结果没有任何异议吧,一个HashSet的对象中存储有三个不同的对象。

在实际应用中,我们可能只希望p1和p3“相等”,只保存其中一个,这是就要重写equals和hashcode方法,
我们用eclipse的快捷方式生成这两个方法,代码如下:

相关代码二:
public class Point {

private int x;
private int y;

public Point(int x, int y) {
    super();
    this.x = x;
    this.y = y;
}

public static void main(String[] args) {
    Point p1 = new Point(3, 3);
    Point p2 = new Point(5, 5);
    Point p3 = new Point(3, 3);

    Collection<Point> collection = new HashSet<Point>();
    collection.add(p1);
    collection.add(p2);
    collection.add(p3);
    System.out.println(collection.size());// 2
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + x;
    result = prime * result + y;
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
      return true;
    if (obj == null)
      return false;
    if (getClass() != obj.getClass())
      return false;
    final Point other = (Point) obj;
    if (x != other.x)
      return false;
    if (y != other.y)
      return false;
    return true;
}
}

//用eclipse的快捷方式重写equals和hashcode方法后,就会把p3和p1看成“相等”的,于是p3就不会再存储在HashSet中。也很容易理解吧!

相关代码三:
public class Point {

private int x;
private int y;

public Point(int x, int y) {
    super();
    this.x = x;
    this.y = y;
}

public static void main(String[] args) {
    Point p1 = new Point(3, 3);
    Point p2 = new Point(5, 5);
    Point p3 = new Point(3, 3);

    Collection<Point> collection = new HashSet<Point>();
    collection.add(p1);
    collection.add(p2);
    collection.add(p3);
    System.out.println(collection.size());// 3
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + x;
    result = prime * result + y;
    return result;
}


public boolean equals(Point obj) {
    if (this == obj)
      return true;
    if (obj == null)
      return false;
    if (getClass() != obj.getClass())
      return false;
    final Point other = (Point) obj;
    if (x != other.x)
      return false;
    if (y != other.y)
      return false;
    return true;
}
}
//大家注意到此时的输出怎么会是3,我明明重写了 hashCode和equals方法,怎么p3还是被存储进去了呢,我们仔细看下,代码二和代码三,有啥不同,不同如下:
.equals方法上面少了@Override
.equals(Object obj)变成了equals(Point obj)

下面我们把@Override加到equals(Point obj)的上面,此时会出现编译错误:"The method equals(Point) of type Point must override a superclass method",意思就是说equals(Point)并不是重写的方法,怎么就不是重写呢?Object类的方法是equals(Object obj),此时的方法是equals(Point),看到了区别了吧,参数类型不同,当然就不算是重写,而是重载,所以我们可以通过在方法前面加上@Override来判断该方法是否被重写。所以我们在重写equal方法时,最好采用eclipse的快捷方式生成,不要想当然的把equal方法参数中的Object改成自己的类名,这样就大错特错了,不起到我们想要的效果!

分享到:
评论

相关推荐

    重写equals方法

    "equals 方法重写详解" 在 Java 中,equals 方法是一个非常重要的方法,它用于判断两个对象是否相等,而不是判断两个对象的引用是否相同。在 Object 基类中,equals 方法的实现是使用“==”操作符来比较对象的引用...

    equals方法的重写.docx

    #### 二、为什么需要重写equals方法? 1. **提高程序效率**:当两个对象具有相同的业务逻辑上的“身份”时,它们应该被认为是相等的。 2. **增强代码可读性**:重写后的`equals`方法可以根据实际需求来判断对象是否...

    重写toString和equals方法

    Java 对象的toString和equals方法重写 在 Java 中,每个对象都继承自 Object 类,而 Object 类中定义了两个重要的方法:toString() 和 equals()。这两个方法都是非常重要的,它们分别用于对象的字符串表示和对象...

    重写equals和hashcode方法_equals_重写equals和hashcode方法_

    以下是对`equals()` 和 `hashCode()` 方法的详细解释及其重写的重要性。 **1. equals() 方法** `equals()` 方法用于比较两个对象是否相等。默认情况下,`equals()` 检查两个对象是否是同一个对象(即内存地址是否...

    关于重写equals,hashcode以及compareTo方法!

    关于重写equals、hashcode以及compareTo方法! equals()方法是Object类中的一个方法,它用于比较两个对象是否相等。然而,它的默认实现是比较对象的引用(地址),而不是比较对象的实际内容。因此,在某些情况下,...

    为什么重写equals方法,还必须要重写hashcode方法

    为什么重写equals方法,还必须要重写hashcode方法

    Java重写equals同时需要重写hashCode的代码说明

    Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.

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

    然而,当我们需要基于对象的内容来判断相等性时,通常会重写 `equals()` 方法。例如,`String` 类就重写了 `equals()`,比较的是字符串的内容而不是引用。 来看看 `String` 的 `equals()` 源码: ```java public ...

    浅谈java 重写equals方法的种种坑

    关于 Java 中重写 equals 方法的种种坑 Java 中的 equals 方法是一种用于比较对象是否相等的方法,它是 Object 类中的一个方法。然而,重写 equals 方法并不是一件简单的事情,因为它需要遵守一些约定,否则可能会...

    方法重写equals和多态

    在Java编程语言中,"方法重写equals"和"多态"是两个核心概念,尤其对于面向对象的设计和实现至关重要。下面将详细解释这两个概念及其相互关系。 **方法重写equals()** 在Java中,`equals()`方法是Object类的一个...

    winform 重写Equals源码

    在某些情况下,尤其是自定义控件或者业务实体类的设计中,我们可能需要重写`Equals`方法来实现特定的比较逻辑。下面我们将深入探讨WinForm中重写`Equals`方法的相关知识点。 首先,`Equals`方法是`Object`类中的一...

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

    因此,为了保证对象在集合中的正确行为,当重写 `equals` 方法时,必须同时重写 `hashCode` 方法,确保相等的对象具有相同的哈希值。这样,集合可以正确地识别和处理相等的对象,避免数据一致性问题。同时,遵循这个...

    java中重写equals()方法的同时要重写hashcode()方法(详解)

    Java 中重写 equals() 方法的同时要重写 hashCode() 方法的重要性 在 Java 中,equals() 方法和 hashCode() 方法是两个紧密相关的方法,它们都是用于比较和标识对象的方法。equals() 方法用于比较两个对象的值是否...

    Java_重写equals()和hashCode()

    但在实际开发中,我们往往需要根据对象的内容来判断它们是否相等,这时就需要重写 `equals()` 方法。重写时应遵循以下原则: 1. **自反性**:对于任何非null的引用值x,x.equals(x)应该返回true。 2. **对称性**:...

    C# Equals 和 GetHashCode 方法重写

    ### C# Equals 和 GetHashCode 方法重写 在C#编程中,`Equals` 和 `GetHashCode` 方法是非常重要的成员方法,它们对于确保对象的正确比较以及高效地存储和检索对象至关重要。这两个方法通常需要在自定义类中进行...

    Java重写equals及hashcode方法流程解析

    "Java重写equals及hashcode方法流程解析" Java中的equals和hashCode方法是两个非常重要的方法,它们都是Object类中的方法。在实际开发中,正确地重写这两个方法对于确保程序的正确性和性能至关重要。下面,我们将...

    why在重写equals时还必须重写hashcode方法分享

    然而,在实际应用中,我们往往需要根据对象的内容来判断它们是否相等,因此在自定义类中重写 `equals()` 方法是常见的做法。例如,`String` 类就重写了 `equals()`,比较两个字符串的字符序列是否相同。 接着,我们...

    java中为何重写equals时必须重写hashCode方法详解

    当我们在自定义类中重写 `equals()` 方法时,通常也需要重写 `hashCode()` 方法,这是为了遵循一些重要的原则和保证数据结构如 `HashMap`、`HashSet` 的正确行为。 首先,`equals()` 方法用于比较两个对象是否相等...

    【面试】hashCode与equals两者之间的关系 / == 和equals / 为什么要重写equals方法 / 重写equals /hashcode方法 / 为什么要重写hashCode方法

    3、**为什么要重写equals()方法?** 默认情况下,`equals()`方法继承自`Object`类,比较的是对象的引用。在处理自定义类时,我们可能关心的是对象的属性是否相等,而不是它们的内存地址。因此,为了基于对象的内容...

    重写hashCode()和equals()方法详细介绍

    如果我们重写了`equals()`方法来基于`name`和`age`判断两个`Coder`对象是否相等,那么我们也应该重写`hashCode()`,使具有相同`name`和`age`的`Coder`对象产生相同的哈希码。通常,`hashCode()`的实现会结合所有参与...

Global site tag (gtag.js) - Google Analytics