首頁
中文書目錄
原文書目錄
 站內快速搜尋
資源中心
Book Series
Special Interest













■好消息,歐萊禮書籍已重新鋪貨至各大書局及網路書店,歡迎讀者選購       ■歡迎各院校採用歐萊禮書籍,學校團購請洽校園服務團隊

[FAQ]

a question please (String test)

From: Kuenhwa Chen
To: bookquestion@oreilly.com.tw
Sent: Friday, July 14, 2000 4:23 PM
Subject: a question please


您好 請教您一個問題 謝謝  如下 :

當輸入  java Test ? 時 (A) 與 (B) 各印出什麼結果?為什麼? ...都是String 物件 結果卻不同 @@

.....class Test ....
   ...main(String args[])...  file://部分程式碼省略   
 
     String s1 ="?";
     String s2 ="?";
       
(A)  if (s1==s2)
       System.out.println("yes");
     else
       System.out.println("no");
    
(B)  if (args[0]==s1)
       System.out.println("yes");
     else
       System.out.println("no");


您好,
關於您的問題,回答如下 :
(A) 的結果會是 yes
(B) 的結果會是 no
至於都是 String,但為何會不同 ?

== 運算子在兩個運算元相等的狀況下,會得到 true,如果不相等,則會得到 false。
用 == 測試基本資料型態時,它會測試運算元的值是否相同。
但對參考型態的運算元來說,它會測試運算元是否參考到同樣的物件或陣列;換句話說,
它並不會測試兩個不同物件或陣列的 "內容" 是否相同。
因此,你無法使用它來測試兩字串是否相同,因為 String 並不是 JAVA 的基本資料型態。

若要測試兩個 String 是否相同,應該用字串的 equals() 方法,像是這樣 :

         if ( s1.equals(args[0]) )
              System.out.println("S1 is equal to Arg0");
         else
              System.out.println("S1 is NOT equal to Arg0");

關於這類問題,建議您參考 <JAVA 技術手冊> 第三版,其第二章有詳細說明。

林長毅
Technical Editor
O'Reilly Taiwan


您好 這麼快獲得解答 很令我意外 您說的書籍我也打算去買呢關於您的回答
我想再提個疑問,您說 用 ==
測試基本資料型態時,它會測試運算元的值是否相同。但對參考型態的運算元來說,它會測試運算元是否參考到同樣的物件或陣列;換句話說,它並不會測試兩個不同物件或陣列的
"內容" 是否相同。 這件是我是知道  可是 S1 與 S2 應該是不同的物件啊
如下String S1String S2String arg[0] 如果如您所言,那麼  S1與 S2 就是 alies了
它們的 refrence value 不就相同了 ? 可是它們不是不同物件嗎
?麻煩再為我解答一次  謝謝您


您好,
問的好!這個問題我也曾疑惑過。
理論上,S1 與 S2 是不同的物件,但事實上,因為我們都是給予同樣的值 ("?" ),
而且在程式中都沒有變更它們的值,所以 javac 在產生 bytecode 時做了最佳化,
把 S1 與 S2 視為指向相同物件的 reference,因此 S1 == S2 的結果是 TRUE !
而這也是測試 S1 == arg[0]  的結果會是 false 的原因,因為 arg[0] 的值在產生 bytecode 時,
尚未決定。關於這方面的議題,您可以參考 <JAVA 虛擬機器>。
    在實務上,JAVA程式設計者很少用 == 來測試 String,因為沒有意義。?
 


您好
由於您的回答,我對這個問題已豁然開朗了
謝謝您
您們公司中文化的書籍我手上已有3本
希望以後還能持續從您們公司購到好的中文化書籍
再次感謝


| 首頁 | 聯絡我們 |
© 2009, O'Reilly Media, Inc. Taiwan Branch