在Java開發中有一個看似簡單,但在網路上有大量關於話題和問題,就是equals() 和== 運算子有什麼差別
- ==: 運算子用來比較兩個物件的位址是否相等
- equals(): 方法用來比較兩個物件的內容是否相等
今日內容介紹,大約花費9分鐘
圖片
為了更好地理解這個區別,讓我們來看一個例子:
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中文網其他相關文章!

本文探討了十個徹底改變人工智能(AI)和機器學習(ML)的開創性出版物。 我們將研究神經網絡和算法的最新突破,並解釋驅動現代AI的核心概念。 Th

AI在SEO中的崛起:超過SEO代理商的前11個工具 AI的快速發展已深刻地重塑了SEO景觀。 旨在提高頂級搜索引擎排名的企業正在利用AI優化其在線策略的能力。 來自AU

探索2024年最好的免費AI遊樂場:綜合指南 訪問正確的工具和平台是在不斷發展的人工智能(AI)領域學習和創新的關鍵。 AI遊樂場提供了絕佳的機會

介紹 向量數據庫是專門的數據庫,旨在有效地存儲和檢索高維矢量數據。 這些向量代表數據點的特徵或屬性,範圍從數十到數千個維度,具體取決於

穩定的擴散:揭示反向擴散的魔力 穩定的擴散是一種強大的生成模型,能夠從噪聲中產生高質量的圖像。此過程涉及兩個關鍵步驟:正向擴散過程(在上一個A中詳細介紹

Pyvista:3D醫學和科學可視化的強大工具 想像一下可能性:一名醫學專業的學生毫不費力地探索複雜的解剖結構或數據科學家製作交互式3D模型。 Pyvista賦予了這樣的努力

使用符號鏈方法的及時工程:綜合指南 使用大型語言模型(LLM)(例如GPT-3或GPT-4)通常受益於復雜的及時工程。 符號方法鏈提供了一種結構化方法


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SublimeText3漢化版
中文版,非常好用

Dreamweaver Mac版
視覺化網頁開發工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器