2013-04-15 57 views
0

爲什麼這是falseString.trim()對同一個引用對象返回false

String str1 = new String("Java "); 
String str2 = str1; 
System.out.println(str1.trim()==str2.trim()); //false 

最初str2被引用str1對象。所以,與==比較會返回true爲str1==str2

那麼爲什麼這個爲false.trim()方法呢?

即使它返回假的文字(沒有新的關鍵字)

String str1 = "Java "; //this is now without new keyword 
String str2 = str1; 
System.out.println(str1.trim()==str2.trim()); 

注:我知道如何使用.equals方法。但是想要知道==行爲,特別是在.trim()的情況下,以上給出的兩個例子。

+0

你得到了什麼輸出? – iCode

+4

,因爲他們現在不是相同的refrences.Keep字符串是不可變的 – Freak

+0

閱讀http://stackoverflow.com/questions/7311451/difference-between-equals-and-instanceof –

回答

1

「==」

作品上refrences功能trim創建一個新的對象,將有新的refrence。這就是它將通常返回假的原因

4

使用equals()equalsIgnoreCase()方法來比較字符串。 ==比較對象標識。

+0

@downvoter謹慎解釋你的遲來的行動? –

2

字符串與equals進行比較,而不是==

4

使用等於代替==

System.out.println(str1.equals(str2.trim())); 
1

如果你想比較字符串的內容,你需要.equeals

你(修改)例如

String str1 = new String("Java "); 
String str2 = str1; 
System.out.println(str1.trim().equals(str2.trim())); //is now true 
1

對於字符串比較,你應該使用str1.equals(str2)str1.equalsIgnoreCase(str2)

欲瞭解更多積分,請點擊這裏question

0

你有兩個不同的字符串,所以兩個不同的引用。要比較內容使用equals()

1

由於您使用String str1=new String("Java "); 不能使用==操作

如果使用String str1="Java ";,你可以使用==

因此,這裏要麼改變代碼String str1="Java ";

或更改

System.out.println(str1.trim().equals(str2.trim())); 
+2

不準確。你**可以總是**使用'=='運算符,但它會比較引用。如果不使用'new'關鍵字,那麼具有*相同*字符串值的字符串的引用將是相同的(因爲該池)。這就是爲什麼在這種情況下'=='是*「好」的原因。 – Maroun

+0

是的。 '=='可以一直使用。但是如果String是使用new運算符創建的,則它將顯示_not equal_,因爲這兩個字符串在內存中具有不同的散列碼。如果沒有'兩個字符串的new'散列碼時便會一樣,然後,如果'==使用',它會比較這兩個散列碼,並會採取相同的 – iCode

0

==會比較一下如果refe拖曳對象的內容是相同的,因爲它檢查兩個對象是否相同而不檢查對象的內容。 由於字符串是一個對象==只能使用與字符串類型相同的對象而不檢查字符串的內容。 檢查字符串 使用

equals() or equalsIgnoreCase 
0

您正在使用==符號進行比較的內容。在java中,這將比較實際的對象,也就是說,兩個變量是否指向內存中相同的物理對象,相同的內存位置。

如果要比較字符串的實際內容,那麼如果不關心該情況,則需要使用String類的方法equals(或equalsIgnoreCase)。

這同樣適用於任何其他類型的對象。如果使用==進行比較,則會比較兩個變量的物理內存位置。您可以使用equals方法來比較對象的實際內容(只要該類實際實現此方法)。

3

字符串在Java中是不可變的。 還有字符串文字是interned的,即java維護一個字符串文字池。

用前兩行創建一個對象,將兩個引用str1和str2創建到同一個對象。

將trim()應用於字符串時,它會形成一個新的字符串對象,並將當前引用分配給新對象。 但是,由於在創建對象str1.trim()和str2.trim()時使用了new,所以最終都會創建2個獨立的對象。

參見:http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#trim%28%29

修剪()方法創建新的對象。由於您在相同的對象上單獨應用trim()(儘管由多個引用str1和str2引用),因此創建了2個新對象。 這就是引用等式不起作用的原因。

+0

它返回false,即使文字(不包括新的關鍵字) – AmitG

+0

@Amit更新了我的答案。請立即檢查。 – prashant