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