平等

2014-11-08 35 views
1

我有這樣的代碼串進行比較,平等

class Test{ 

public static void main(String args[]) 
{ 
Boolean a; 
Boolean b; 
char [] c={'S','t','r','i','n','g'}; 

a=("String".replace('g','G')=="String".replace('g', 'G')); 
b=("String".replace('g','g')=="String".replace('g', 'g')); 

System.out.println("---"+a); 
System.out.println("---"+b); 
System.out.println(c.toString()=="String"); 
} 

外出時的賣出期權 ---假 ---真 假

我沒有被Oracle訪問JLS文件的地方說。 替換方法: 返回一個新字符串,它是用newChar替換此字符串中出現的所有oldChar。 如果字符oldChar不出現在由此String對象表示的字符序列中,則返回對此String對象的引用。否則,將創建一個新的String對象,該對象表示與由此String對象表示的字符序列相同的字符序列,除了每次出現的oldChar被newChar的出現替換。

當O/P一個是錯誤的爲什麼O/P秒是真實的?

JLS文件說到toString方法: 該對象(它已經是一個字符串!)本身返回。 那麼爲什麼不O/P第三是真實的?

任何一個可以請解釋一下

在此先感謝 GPAR

+2

使用等於insted的== – Uhla 2014-11-08 17:01:10

+0

我猜這是因爲內部使用的字符串池,其中相同的字符串將不會創建兩次。在旁註:格式化您的代碼。 – keyser 2014-11-08 17:06:29

+1

@烏拉不,這不是說這個問題。 'ToYonos'不,這不是重複的。 – Tom 2014-11-08 17:19:19

回答

2
a=("String".replace('g','G')=="String".replace('g', 'G')); 

這將返回false,因爲replace方法返回一個全新的String實例。檢查==返回false,因爲這兩個部分引用不同的String實例。

b=("String".replace('g','g')=="String".replace('g', 'g')); 

這返回true,因爲replace方法返回String例如在它被調用,如果oldCharnewChar是相同的(source)。由於"String"是一個interned字符串,這兩個部分都指向同一個實例。

c.toString()=="String"; 

這返回false再次,因爲toString()返回包含數組表示一個新String實例。這種表示形式可以像這樣[[email protected]。這意味着即使撥打c.toString().equals("String")電話也不會返回true

+0

@SotiriosDelimanolis是的,那是對的,謝謝。我用'System.out.println(c);'測試了它,但這與System.out.println(c.toString());'不一樣。 – Tom 2014-11-08 17:31:22

+1

現在你已經有了一個完整的答案。 +1 – 2014-11-08 17:31:43

+0

然後我們不能有字符數組的字符串?對不起,這是從我原來的問題轉移。即在我的代碼字符串[] C到字符串? – Gpar 2014-11-08 18:00:46

0

AFAIK ==操作符檢查的對象實際上是一樣的。 如果你想比較對象的內容,你應該使用.equals()

它可能有點混淆爲什麼第一個檢查返回false而不是第二個。 我認爲這可能是由於.replace(a,b)其中a == b實際上並沒有修改字符串,因此實例是相同的,而當字符串被修改時,實例是不同的。

所以簡而言之:使用a.equals(b);代替a == b;

+0

謝謝我知道等於方法和==運算符之間的區別。我只是想弄清楚哪個方法的字符串創建新的字符串,哪一個返回相同的引用? – Gpar 2014-11-08 17:48:46

5

"String".replace('g','g')不作任何更改並返回原始字符串。這兩個字符串文字都在字符串池中作爲單個對象。所以

"String".replace('g','g')=="String" 

這就是爲什麼你的b布爾值爲true。

至於c,你打電話給toString()char陣列。 A char array不是String ..沒有理由在你的代碼中返回與另一個String相同的實例。