promotion image of download ymail app
Promoted

JAVA 證明題顯示String內容無法改變?

小弟測試了很久可是都不會出現

"String內容無法改變"

的錯誤訊息....

因為小弟感覺如果String內容無法改變那這樣int或其它的不就也一樣無法改變...意思是覺的是否有int內容無法改變這種說法....小弟測了很久都是String指向新的字串而舊的字串沒用到就被回收...

可是沒辦法測出String內容無法改變的紅色波浪底線= ="

public static void main(String[] args) {

String s="1";

String t="1";

int b=4;

int f=6;

System.out.println(s==t);

System.out.println(b==f);

}

像這個那我不是可以說int及其它(double byte long.......)的內容無法改變....拜託各位大大能否幫我解出這個JAVA證明題...

小弟非常感謝了><"拜託

4 Answers

Rating
  • 1 decade ago
    Favorite Answer

    int, double, byte, long... 等是原始型態 (primitive type),並非物件,因此沒有所謂能不能改變的問題 (mutable),int i = 0 中的 i 和 0 是同一個東西,等號 (=) 的意思是給定 i 這個參數一個值,為 0;String 是個物件,String s = "abc" 中 "abc" 是個物件, s 是一個指標 (reference),等號 (=) 的意思是將 s 指向 "abc"。兩者的概念大不同,而 String 類別本身是設計為不可改變內部文字構造的 (immutable),相對於 StringBuffer 則是可以改變的,兩種類別適用於不同之處,相信版大應該在這個部分了解一些,在此不贅述。至於要證明 int 和 String 在是否會改變內部構造 (mutable) 的部分,請參考我的做法。

    public static void main(String[] args) {

    String s = "abcabc";

    String s1 = "abcabc";

    System.out.println("" + (s == s1));

    s1 = s1.replace('a', 'x');

    s1 = s1.replace('x', 'a');

    System.out.println("s = " + s);

    System.out.println("s1 = " + s1);

    // 原本 s 和 s1 指的是同一個 "abcabc"

    // 雖然 s1 經過兩次的變化,變回 "abcabc"

    // 但因 String 是 immutable 所以只要有改變, 就不會指向同一個物件

    System.out.println("" + (s == s1));

    System.out.println();

    int x = 8;

    int y = 8;

    System.out.println("" + (x == y));

    y = y - 3;

    y = y + 3;

    System.out.println("" + (x == y));

    System.out.println();

    StringBuffer sb = new StringBuffer("abcabc");

    StringBuffer sb1 = sb;

    sb1 = sb1.reverse();

    sb1 = sb1.reverse();

    // 由於 StringBuffer 是 mutable 能改變內部文字

    // 因此不論怎麼變 sb 都會和 sb1 指向同一個物件

    System.out.println("" + (sb == sb1));

    }

    • Commenter avatarLogin to reply the answers
  • ?
    Lv 4
    1 decade ago

    TO ξ靈均ξ:

    >s = i + ""; <--這樣就可以騙過編譯器了!

    誰騙你的?

    這樣是告訴編譯器做字串的串接,若去decompile出來

    結果大概如下

    s = new StringBuffer().append(i).append("");

    java運算子+,會將其左右的運算元做相加的動作,結果以較大的型態儲存,如 int + long 結果以 long 儲存,若是一邊為字串,則會行字串的串接。

    i + ""的結果為字串,所以指定給String變數s是合法的,並沒有誰騙誰。

    2009-08-14 15:24:39 補充:

    補充:decompile的結果會視編譯器和反編譯器的版本實作不同而有不同,這裡只是提供參考

    另外提供天空愛情,這裡的解釋很清楚

    http://caterpillar.onlyfun.net/Gossip/JavaGossip-V...

    2009-08-17 00:23:26 補充:

    TO ξ靈均ξ:

    瞭解,因為這邊初學者多,我怕有人會被誤導

    • Commenter avatarLogin to reply the answers
  • 1 decade ago

    在Java裡

    一個 = 是指派

    二個 == 是比較

    如果要改更String的值要用一個 =

    A = B ; //B的值丟給A

    如果要指派Int給String的話,不能直接給!

    String s = "3";

    int i = 5;

    s = i ; <--這樣會出錯

    --------------

    s = i + ""; <--這樣就可以騙過編譯器了!

    2009-08-16 17:30:02 補充:

    TO +0:

    很謝謝你的意見!可能是文字上表達,讓你對我的回答出現誤解!

    我要表達的是說,String不能直接被Int指派!所以加上""雙引號,

    讓Int變成String就可以指派了!

    我說的騙過編譯器只是個人的形容詞而己,不用太過於強調這個詞!

    • Commenter avatarLogin to reply the answers
  • 1 decade ago

    ==是用來比較物件之記憶體位置

    s 和 t 是String 物件,故 System.out.println(s==t); 結果為 true

    int 不是物件,故System.out.println(b==f); 會編譯錯誤

    若想要作資料交換可將程式作些微的變更如下

    public static void main(String[] args) {

    String s="1";

    String t="1";

    int b=4;

    int f=6;

    s=t;

    b=f;

    System.out.println(s);

    System.out.println(b);

    }

    • Commenter avatarLogin to reply the answers
Still have questions? Get your answers by asking now.