String 類的equal 和 == 的區別?

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對象的創建做具體的分析:

String s1 = new String("Hello");
String s2 = new String("Hello");

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

以上代碼段的打印結果是:

false
true

這個原因很好解釋:s1 、s2分別new了兩個值爲“Hello”的對象,new關鍵字爲創建的每個對象分配一塊新的、獨立的內存堆,即s1、s2指向的內存空間不一致。而這兩個字符串的內容是一直的,所以 equal會返回true。

看下面一個例子:

String s1 = new String("Hello");
String s2 = s1;

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

以上代碼段的打印結果是:

true
true

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

String s1 = "Hello";
String s2 = "Hello";

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

以上代碼段的打印結果是:

true
true

爲什麼這個結果?那麼來分析一下。首先這兩個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作爲一個基本類型來使用:

1。如果String作爲一個基本類型來使用,並且此時String緩衝池內不存在與其指定值相同的String對象,那麼此時虛擬機將爲此創建新的String對象,並存放在String緩衝池內。
2。如果String作爲一個基本類型來使用,並且此時String緩衝池內存在與其指定值相同的String對象,那麼此時虛擬機將不爲此創建新的String對象,而直接返回已存在的String對象的引用。

發佈了69 篇原創文章 · 獲贊 99 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章