【Java】equals()这是什么东西?

首先

在学习JavaSilver课程期间

嗯嗯,equals()是用来判断两个实例的相等性的东西呢。

「嗯?但是这边写着要检查等值性呢…」

「String类型的equals()方法继承了父类Object类型的equals()方法,所以默认情况下会保持不变……难道不是吗?为什么会这样??」

嗯,因为理解这个概念确实有一定困难,所以我把它作为备忘录整理一下。

同一性意味着物和等同性。

作为先决条件的知识… (As prerequisite knowledge…)

– 一致性

多个变量是否引用了同一实例

在下面的例子中,将对象类型变量a赋值为实例a的引用,
将对象类型变量b赋值为变量a的内容(即实例a的引用),
尽管变量不同但引用相同,因此可以说是相等的。

Object a = new Object();
Object b = a;
System.out.println(a == b); //result:true

・等价性

即使是不同的实例,其内容是否相等

以下的例子中,String类型的a和b是不同的实例,但是它们的值是相同的,因此可以说它们是等值的。

String a = "Hello";
String b = "Hello";
System.out.println(a == b); //result:true

相等()

在Object类中定义的方法,默认情况下用于检查同一性。

public boolean equals(Object obj){
    return (this == obj)
}

然而,在这里需要注意的是,equals() 原本是用来判断相等性的,一般来说,应该使用重写来为每个类重新定义。

JavaSilver遇到的问题

下面列出的问题非常混乱。(引自《Java SE8 Silver》中的黑书)

//第3章 問12 実行結果はどうなるか
public class Main{
    public static void main(String[] args){
        String a = "sample";
        String b = "sample";
        System.out.print(a == b);
        System.out.print(",");
        System.out.print(a.equals(b));//result:true,true
        }
}

System.out.print(a.equals(b));的代码在“开始”部分提到了。

「String类型的equals()方法继承了父类Object类型的equals()方法,所以默认是不变的……难道不是吗?为什么?」

会导致连接。

那时我错误的想法是,”嗯,调用equals()方法来检查实例a和b的相等性。
哦,但是String类型的equals()方法继承了Object类型的equals()方法,所以是用来判断同一性的。
那么a和b是不同的实例,所以这应该是false”。

考虑之后,答案是真的,所以我很惊讶地说:“哇!”(词汇量)

嗯,其实一开始就在中间那行通过“==”进行了一次身份判定,如果那里是true的话,这次的equals()也很可能是true的嘛…

1. 即使是String类型,equals()方法也已经被重写过了。

“String类型的equals()方法继承了Object类型的equals()方法,所以用于判断同一性”

她提到的话只有一半是错误的。

Object类型的equals()方法被定义为判断同一性,但是String类型的equals()方法被重写,用于检查两个实例是否具有等值性关系。(代码被省略)

最后

我花了大约1、2个小时学习,但说实话,我仍然有很多地方无法理解。
我会继续更新的。

广告
将在 10 秒后关闭
bannerAds