Java中equals()知識(shí)點(diǎn)總結(jié)
經(jīng)過(guò)幾天的學(xué)習(xí),終于對(duì)equals的用法有了比較全面的認(rèn)識(shí),并做一個(gè)總結(jié)。
1.equals的本意——即在Object對(duì)象中定義的equals()方法有什么樣的意義。
(此處先附上==的作用,后面仍有敘述。因?yàn)?=和equals()方法的關(guān)系是很密切的,后面有我自己的看法。
==用于比較引用和比較基本數(shù)據(jù)類(lèi)型時(shí)具有不同的功能:
比較基本數(shù)據(jù)類(lèi)型,如果兩個(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類(lèi)中有一些類(lèi)覆蓋了oject類(lèi)的equals()方法,比較規(guī)則為:如果兩個(gè)對(duì)象的類(lèi)型一致,并且內(nèi)容一致,則返回true,這些類(lèi)有:
java.io.file,java.util.Date,java.lang.string,包裝類(lèi)(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
false
由此可見(jiàn),equals()方法的本意為確定兩個(gè)對(duì)象的引用是否相同。
2.而JDK類(lèi)中有一些類(lèi)覆蓋了oject類(lèi)的equals()方法,比較規(guī)則為:如果兩個(gè)對(duì)象的類(lèi)型一致,并且內(nèi)容一致,則返回true,這些類(lèi)有:
java.io.file,java.util.Date,java.lang.string,包裝類(lèi)(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ù)類(lèi)型時(shí)具有不同的功能:
比較基本數(shù)據(jù)類(lèi)型,如果兩個(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)算符是做不到的。
到此這篇關(guān)于Java中equals()知識(shí)點(diǎn)總結(jié)的文章就介紹到這了,更多相關(guān)Java中的equals()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解OAuth2 Token 一定要放在請(qǐng)求頭中嗎
這篇文章主要介紹了詳解OAuth2 Token 一定要放在請(qǐng)求頭中嗎,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07SpringBoot使用MockMvc進(jìn)行單元測(cè)試的實(shí)例代碼
在Spring Boot應(yīng)用程序中,使用MockMvc進(jìn)行單元測(cè)試是一種有效的方式,可以驗(yàn)證控制器的行為和API的正確性,在這篇博客中,我們將介紹如何使用MockMvc對(duì)用戶(hù)控制器進(jìn)行測(cè)試,感興趣的朋友可以參考下2024-01-01SpringBoot整合RabbitMQ實(shí)現(xiàn)交換機(jī)與隊(duì)列的綁定
這篇文章將通過(guò)幾個(gè)實(shí)例為大家介紹一些SpringBoot中RabbitMQ如何綁定交換機(jī)(交換器)與隊(duì)列,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-05-05Java實(shí)現(xiàn)warcraft?java版游戲的示例代碼
致敬經(jīng)典的warcraft,《warcraft?java版》是一款即時(shí)戰(zhàn)略題材單機(jī)游戲,采用魔獸原味風(fēng)格和機(jī)制。本文將用java語(yǔ)言實(shí)現(xiàn),采用了swing技術(shù)進(jìn)行了界面化處理,感興趣的可以了解一下2022-09-09druid ParserException類(lèi)錯(cuò)誤問(wèn)題及解決
這篇文章主要介紹了druid ParserException類(lèi)錯(cuò)誤問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12Java進(jìn)階核心之InputStream流深入講解
這篇文章主要給大家介紹了關(guān)于Java進(jìn)階核心之InputStream流的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02