→ gn00742754:然而,String不是也是物件嗎?可是他卻沒有這樣的問題07/13 00:12
推 coolcomm:因為Java的String是immutable07/13 01:05
如同 coolcomm 大所說 Java 的 String 是 immutable,所以不會有這個問題,
下面用圖解的方式說明差異:
========================================================
class Foo{
private String fooStr="颱風";
private int[] fooArr=int[1];
public String getString(){ return fooStr; }
public int[] getArray(){ return fooArr; }
}
public static void main(String[] args){
int[] array=new int[1];
String str="哭哭";
Foo f=new Foo();
str=f.getString();
array=g.getArray();
array[0]=1;
str="囧囧";
}
===============================================================
[ Main method line by line ]
int[] array=new int[1];
╭─────╮
array ───→ │ int[1] │
╰─────╯
------
String str="哭哭";
╭─────╮
array ───→ │ int[1] │
╰─────╯
╭────╮
str ────→│ "哭哭" │
╰────╯
-----
Foo f=new Foo();
╭───╮ ┌──── f
╭─────╮ │int[1]│←┐ ↓
array ───→ │ int[1] │ ╰───╯ │╭─────╮
╰─────╯ └┼─fooArr │
╭────╮ │ │
str ────→│ "哭哭" │ ╭───╮ ┌┼─fooStr │
╰────╯ │"颱風"│←┘╰─────╯
╰───╯
-----
str=f.getString();
╭───╮ ┌──── f
╭─────╮ │int[1]│←┐ ↓
array ───→ │ int[1] │ ╰───╯ │╭─────╮
╰─────╯ └┼─fooArr │
╭────╮ │ │
str ───┐ │ "哭哭" │ ╭───╮ ┌┼─fooStr │
│ ╰────╯ │"颱風"│←┘╰─────╯
└────────→ ╰───╯
-----
array=g.getArray();
┌────────→ ╭───╮ ┌──── f
│ ╭─────╮ │int[1]│←┐ ↓
array ──┘ │ int[1] │ ╰───╯ │╭─────╮
╰─────╯ └┼─fooArr │
╭────╮ │ │
str ───┐ │ "哭哭" │ ╭───╮ ┌┼─fooStr │
│ ╰────╯ │"颱風"│←┘╰─────╯
└────────→ ╰───╯
-----
array[0]=1;
因為 array 和 fooArr 指向同一個 object , 變動該 object 兩個變數都會受影響
(雖然說受影響好像不太恰當,反正就是兩個變數取出來的值會一樣)
-----
str="囧囧";
由於 Java String Immutable 的特性,當執行這個敘述的時候其實是這樣:
┌────────→ ╭───╮ ┌──── f
│ ╭─────╮ │int[1]│←┐ ↓
array ──┘ │ int[1] │ ╰───╯ │╭─────╮
╰─────╯ └┼─fooArr │
╭────╮ │ │
str ──┐ │ "哭哭" │ ╭───╮ ┌┼─fooStr │
│ ╰────╯ │"颱風"│←┘╰─────╯
│ ╭───╮ ╰───╯
└─→ │"囧囧"│
╰───╯
str 和 fooStr 是指向不同的 objecy
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 36.238.228.107
推 popcorny:這也太用心了吧...大推 07/13 12:11
推 pkmilk:推 07/13 13:14
推 gn00742754:推! 07/13 13:59
推 kaocoming:推推 07/13 16:11
推 a60301:超用心得啊,大推 07/15 17:18
推 cn1754:超用心啊!! 大推 07/20 01:57