經(jīng)過(guò)幾天的學(xué)習(xí),終于對(duì)equals的用法有了比較全面的認(rèn)識(shí)除呵,并做一個(gè)總結(jié)。
1.equals的本意——即在Object對(duì)象中定義的equals()方法有什么樣的意義。
(此處先附上==的作用矾瘾,后面仍有敘述。因?yàn)?=和equals()方法的關(guān)系是很密切的箭启,后面有我自己的看法壕翩。
==用于比較引用和比較基本數(shù)據(jù)類型時(shí)具有不同的功能:
比較基本數(shù)據(jù)類型,如果兩個(gè)值相同傅寡,則結(jié)果為true
而在比較引用時(shí)放妈,如果引用指向內(nèi)存中的同一對(duì)象,結(jié)果為true)
public boolean equals(Object obj)
其比較規(guī)則為:當(dāng)參數(shù)obj引用的對(duì)象與當(dāng)前對(duì)象為同一個(gè)對(duì)象時(shí)荐操,就返回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));
}
}
——————運(yùn)行結(jié)果為——————
false
false
由此可見(jiàn)芜抒,equals()方法的本意為確定兩個(gè)對(duì)象的引用是否相同。
2.而JDK類中有一些類覆蓋了oject類的equals()方法托启,比較規(guī)則為:如果兩個(gè)對(duì)象的類型一致宅倒,并且內(nèi)容一致,則返回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));
}
}
————————運(yùn)行結(jié)果為——————
false
true
由此知道屯耸,在String中equals()方法被進(jìn)行了覆蓋拐迁,使其意義變?yōu)楸容^兩個(gè)對(duì)象的內(nèi)容是否一致
3.如果我們要自己覆蓋equals()方法,讓其比較內(nèi)容或者有別的使用方法(當(dāng)然我們一般都是用于比較內(nèi)容的肩民,但是覆蓋的方法中真正的實(shí)現(xiàn)究竟是什么樣的唠亚,誰(shuí)知道呢O(∩_∩)O~)
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));
}
}
——————運(yùn)行結(jié)果為——————
false
true
此例子中我復(fù)寫(xiě)了equals()方法和hashcode()方法,使得equals()方法脫離的本意持痰,不再是比較兩個(gè)對(duì)象的引用是否相同灶搜,而是比較其內(nèi)容是否相同。
以上內(nèi)容為一般書(shū)上的總結(jié),下面是我自己想到的一些東西割卖。
我們可以知道計(jì)算機(jī)歸根到底進(jìn)行的只是一些二進(jìn)制數(shù)的與或非運(yùn)算前酿,加法乘法運(yùn)算。由此有了些基本的運(yùn)算符鹏溯,所有的函數(shù)本質(zhì)上其實(shí)現(xiàn)都是使用基本運(yùn)算符來(lái)實(shí)現(xiàn)的罢维。而==是基本運(yùn)算符中的一個(gè),它的作用:用于比較引用和比較基本數(shù)據(jù)類型時(shí)具有不同的功能:
比較基本數(shù)據(jù)類型丙挽,如果兩個(gè)值相同肺孵,則結(jié)果為true
而在比較引用時(shí),如果引用指向內(nèi)存中的同一對(duì)象颜阐,結(jié)果為true
而equals()作為方法平窘,我們可以推測(cè)知道,它其中的實(shí)現(xiàn)所使用的肯定是==運(yùn)算符凳怨。再進(jìn)一步的思考瑰艘,equals()本意不正是==運(yùn)算符進(jìn)行對(duì)象比較時(shí)候的作用嗎。那么肤舞,既然是兩者有同樣的作用紫新,為什么還要弄出一個(gè)equals()方法來(lái)呢。因?yàn)?=運(yùn)算符不允許我們進(jìn)行覆蓋李剖,也就是說(shuō)它限制了我們的表達(dá)芒率。在上面的第三個(gè)例子中,我們復(fù)寫(xiě)equals()方法篙顺,達(dá)到比較對(duì)象內(nèi)容是否相同的目的敲董。而這些通過(guò)==運(yùn)算符是做不到的。