Java中的equals()

199 篇文章 0 订阅

经过几天的学习,终于对equals的用法有了比较全面的认识,并做一个总结。

1.equals的本意——即在Object对象中定义的equals()方法有什么样的意义。

(此处先附上的作用,后面仍有叙述。因为和equals()方法的关系是很密切的,后面有我自己的看法。
==用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true
而在比较引用时,如果引用指向内存中的同一对象,结果为true)

public boolean equals(Object obj)

其比较规则为:当参数obj引用的对象与当前对象为同一个对象时,就返回true,否则返回false.

public class Fish {
    private int weight;
    private String color;

 

    public Fish(int weight, String color) {
        this.color = color;
        this.weight = weight;
    }

    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }

 

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

}

public class EqualsTest {
    public static void main(String[] args) {
        Fish f1 = new Fish(1, "blue");
        Fish f2 = new Fish(1, "blue");

 

        System.out.println(f1 == f2);
        System.out.println(f1.equals(f2));
    }
}

——————运行结果为——————

false
false

由此可见,equals()方法的本意为确定两个对象的引用是否相同。

2.而JDK类中有一些类覆盖了oject类的equals()方法,比较规则为:如果两个对象的类型一致,并且内容一致,则返回true,这些类有:

java.io.file,java.util.Date,java.lang.string,包装类(Integer,Double等)

public class EqualsTest {
    public static void main(String[] args) {
        String s1=new String("sss");
        String s2=new String("sss");
        
        System.out.println(s1==s2);
        System.out.println(s1.equals(s2));
    }
}

————————运行结果为——————

false
true

由此知道,在String中equals()方法被进行了覆盖,使其意义变为比较两个对象的内容是否一致

3.如果我们要自己覆盖equals()方法,让其比较内容或者有别的使用方法(当然我们一般都是用于比较内容的,但是覆盖的方法中真正的实现究竟是什么样的,谁知道呢

public class Fish {
    private int weight;
    private String color;

 

    public Fish(int weight, String color) {
        this.color = color;
        this.weight = weight;
    }
    
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((color == null) ? 0 : color.hashCode());
        result = prime * result + weight;
        return result;
    }
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Fish other = (Fish) obj;
        if (color == null) {
            if (other.color != null)
                return false;
        } else if (!color.equals(other.color))
            return false;
        if (weight != other.weight)
            return false;
        return true;
    }
    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

}

public class EqualsTest {
    public static void main(String[] args) {
        Fish f1 = new Fish(1, "blue");
        Fish f2 = new Fish(1, "blue");

 

        System.out.println(f1 == f2);
        System.out.println(f1.equals(f2));
    }
}

——————运行结果为——————

false
true

此例子中我复写了equals()方法和hashcode()方法,使得equals()方法脱离的本意,不再是比较两个对象的引用是否相同,而是比较其内容是否相同。

以上内容为一般书上的总结,下面是我自己想到的一些东西。

我们可以知道计算机归根到底进行的只是一些二进制数的与或非运算,加法乘法运算。由此有了些基本的运算符,所有的函数本质上其实现都是使用基本运算符来实现的。而==是基本运算符中的一个,它的作用:用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true
而在比较引用时,如果引用指向内存中的同一对象,结果为true

而equals()作为方法,我们可以推测知道,它其中的实现所使用的肯定是运算符。再进一步的思考,equals()本意不正是运算符进行对象比较时候的作用吗。那么,既然是两者有同样的作用,为什么还要弄出一个equals()方法来呢。因为运算符不允许我们进行覆盖,也就是说它限制了我们的表达。在上面的第三个例子中,我们复写equals()方法,达到比较对象内容是否相同的目的。而这些通过运算符是做不到的。

image
最新2020整理收集的一些高频面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友请加Q君样:909038429
/./*欢迎加入java交流Q君样:909038429一起吹水聊天

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java ,`equals()` 是一个用于比较两个对象是否相等的方法。该方法定义在 `Object` 类,因此所有 Java 类都可以使用该方法进行对象比较。默认情况下,`equals()` 方法会比较两个对象的内存地址,即判断它们是否是同一个对象。但是,有时我们需要比较对象的属性值是否相等,这时就需要重写 `equals()` 方法。 重写 `equals()` 方法需要遵循以下规则: 1. 自反性:对于任何非空引用值 `x`,`x.equals(x)` 应该返回 `true`。 2. 对称性:对于任何非空引用值 `x` 和 `y`,如果 `x.equals(y)` 返回 `true`,那么 `y.equals(x)` 也应该返回 `true`。 3. 传递性:对于任何非空引用值 `x`、`y` 和 `z`,如果 `x.equals(y)` 返回 `true`,并且 `y.equals(z)` 返回 `true`,那么 `x.equals(z)` 也应该返回 `true`。 4. 一致性:对于任何非空引用值 `x` 和 `y`,如果用于比较的属性值没有被修改,那么多次调用 `x.equals(y)` 应该返回相同的结果。 5. 非空性:对于任何非空引用值 `x`,`x.equals(null)` 应该返回 `false`。 下面是一个示例代码,演示了如何重写 `equals()` 方法: ```java public class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public boolean equals(Object obj) { if (obj == this) { // 自反性 return true; } if (!(obj instanceof Person)) { // 类型检查 return false; } Person other = (Person) obj; return name.equals(other.name) && age == other.age; // 属性比较 } // 省略 getter 和 setter 方法 } ``` 在这个示例,我们重写了 `equals()` 方法,比较了 `Person` 类的两个属性值。在实际使用,我们应该根据具体的业务逻辑,选择比较哪些属性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值