搜尋
首頁科技週邊人工智慧Java中的equals()與==的差異與用法

在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中文網其他相關文章!

陳述
本文轉載於:51CTO.COM。如有侵權,請聯絡admin@php.cn刪除
前十名必須閱讀機器學習研究論文前十名必須閱讀機器學習研究論文Apr 19, 2025 am 09:53 AM

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

替換SEO機構的11個AI工具 - 分析Vidhya替換SEO機構的11個AI工具 - 分析VidhyaApr 19, 2025 am 09:49 AM

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

前10個免費的AI遊樂場供您在2025年嘗試-Analytics Vidhya前10個免費的AI遊樂場供您在2025年嘗試-Analytics VidhyaApr 19, 2025 am 09:45 AM

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

矢量數據庫中索引算法的詳細指南矢量數據庫中索引算法的詳細指南Apr 19, 2025 am 09:41 AM

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

反向擴散過程是什麼? - 分析Vidhya反向擴散過程是什麼? - 分析VidhyaApr 19, 2025 am 09:40 AM

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

掌握及時工程中的字典技術鏈掌握及時工程中的字典技術鏈Apr 19, 2025 am 09:38 AM

解鎖AI潛力:詞典鏈,用於增強及時工程 在人工智能和自然語言處理的快速發展的景觀中,速度和效率至關重要。 詞典方法e

如何使用Pyvista進行交互式3D醫療可視化如何使用Pyvista進行交互式3D醫療可視化Apr 19, 2025 am 09:31 AM

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

什麼是及時工程中的符號鏈? - 分析Vidhya什麼是及時工程中的符號鏈? - 分析VidhyaApr 19, 2025 am 09:27 AM

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

See all articles

熱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 無盡。

熱工具

mPDF

mPDF

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

SublimeText3 英文版

SublimeText3 英文版

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

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器