JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Java 新手區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 9.使用 '==' 運算子和 java.lang.String.equals()的不同 [Re:swanky]
swanky

暴走熊

版主

發文: 461
積分: 9
於 2003-08-21 09:12 user profilesend a private message to usersend email to swankyreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
作者: contagious (傳染) 看板: java
標題: [合作翻譯]Java新手 9
時間: Mon Jun 17 23:13:25 2002

9.當比較兩個字串(String)時,使用 '==' 運算子和 java.lang.String.equals()這個
method有什麼不同呢?

'=='這個運算子會看看這兩個字串的references是不是指向同一個字串object。而
java.lang.String.equals()這個method則會比較這兩個字串的"值"是不是一樣的。換句
話說,比較這兩個字串是不是有相同的字元序列。

當使用String literals(一串被雙引號括住的字元)時,使用 '=='運算子和使用equals
method 的結果會是一樣的。所有的String literals都是指向同一個String 類別的
instances。系統中有一個pool,當有新的String literals出現時,系統會先去檢查pool
之中,是不是已經存在一個和這個新的String literals有相同內容的物件。如果存在,
則會傳回一個指向這個此物件的reference。若不存在,則會將此String literals放到
pool中,然後傳回這個物件的reference。

舉個例子:
String s1 = "hello";
String s2 = "hell"+"o";
System.out.println("Using equals op"+ (s1==s2)); //True
System.out.println("Using equals method" + (s1.equals(s2))); //True

當字串是由"new"這個關鍵字所造出來的時候,則不是這麼一回事。

String s3 = new String("hello");
String s4 = new String("hello");
System.out.println("Using equals op" + (s3==s4)); //False
System.out.println("Using equals method" + (s3.equals(s4))); //True

傳用"new"這個關鍵字時,會造出兩個不同的物件,所以會有兩個不同的references,即
使在底層的string literal是一樣的。在上面的例子中,'=='運算子傳回false,因為兩
個references是不同的。而equals method則傳回true,因為這兩個物件所代表是同樣的
字元序列。

9. When testing for equality between strings, what is the difference between
using '=='operator and java.lang.String.equals(String)?

The '==' operator compares two string references to see if they point to the
same string object. The java.lang.String.equals() method checks if the objects' values are equal.That is, if the referent string objects have the
same character sequence.

In the case of string literals (a sequence of characters enclosed in double
quotes) applying '==' operator and the equals method will yield the same
results. All string literals reference an instance of class string. String
literals are "interned" to allow the sharing of String instances. A pool of
strings are maintained. When a new string literal is created, the pool is
checked for a string instance with the same character sequence. If such an
instance exists then a reference to that object is returned. Otherwise the
string object is added to the pool, and a reference to that object is returned.

For example:
String s1 = "hello";
String s2 = "hell"+"o";
System.out.println("Using equals op"+ (s1==s2)); //True
System.out.println("Using equals method" + (s1.equals(s2))); //True

This is not the case with strings that are created with the keyword, "new".

String s3 = new String("hello");
String s4 = new String("hello");
System.out.println("Using equals op" + (s3==s4)); //False
System.out.println("Using equals method" + (s3.equals(s4))); //True

Using the new operator you will create two distinct objects and thus, two
different references - although the underlying string literal is the same.
With deference to the above code, the '==' operator returns false
because the two references are different, while equals returns true, since
both object values represent the same sequence of characters.


reply to postreply to post
話題樹型展開
人氣 標題 作者 字數 發文時間
66936 [精華] 新手常見問題解答 swanky 26 2003-08-21 09:00
116428 1.java.lang.NoClassDefFoundError swanky 744 2003-08-21 09:02
51156 Re:1.java.lang.NoClassDefFoundError nfrog8108 150 2005-08-25 17:03
87200 11.deprecated是什麼意思? swanky 946 2003-08-21 09:15
62373 Re:11.deprecated是什麼意思? 寒冰 63 2003-12-25 20:01
72630 12.如何取得由Java程式呼叫的外在程式的執行結果? swanky 3459 2003-08-21 09:16
41373 Re:12.如何取得由Java程式呼叫的外在程式的執行結果? psmonkey 1049 2006-03-07 02:43
5112 Re:12.如何取得由Java程式呼叫的外在程式的執行結果? smartdanny 60 2014-08-07 16:02
72860 13.抽象類別和介面有什麼不同? swanky 3680 2003-08-21 09:18
63003 14.如何改變現在的工作目錄? swanky 951 2003-08-21 09:19
63425 15.前置和後置的increment運算子有什麼不同? swanky 1881 2003-08-21 09:20
62782 16.遞移運算子:為什麼 3<<3 和 3<<1 是一樣的? swanky 1117 2003-08-21 09:21
44886 Re:16.遞移運算子:為什麼 3<<3 和 3<<1 是一樣的? 小波 1188 2005-07-21 19:49
85605 17.如何對兩個日期做相減? swanky 1965 2003-08-21 09:22
52301 Re:17.如何對兩個日期做相減? dinos 25 2005-02-15 17:48
62956 18.我可以在哪裡找到Java程式的寫作慣例(coding convetions)? swanky 803 2003-08-21 09:23
65935 19.介面(interface)可以從別的地方繼承任何的行為嗎? swanky 1296 2003-08-21 09:25
65849 20.如何取得記憶體的統計資料(memory statistics)? swanky 1898 2003-08-21 09:26
71154 2. 啟動在 MS Windows 平台上的外部程式 swanky 757 2003-08-21 09:04
8835 Re:2. 啟動在 MS Windows 平台上的外部程式 kevin75116 238 2011-12-06 19:51
22117 Re:9.使用 '==' 運算子和 java.lang.String.equals()的不同 [Re:jason_chan19] viva0322 146 2008-05-05 11:24
77861 3. 下載最新版的 JDK swanky 122 2003-08-21 09:05
66899 4. 設定永久的 classpath swanky 878 2003-08-21 09:06
63472 5. 載入在使用者的 classpath 中所定義的類別 swanky 643 2003-08-21 09:07
65381 6. 拿到 Java 的認證 swanky 337 2003-08-21 09:08
63332 7. Sun 認證網站資源 swanky 339 2003-08-21 09:09
64783 8. 在基本資料型別和 java.lang.String 之間轉換 swanky 448 2003-08-21 09:11
97511 9.使用 '==' 運算子和 java.lang.String.equals()的不同 swanky 3116 2003-08-21 09:12
22219 Re:9.使用 '==' 運算子和 java.lang.String.equals()的不同 viva0322 867 2008-05-05 10:10
22019 Re:9.使用 '==' 運算子和 java.lang.String.equals()的不同 jason_chan19 690 2008-05-05 10:51
73254 10.在Java中是否可以移動/刪除檔案 swanky 1696 2003-08-21 09:14
39269 Re:10.在Java中是否可以移動/刪除檔案 mch 147 2006-06-11 15:01
» JWorld@TW »  Java 新手區

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8