对象

Java中equals()方法详细解析

2017-08-23  本文已影响12人  capo

本文主要内容:

1 、覆盖equals时要遵循的约定

image.png

输出:

image.png image.png image.png

2、什么时候该重写equals方法

如果类具有自己特有的“”逻辑特性“”,而且超类还没有覆盖equals以实现期望的行为. 及我们不想知道它是否在内存中指向的是否一个对象,我们想判断它的逻辑值是否相等
例如: 一个雇员实体类里面有员工姓名、薪水等,我想知道2个雇员对象是否是逻辑上相等

3.如何重写一个equals方法了

覆盖Object方法中equals方法需要遵循以下几个规范

如何实现一个equals()方法:

package com.minglangx.object;

import java.util.Date;
import java.util.Objects;

public class Employee {

    private String name;
    private double salary;
    private Date hireDay;

    @Override
    public boolean equals(Object obj) {
        // 如果为同一对象的不同引用,则相同
        if (this == obj) {
            return true;
        }
        // 如果传入的对象为空,则返回false
        if (obj == null) {
            return false;
        }

//        // 如果两者属于不同的类型,不能相等 这种情况只能是对象具有相同的实现才能使用
//        if (getClass() != obj.getClass()) {
//            return false;
//        }
        
        if( !(obj instanceof Employee) ) {
            return false;
        }

        // 类型相同, 比较内容是否相同
        Employee other = (Employee) obj;

        return Objects.equals(name, other.name) && salary == other.salary && Objects.equals(hireDay, other.hireDay);
    }
} 
4为什么重写equals方法之前要重写hashCode方法

因为 Object规范中说到: 相等的对象必须具有相等的散列码
因为hashCode散列码的目的是为了HashSet、HashMap、HashTable比较的时候缩小范围空间,它只是返回一个散列整数然后根据散列码去散列桶中查找对象区间。它不保证对象是否是相等的

上一篇 下一篇

猜你喜欢

热点阅读