目錄
1. 重寫.equals()方法
1.1. String類別的equals()方法
1.2. 範例說明
2.  其他方法比較
首頁 科技週邊 人工智慧 Java中的equals()與==的差異與用法

Java中的equals()與==的差異與用法

Mar 07, 2024 pm 03:28 PM
java 物件 string類 字串常數 true

在Java開發中有一個看似簡單,但在網路上有大量關於話題和問題,就是equals() 和== 運算子有什麼差別

  • ==: 運算子用來比較兩個物件的位址是否相等
  • equals(): 方法用來比較兩個物件的內容是否相等

今日內容介紹,大約花費9分鐘

Java中的equals()與==的差異與用法圖片

為了更好地理解這個區別,讓我們來看一個例子:

String str1 = new String("Hello");String str2 = new String("Hello");System.out.println(str1.equals(str2)); // 输出 trueSystem.out.println(str1 == str2); // 输出 false
登入後複製

範例中,雖然兩個字串的內容相同,但它們在記憶體中的位址是不同的。因此,使用.equals()方法比較它們的內容會回傳true,而使用"=="運算子比較它們的位址會傳回false

1. 重寫.equals()方法

學習過Java基礎的,應該知道Java所有類別都預設繼承Obejct類,Object類別中有一個.equals()方法

public boolean equals(Object obj) {return (this == obj);}
登入後複製

從程式碼大家可以發現.equals( )方法預設採用==運算子比較,如果子類別沒有重寫equals()方法,那麼就使用==運算子和equals()方法結果完全一樣--用來比較兩個物件記憶體位址是否相等。

但是實際情況是,有很多類別重寫equals()方法,這是因為記憶體位址比較要求比較嚴格,不太符合現實中所有的場景需求,例如String類,進行比較時,大多只想判斷內容是否相等,並不太想知道記憶體位址是否相等(是否為物件)。

在深入研究Java字串常數池的文章中,我們已經了解到Java虛擬機器為了優化記憶體利用和提升效能而專門為字串分配了一個獨立的空間-字串常數池。

建議優先使用 String s = "Hello" 這種方式建立字串對象,而不是使用 new 關鍵字,因為 new 需要額外在堆上分配記憶體空間。

1.1. String類別的equals()方法

Jdk11的String類別的equals()方法

public boolean equals(Object anObject) { //如果是同一个对象(即两个引用指向内存中的同一块地址),则直接返回trueif (this == anObject) {return true;} //如果是String类型的实例if (anObject instanceof String) { //Object类型的对象强制转换为String类型String aString = (String)anObject;//如果当前字符串对象和传入的字符串对象的编码方式相同if (coder() == aString.coder()) { //如果当前字符串和传入的字符串都是Latin1编码,则调用StringLatin1类的equals方法进行比较;如果其中一个或两个字符串是UTF16编码,则调用StringUTF16类的equals方法进行比较return isLatin1() ? StringLatin1.equals(value, aString.value): StringUTF16.equals(value, aString.value);}}return false;}
登入後複製

特別說明:Latin1(也稱為ISO 8859-1)和UTF-16(Unicode轉換格式16位元)是兩種不同的字元編碼方式

Latin1和UTF-16雖然是兩種編碼方式,但是差別不大,就拿UTF-16 的來的equals()方法來看

@HotSpotIntrinsicCandidatepublic static boolean equals(byte[] value, byte[] other) {if (value.length == other.length) {int len = value.length >> 1;for (int i = 0; i 
登入後複製

注意:Java8和Java11的equals()方法原始碼是有區別的JDK8的equals()方法

#
public boolean equals(Object anObject) {// 如果是同一个对象(即两个引用指向内存中的同一块地址),则直接返回trueif (this == anObject) {return true;}// 如果是String类型的实例if (anObject instanceof String) {////Object类型的对象强制转换为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;}
登入後複製

1.2. 範例說明

範例一:

new String("hello").equals("hello")
登入後複製

輸出結果是什麼?

String類別的equals方法比較的是字串物件的內容是否相等,因為都是"Hello",所以結果是true

範例二:

new String("hello") == "hello";
登入後複製

輸出結果是什麼?

==運算子比較的物件地址是否相等,==左邊是堆中建立對象,右邊是字串常數池對象,雖然內容相等,但是地址不相等,所以結果是false

範例三:

new String("hello") == new String("hello");
登入後複製

輸出結果是什麼?

#new 出來的物件一定是完全不同的記憶體位址,所以結果是false

範例四:

"hello" == "h"+"ello"
登入後複製

輸出結果是什麼?

h和ello都在字串常數池,所以編譯器在遇到操作符的時候將其自動最佳化為hello,所以結果是true

範例五:

new String("hello").intern() == "hello"
登入後複製

輸出結果是什麼?

new String("hello")在執行的時候,會先在字串常數池中創建對象,然後再在堆中創建對象;執行intern() 方法的時候發現字符串常數池中已經有了'hello'這個對象,所以就直接返回字串常數池中的物件引用了,那再與字串常數池中的'hello'比較,所以結果是true

深入解析String.intern()已經介紹過原因

2.  其他方法比較

除了.equals()方法和"=="運算子外,還有一些其他比較方法可以使用:

  • 1.Objects.equals()方法:這個靜態方法可以用來比較兩個物件是否相等,不需要在呼叫之前判斷物件是否為空。
Objects.equals("Hello", new String("Hello")); // 返回 true
登入後複製
  • 2.String類別的.contentEquals()方法:這個方法可以用來比較字串與任何字元序列(如StringBuffer、StringBuilder、String、 CharSequence)是否相等。
String str = "Hello";StringBuffer buffer = new StringBuffer("Hello");System.out.println(str.contentEquals(buffer)); // 输出 true
登入後複製

以上是Java中的equals()與==的差異與用法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java 中的完美數 Java 中的完美數 Aug 30, 2024 pm 04:28 PM

Java 完美數指南。這裡我們討論定義,如何在 Java 中檢查完美數?

Java 中的史密斯數 Java 中的史密斯數 Aug 30, 2024 pm 04:28 PM

Java 史密斯數指南。這裡我們討論定義,如何在Java中檢查史密斯號?帶有程式碼實現的範例。

Java Spring 面試題 Java Spring 面試題 Aug 30, 2024 pm 04:29 PM

在本文中,我們保留了最常被問到的 Java Spring 面試問題及其詳細答案。這樣你就可以順利通過面試。

突破或從Java 8流返回? 突破或從Java 8流返回? Feb 07, 2025 pm 12:09 PM

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

Java 中的時間戳至今 Java 中的時間戳至今 Aug 30, 2024 pm 04:28 PM

Java 中的時間戳記到日期指南。這裡我們也結合範例討論了介紹以及如何在java中將時間戳記轉換為日期。

Java程序查找膠囊的體積 Java程序查找膠囊的體積 Feb 07, 2025 am 11:37 AM

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4

如何在Spring Tool Suite中運行第一個春季啟動應用程序? 如何在Spring Tool Suite中運行第一個春季啟動應用程序? Feb 07, 2025 pm 12:11 PM

Spring Boot簡化了可靠,可擴展和生產就緒的Java應用的創建,從而徹底改變了Java開發。 它的“慣例慣例”方法(春季生態系統固有的慣例),最小化手動設置

創造未來:零基礎的 Java 編程 創造未來:零基礎的 Java 編程 Oct 13, 2024 pm 01:32 PM

Java是熱門程式語言,適合初學者和經驗豐富的開發者學習。本教學從基礎概念出發,逐步深入解說進階主題。安裝Java開發工具包後,可透過建立簡單的「Hello,World!」程式來實踐程式設計。理解程式碼後,使用命令提示字元編譯並執行程序,控制台上將輸出「Hello,World!」。學習Java開啟了程式設計之旅,隨著掌握程度加深,可創建更複雜的應用程式。

See all articles