【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个小时学习,但说实话,我仍然有很多地方无法理解。
我会继续更新的。