搜尋
首頁Javajava教程String使用equals方法和==分別比較的是什麼

equals方法和==的差別

  首先大家知道,String既可以當作一個物件來使用,又可以當作一個基本型別來使用。這裡指的作為一個基本型別來使用只是指使用方法上的,例如String s = "Hello",它的使用方法如同基本型別int一樣,如int i = 1;,而作為一個物件來使用,則是指透過new關鍵字來建立一個新對象,例如String s = new String("Hello")。但是它的內部動作其實還是創造了一個對象,這點稍後會說到。

        其次,對String物件的比較方法有待了解。 Java裡物件之間的比較有兩種概念,這裡拿String物件來說:一種是用"=="來比較,這種比較是針對兩個String類型的變數的引用,也就是說如果兩個String類型的變數,它們所引用同一個String物件(即指向同一塊記憶體堆),則"=="比較的結果是true。另一種是用Object物件的equals()方法來比較,String物件繼承自Object,並且對equals()方法進行了重寫。兩個String物件透過equals()方法來比較時,其實就是對String物件所封裝的字串內容進行比較,也就是說如果兩個String物件所封裝的字串內容相同(包括大小寫相同),則equals()方法將傳回true。

現在開始將對String物件的建立做具體的分析:

1、/////////////////////////////// //////////////////////////////////////////

String s1 = new String( "Hello");

String s2 = new String("Hello");

System.out.println(s1 == s2);

System.out.println(s1.equals(s2));以上程式碼段的列印結果是:

false

tru​​e

        這個結果相信大家很好理解,兩個String類型的變數s1和s2都透過new關鍵字分別創造了一個新的String對象,這個new字為創建的每個物件分配一塊新的、獨立的記憶體堆。因此當透過"=="來比較它們所引用的是否是同一個物件時,將會傳回false。而透過equals()方法來比較時,則傳回true,因為這兩個物件所封裝的字串內容是完全相同的。

2、/////////////////////////////////////////////// ////////////////////////////////////

String s1 = new String("Hello");

String s2 = s1;

System.out.println(s1 == s2);

System.out.println(s1.equals(s2));

true

        這個結果應該更好理解,變數s1還是透過new關鍵字來創建了一個新的String對象,但這裡s2並沒有透過new關鍵字來創建一個新的String對象,而是直接把s1賦值給了s2,也就是把s1的引用賦值給了s2,所以s2所引用的物件其實就是s1所引用的物件。所以透過"=="來比較時,回傳true。既然它們所引用的都是同一個對象,那麼透過equals()方法來比較時,肯定也回傳true,這裡equals()方法其實在對同一個物件進行比較,自己一定等於自己咯。

3、/////////////////////////////////////////////// ////////////////////////////////

String s1 = "Hello";

String s2 = "Hello";

System.out.println(s1 == s2);

System.out.println(s1.equals(s2));

結果?那麼來分析一下。首先這兩個String物件都是作為一個基本類型來使用的,而不是透過new關鍵字來建立的,因此虛擬機器不會為這兩個String物件分配新的記憶體堆,而是到String緩衝池中來尋找。

        先為s1尋找String緩衝池內是否有與"Hello"相同值的String物件存在,此時String緩衝池內是空的,沒有相同值的String物件存在,所以虛擬機會在String緩衝池內建立此String物件,其動作就是new String("Hello");。然後把此String物件的引用賦值給s1。

        接著為s2尋找String緩衝池內是否有與"Hello"相同值的String物件存在,此時虛擬機器找到了一個與其相同值的String對象,這個String物件其實就是為s1所建立的String物件。既然找到了一個相同值的對象,那麼虛擬機器就不在為此創建一個新的String對象,而是直接把存在的String物件的參考賦值給s2。

        這裡既然s1和s2所引用的是同一個String對象,也就是自己等於自己,所以以上兩種比較方法都會回到ture。

        到這裡,對String物件的基本概念應該都已經被理解了。現在我來小結一下:

針對String作為一個基本型別來使用:

1。如果String作為一個基本類型來使用,那麼我們視此String物件是String緩衝池所擁有的。

2。如果String是作為一個基本類型來使用,並且此時String緩衝池內不存在與其指定值相同的String對象,那麼此時虛擬機將為此建立新的String對象,並存放在String緩衝池內。

3。如果String是作為一個基本類型來使用,並且此時String緩衝池內存在與其指定值相同的String對象,那麼此時虛擬機將不會為此建立新的String對象,而直接傳回已存在的String物件的參考。

針對String作為一個物件來使用:

1。如果String作為一個物件來使用,那麼虛擬機將為此創建一個新的String對象,即為此對象分配一塊新的記憶體堆,並且它並不是String緩衝池所擁有的,即它是獨立的。

理解了以上內容後,請看以下程式碼段:

4、/////////////////////////////// /////////////////////////////////////////////

String s1 = "Hello";

String s2 = new String("Hello");

System.out.println(s1 == s2);

System.out.println(s1.equals(s2));;程式碼段的印刷結果是:

false

tru​​e

        依照上面的小結來進行分析。第一行是把String當作一個基本型別來使用的,因此s1所引用的物件是屬於String緩衝池內的。且此時String緩衝池內並沒有與其值相同的String物件存在,因此虛擬機會為此建立一個新的String對象,即new String("Hello");。第二行是把String當作一個物件來使用的,因此s2所引用的物件不屬於String緩衝池內的,即它是獨立的。透過new關鍵字,虛擬機會為此建立一個新的String對象,即為它分配了一塊新的記憶體堆。因此"=="比較後的結果是false,因為s1和s2所引用的並不是同一個對象,它們是獨立存在的。而equals()方法所傳回的是true,因為這兩個物件所封裝的字串內容是完全相同的。

        現在,我相信大家已經完全弄清楚String物件是怎麼一回事了:)但到此並沒有結束,因為String物件還有更深層的應用。

        這裡我將分析String物件的intern()方法的應用:

intern()方法將傳回一個字串物件的規格表示法,即一個同該字串內容相同的字串,但是來自於唯一字串的String緩衝池。這聽起來有點拗口,其實它的機制有如以下程式碼區段:

String s = new String("Hello");

s = s.intern();

以上程式碼段的功能實作可以簡單的看成如下程式碼段:

String s = "Hello";

        你一定又開始懷疑了?那你可以先看第二個程式碼段。第二個程式碼段的意思就是從String緩衝池內取出一個與其值相同的String物件的引用賦值給s。如果String緩衝池內沒有與其相同值的String物件存在,則在其內為此建立一個新的String物件。那麼第一段程式碼的意思又是什麼呢?我們知道透過new關鍵字所建立的對象,虛擬機會為它分配一塊新的記憶體堆。如果平凡地創建相同內容的對象,虛擬機器同樣會為此分配許多新的記憶體堆,雖然它們的內容是完全相同的。拿String物件來說,如果連續建立10個相同內容的String物件(new String("Hello")),那麼虛擬機器就會為此分配10個獨立的記憶體堆。假設所建立的String物件的字串內容十分大,假設一個Stirng物件封裝了1M大小的字串內容,那麼如果我們建立10個此相同String物件的話,我們將會毫無意義的浪費9M的記憶體空間。我們知道String是final類,它所封裝的是字串常數,因此String物件在建立後其內部(字串)值不能改變,也因此String物件可以被共用。所以對於剛才提到的假設,我們所創建的10個相同內容的String對象,其實我們只需為此創建一個String對象,然後被其它String變數所共享。要實現這種機制,唯一的、簡單的方法就是使用String緩衝池,因為String緩衝池內不會存在相同內容的String物件。而intern()方法就是使用這種機制的途徑。在一個已實例化的String物件上呼叫intern()方法後,虛擬機會在String緩衝池內尋找與此Stirng物件所封裝的字串內容相同值的String對象,然後把引用賦值給引用原來的那個String對象的String類型變數。如果String緩衝池內沒有與此String物件所封裝的字串內容相同值的String物件存在,那麼虛擬機會為此建立一個新的String對象,並把其引用賦值給引用原來的那個String物件的String類型變數。這樣就達到了共享同一個String物件的目的,而原先那個透過new關鍵字建立出來的String物件將被拋棄並被垃圾回收器回收。這樣不但降低了記憶體的使用消耗,提高了性能,在String物件的比較上也同樣更方便了,因為相同的String物件將被共享,所以要判斷兩個String物件是否相同,則只需要使用" =="來比較,而無需再使用equals()方法來比較,這樣不但使用起來更方便,而且也提高了性能,因為String對象的equals()方法將會對字符串內容拆解,然後逐個進行比較,如果字串內容十分大的話,那麼這個比較動作則大大降低了效能。

        說到此,大家可能對具體應用還有點模糊,那麼我來舉個簡單的示例,以便闡述以上概念:

        假設有一個類,它有一個記錄消息的方法,這個方法記錄用戶傳來的訊息(假設訊息內容可能較大,且重複率較高),並且把訊息依接收順序記錄在一個清單中。我想有些朋友會這樣設計:

import java.util.*;

public class Messages {

ArrayList messages = new ArrayList();

public void record(String msg) {new ArrayList();

public void record(String msg) {anessages. );

}

public List getMessages() {

return messages;

}

}

        這個設計方案好嗎?假設我們重複的傳送給record()方法同一個訊息(訊息來自不同的用戶,所以可以視每個訊息為一個new String("...")),而且訊息內容較大,那麼這個設計將會大大浪費記憶體空間,因為訊息列表中記錄的都是新建立的、獨立的String對象,雖然它們的內容都相同。那麼怎麼樣可以對其進行最佳化呢,其實很簡單,請看如下優化後的範例:

import java.util.*;

public class Messages {

ArrayList messages = new ArrayList();public

ArrayList messages = new ArrayList();public

ArrayList messages = new ArrayList();public

ArrayList messages = new ArrayList();public

ArrayList messages = new ArrayList();public

ArrayList messages = new ArrayList();public

void record(String msg) {

messages.add(msg.intern());

}

public List getMessages() {

return messages;

} ,原先record()方法中的messages.add(msg);程式碼段變成了messages.add(msg.intern());,僅僅對msg參數呼叫了intern()方法,這樣將對重複的訊息進行共享機制,從而降低了記憶體消耗,提高了效能。


這個例子的確有點牽強,但是這裡只是為了闡述以上概念!

至此,String物件的迷霧都被消除了,大家只要牢記這些概念,以後再複雜的String應用都可以建立在此基礎上來進行分析。



🎜更多String使用equals方法和==分別比較的是什麼相關文章請關注PHP中文網! 🎜🎜🎜🎜
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
為什麼Java是開發跨平台桌面應用程序的流行選擇?為什麼Java是開發跨平台桌面應用程序的流行選擇?Apr 25, 2025 am 12:23 AM

javaispopularforcross-platformdesktopapplicationsduetoits“ writeonce,runany where”哲學。 1)itusesbytiesebyTecodeThatrunsonAnyJvm-備用Platform.2)librarieslikeslikeslikeswingingandjavafxhelpcreatenative-lookingenative-lookinguisis.3)

討論可能需要在Java中編寫平台特定代碼的情況。討論可能需要在Java中編寫平台特定代碼的情況。Apr 25, 2025 am 12:22 AM

在Java中編寫平台特定代碼的原因包括訪問特定操作系統功能、與特定硬件交互和優化性能。 1)使用JNA或JNI訪問Windows註冊表;2)通過JNI與Linux特定硬件驅動程序交互;3)通過JNI使用Metal優化macOS上的遊戲性能。儘管如此,編寫平台特定代碼會影響代碼的可移植性、增加複雜性、可能帶來性能開銷和安全風險。

與平台獨立性相關的Java開發的未來趨勢是什麼?與平台獨立性相關的Java開發的未來趨勢是什麼?Apr 25, 2025 am 12:12 AM

Java將通過雲原生應用、多平台部署和跨語言互操作進一步提昇平台獨立性。 1)雲原生應用將使用GraalVM和Quarkus提升啟動速度。 2)Java將擴展到嵌入式設備、移動設備和量子計算機。 3)通過GraalVM,Java將與Python、JavaScript等語言無縫集成,增強跨語言互操作性。

Java的強鍵入如何有助於平台獨立性?Java的強鍵入如何有助於平台獨立性?Apr 25, 2025 am 12:11 AM

Java的強類型系統通過類型安全、統一的類型轉換和多態性確保了平台獨立性。 1)類型安全在編譯時進行類型檢查,避免運行時錯誤;2)統一的類型轉換規則在所有平台上一致;3)多態性和接口機制使代碼在不同平台上行為一致。

說明Java本機界面(JNI)如何損害平台獨立性。說明Java本機界面(JNI)如何損害平台獨立性。Apr 25, 2025 am 12:07 AM

JNI會破壞Java的平台獨立性。 1)JNI需要特定平台的本地庫,2)本地代碼需在目標平台編譯和鏈接,3)不同版本的操作系統或JVM可能需要不同的本地庫版本,4)本地代碼可能引入安全漏洞或導致程序崩潰。

是否有任何威脅或增強Java平台獨立性的新興技術?是否有任何威脅或增強Java平台獨立性的新興技術?Apr 24, 2025 am 12:11 AM

新興技術對Java的平台獨立性既有威脅也有增強。 1)雲計算和容器化技術如Docker增強了Java的平台獨立性,但需要優化以適應不同雲環境。 2)WebAssembly通過GraalVM編譯Java代碼,擴展了其平台獨立性,但需與其他語言競爭性能。

JVM的實現是什麼,它們都提供了相同的平台獨立性?JVM的實現是什麼,它們都提供了相同的平台獨立性?Apr 24, 2025 am 12:10 AM

不同JVM實現都能提供平台獨立性,但表現略有不同。 1.OracleHotSpot和OpenJDKJVM在平台獨立性上表現相似,但OpenJDK可能需額外配置。 2.IBMJ9JVM在特定操作系統上表現優化。 3.GraalVM支持多語言,需額外配置。 4.AzulZingJVM需特定平台調整。

平台獨立性如何降低發展成本和時間?平台獨立性如何降低發展成本和時間?Apr 24, 2025 am 12:08 AM

平台獨立性通過在多種操作系統上運行同一套代碼,降低開發成本和縮短開發時間。具體表現為:1.減少開發時間,只需維護一套代碼;2.降低維護成本,統一測試流程;3.快速迭代和團隊協作,簡化部署過程。

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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

SublimeText3 Mac版

SublimeText3 Mac版

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

記事本++7.3.1

記事本++7.3.1

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

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

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