摘要:相等判斷符介紹相等判斷符用于比較基本數(shù)據(jù)類(lèi)型和引用類(lèi)型數(shù)據(jù)當(dāng)比較基本數(shù)據(jù)類(lèi)型的時(shí)候比較的是數(shù)值當(dāng)比較引用類(lèi)型數(shù)據(jù)時(shí)比較的是引用指針判斷基本類(lèi)型是否相等首先基本數(shù)據(jù)類(lèi)型指的是中的八大數(shù)據(jù)類(lèi)型這八大基本數(shù)據(jù)類(lèi)型有個(gè)共同的特點(diǎn)是它們?cè)趦?nèi)存中是有具
相等判斷符"=="介紹
"=="相等判斷符用于比較基本數(shù)據(jù)類(lèi)型和引用類(lèi)型數(shù)據(jù). 當(dāng)比較基本數(shù)據(jù)類(lèi)型的時(shí)候比較的是數(shù)值, 當(dāng)比較引用類(lèi)型數(shù)據(jù)時(shí)比較的是引用(指針).
"=="判斷基本類(lèi)型是否相等.
首先基本數(shù)據(jù)類(lèi)型指的是Java中的八大數(shù)據(jù)類(lèi)型: byte, short, int, long, float, double, char, boolean
這八大基本數(shù)據(jù)類(lèi)型有個(gè)共同的特點(diǎn)是它們?cè)趦?nèi)存中是有具體值的, 比如說(shuō)一個(gè)int類(lèi)型的數(shù)據(jù)"2", 它在8位數(shù)據(jù)總線(xiàn)的機(jī)器上(假設(shè)的)保存形式為0000 0010.
當(dāng)使用"=="比較兩個(gè)基本數(shù)據(jù)類(lèi)型的時(shí)候, 就是比較它們各自在內(nèi)存中的值.
"=="判斷引用類(lèi)型數(shù)據(jù)是否相等
引用數(shù)據(jù)類(lèi)型在字面上也是很好理解的, 就是一個(gè)引用, 它會(huì)指向一個(gè)具體的對(duì)象.
比如說(shuō)Student stu = new Student();, 這里的stu就是一個(gè)引用, 它指向的是當(dāng)前new出來(lái)的Student對(duì)象. 當(dāng)我們想要操作這個(gè)Student對(duì)象時(shí), 只需要操作引用即可, 比如說(shuō)int age = stu.getAge();.
所以用"=="判斷兩個(gè)引用數(shù)據(jù)類(lèi)型是否相等的時(shí)候, 實(shí)際上是在判斷兩個(gè)引用是否指向同一個(gè)對(duì)象.
看下面的示例
public static void main(String[] args) {
String s1 = "hello"; //s1指向常量池中的"hello"字符串
String s2 = "hello"; //s2也指向常量池中的"hello"字符串
System.out.println(s1 == s2); //true
String s3 = new String("hello"); //s3指向的是堆內(nèi)存中的字符串對(duì)象
System.out.println(s1 == s3); //false
}
從上面的例子可以看到, 由于引用"s1"和"s2"指向的都是常量池中的"hello"字符串, 所以返回true.
而"s3"指向的是新創(chuàng)建字符串對(duì)象, 因?yàn)橹灰獎(jiǎng)佑昧?b>new關(guān)鍵字, 就會(huì)在堆內(nèi)存創(chuàng)建一個(gè)新的對(duì)象,
也就是說(shuō)s1和s3指向的是不同的字符串對(duì)象, 所以返回false.
判斷是否相等-equals()方法介紹.
equals()和==有著本質(zhì)的區(qū)別, ==可以看作是對(duì)操作系統(tǒng)比較數(shù)據(jù)手段的封裝, 而equals()則是每個(gè)對(duì)象自帶的比較方法.
equals()和==的本質(zhì)區(qū)別更通俗的說(shuō)法是, ==的比較規(guī)則是定死的, 如上面所述; 而equals()的比較規(guī)則是不固定的, 可以由用戶(hù)自己定義.
看下面的例子:
public static void main(String[] args) {
String s1 = "hello";
String s3 = new String("hello");
System.out.println(s1.equals(s3)); //true
}
在用==比較的時(shí)候, 上面s1和s3比較出的結(jié)果為false. 而當(dāng)用equals比較的時(shí)候, 得出的結(jié)果為true.
想知道原因我們還得看源碼, 下面是String類(lèi)的equals()源碼.
public boolean equals(Object anObject) {
if (this == anObject) { //先比較兩個(gè)字符串的引用是否相等(是否指向同一個(gè)對(duì)象), 是直接返回true
return true;
}
if (anObject instanceof String) { //兩個(gè)引用不等還會(huì)繼續(xù)比較
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value; //字符串類(lèi)是用字符數(shù)組實(shí)現(xiàn)的, 先要拿到兩個(gè)字符串的字符數(shù)組
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) { //然后對(duì)兩個(gè)數(shù)組逐個(gè)字符地進(jìn)行比較
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
從上面的源碼可以看到, 當(dāng)調(diào)用String類(lèi)型的equals()方法時(shí), 首先會(huì)判斷兩個(gè)字符串的引用是否相等, 也就是說(shuō)兩個(gè)字符串引用是否指向同一個(gè)對(duì)象, 是則返回true.
如果不是指向同一個(gè)對(duì)象, 則把兩個(gè)字符串中的字符挨個(gè)進(jìn)行比較. 由于s1和s3字符串都是"hello", 是可以匹配成功的, 所以最終返回true.
深入探究equals(), 為什么會(huì)有equals()方法);
通過(guò)上面的講解相信你已經(jīng)知道==和equals()的區(qū)別, 一個(gè)的比較規(guī)則是定死的, 一個(gè)是可以由編程人員自己定義的.
可是為什么會(huì)有equals()方法, 而且還可以被自由定制呢);
這個(gè)問(wèn)題要落到Java語(yǔ)言的核心--面向?qū)ο笏枷肓? Java不同于面向過(guò)程的C語(yǔ)言, Java是一款面向?qū)ο蟮母呒?jí)語(yǔ)言. 如果只是面向過(guò)程, 直接操作內(nèi)存上存儲(chǔ)的數(shù)據(jù)的話(huà), 用==所定義的規(guī)則來(lái)判斷兩個(gè)數(shù)據(jù)是否相等已經(jīng)足夠了.
而Java中處處是對(duì)象, 我們經(jīng)常要面對(duì)的問(wèn)題是這兩個(gè)對(duì)象是否相等, 而不是這兩串二進(jìn)制數(shù)是否相等, 僅有"=="是完全不夠用的.
考慮到編程人員會(huì)使用Java創(chuàng)建各種滿(mǎn)足它們業(yè)務(wù)需求的對(duì)象, 系統(tǒng)無(wú)法提前知道兩個(gè)對(duì)象在什么條件下算相等, Java干脆把判斷對(duì)象是否相等的權(quán)力交給編程人員.
具體的措施是: 所有的類(lèi)都必須繼承Object類(lèi), 而Object類(lèi)中寫(xiě)有equals()方法. 編程人員可以通過(guò)重寫(xiě)equals()方法實(shí)現(xiàn)自己的比較策略, 也可以不重寫(xiě), 使用Object類(lèi)的equals()比較策略.
//Object類(lèi)中的equals()方法源碼
public boolean equals(Object obj) {
return (this == obj);
}
從Object類(lèi)的equals()源碼可以看到, 如果編程人員沒(méi)有顯示地重寫(xiě)equals()方法, 則該類(lèi)對(duì)象默認(rèn)通過(guò)引用數(shù)據(jù)類(lèi)型進(jìn)行比較, 也就是說(shuō)比較兩個(gè)引用是否指向同一個(gè)對(duì)象.
補(bǔ)充: 關(guān)于基本數(shù)據(jù)類(lèi)型包裝類(lèi)的比較
由于Java中萬(wàn)物皆對(duì)象, 就連基本數(shù)據(jù)類(lèi)型也有其對(duì)應(yīng)的包裝對(duì)象, 那么它們對(duì)應(yīng)的比較策略是什么呢);
public static void main(String[] args) {
int a = 3;
Integer b = new Integer(3);
System.out.println(b.equals(a)); //true, 自動(dòng)裝箱
}
從上面的代碼可以看到盡管兩個(gè)引用不同, 但是輸出的結(jié)果仍為true, 證明Integer包裝類(lèi)重寫(xiě)了equals()方法.
//Integer類(lèi)中的equals方法
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
從源碼看到, 基本類(lèi)型包裝類(lèi)在重寫(xiě)的equals方法中, 比較的還是基本數(shù)據(jù)類(lèi)型的值.
最后歡迎關(guān)注我的免費(fèi)知識(shí)星球, 我會(huì)在星球中持續(xù)更新系統(tǒng)的Java后端面試題分析, 將會(huì)囊括Java基礎(chǔ)知識(shí)到主流框架原理. 還會(huì)分享關(guān)于編程的趣味漫畫(huà).
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/7154.html
摘要:相等判斷符介紹相等判斷符用于比較基本數(shù)據(jù)類(lèi)型和引用類(lèi)型數(shù)據(jù)當(dāng)比較基本數(shù)據(jù)類(lèi)型的時(shí)候比較的是數(shù)值當(dāng)比較引用類(lèi)型數(shù)據(jù)時(shí)比較的是引用指針判斷基本類(lèi)型是否相等首先基本數(shù)據(jù)類(lèi)型指的是中的八大數(shù)據(jù)類(lèi)型這八大基本數(shù)據(jù)類(lèi)型有個(gè)共同的特點(diǎn)是它們?cè)趦?nèi)存中是有具相等判斷符==介紹 ? ==相等判斷符用于比較基本數(shù)據(jù)類(lèi)型和引用類(lèi)型數(shù)據(jù). 當(dāng)比較基本數(shù)據(jù)類(lèi)型的時(shí)候比較的是數(shù)值, 當(dāng)比較引用類(lèi)型數(shù)據(jù)時(shí)比較的是引用(指...
摘要:相等判斷符介紹相等判斷符用于比較基本數(shù)據(jù)類(lèi)型和引用類(lèi)型數(shù)據(jù)當(dāng)比較基本數(shù)據(jù)類(lèi)型的時(shí)候比較的是數(shù)值當(dāng)比較引用類(lèi)型數(shù)據(jù)時(shí)比較的是引用指針判斷基本類(lèi)型是否相等首先基本數(shù)據(jù)類(lèi)型指的是中的八大數(shù)據(jù)類(lèi)型這八大基本數(shù)據(jù)類(lèi)型有個(gè)共同的特點(diǎn)是它們?cè)趦?nèi)存中是有具相等判斷符==介紹 ==相等判斷符用于比較基本數(shù)據(jù)類(lèi)型和引用類(lèi)型數(shù)據(jù). 當(dāng)比較基本數(shù)據(jù)類(lèi)型的時(shí)候比較的是數(shù)值, 當(dāng)比較引用類(lèi)型數(shù)據(jù)時(shí)比較的是引用(指針...
摘要:它也是用來(lái)判斷兩個(gè)對(duì)象是否相等,所以也得分不同的情況來(lái)說(shuō)明。什么是的作用是獲取哈希碼,也稱(chēng)為散列碼它返回的一個(gè)整數(shù)。這個(gè)哈希碼的作用是確定該對(duì)象在哈希表中的索引位置。它定義在的中,這就意味著中的任何類(lèi)都包含有函數(shù)。 前言 萬(wàn)丈高樓平地起,今天的聊點(diǎn)基礎(chǔ)而又經(jīng)常讓人忽視的話(huà)題,比如==與equals()區(qū)別?為何當(dāng)我們重寫(xiě)完equals()后也要有必要去重寫(xiě)hashcode()呢? .....
摘要:所以我決定先從類(lèi)入手,深入的研究一番來(lái)開(kāi)個(gè)好頭。之所以會(huì)有以上的效果,是因?yàn)橛凶址A砍氐拇嬖?。同時(shí)運(yùn)行時(shí)實(shí)例創(chuàng)建的全局字符串常量池中有一個(gè)表,總是為池中的每個(gè)字符串對(duì)象維護(hù)一個(gè)引用,所以這些對(duì)象不會(huì)被。 開(kāi)始寫(xiě) Java 一年來(lái),一直都是遇到什么問(wèn)題再去解決,還沒(méi)有主動(dòng)的深入的去學(xué)習(xí)過(guò) Java 語(yǔ)言的特性和深入閱讀 JDK 的源碼。既然決定今后靠 Java吃飯,還是得花些心思在上...
摘要:一基礎(chǔ)接口的意義百度規(guī)范擴(kuò)展回調(diào)抽象類(lèi)的意義想不想通過(guò)一線(xiàn)互聯(lián)網(wǎng)公司面試文檔整理為電子書(shū)掘金簡(jiǎn)介谷歌求職記我花了八個(gè)月準(zhǔn)備谷歌面試掘金原文鏈接翻譯者 【面試寶典】從對(duì)象深入分析 Java 中實(shí)例變量和類(lèi)變量的區(qū)別 - 掘金原創(chuàng)文章,轉(zhuǎn)載請(qǐng)務(wù)必保留原出處為:http://www.54tianzhisheng.cn/... , 歡迎訪(fǎng)問(wèn)我的站點(diǎn),閱讀更多有深度的文章。 實(shí)例變量 和 類(lèi)變量...
閱讀 736·2023-04-25 19:43
閱讀 3981·2021-11-30 14:52
閱讀 3807·2021-11-30 14:52
閱讀 3871·2021-11-29 11:00
閱讀 3802·2021-11-29 11:00
閱讀 3904·2021-11-29 11:00
閱讀 3580·2021-11-29 11:00
閱讀 6184·2021-11-29 11:00