2014-09-19 80 views
2

刚开始学习Java,看到字符串和数组都是引用类型。 我不明白了以下问题:Java - 字符串和数组引用

String a = "a1"; 
    String b = "a2"; 
    a=b; 
    a = "rrr"; 

    System.out.println(a); 
    System.out.println(b); 

    int[] arr1 = {1,2,3}; 
    int[] arr2 = arr1; 
    arr2[0]= 19; 
    System.out.println(arr1[0]); 

当我打印出来,我得到:"rrr" "a2" 10

使用数组时 - 据我所知,他们都指向同一个对象,所以如果我改变细胞 - 我在arr1和arr2看到了不同。

关于“字符串” - 根据我的理解,当我这样做时:a = b它不应该是:“让a指向与b指向的相同对象” - 意思是如果我更改了它们都需要的被改变?

谢谢!

+0

这不是最有用的东西,但我想你会明白,你可以用'System.out.println(Arrays.toString(arr1));'打印一个数组。 – Pokechu22 2014-09-19 18:38:44

+1

开始区分_variables_,_reference values_和_instances_(对象)。 – 2014-09-19 18:45:50

+0

阅读[this](http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value)。 – 2014-09-19 18:47:34

回答

10

在数组情况下,您实际上正在修改数组,因此如果一个引用发生更改,另一个引用发生更改。

在字符串的情况下,你是修改对象时,只是分配不同目的是该引用。 正如您所指出的那样:a=b的意思是“让指向与b相同的对象指向”。遵循同样的思路,a="rrr"的意思是“让一个指向文字”rrr“”,这与b没有任何关系。

1

因此,重新分配修改是不同的东西。

如果你有

String a = "foo"; 
String b = a; 

那么你已经分配b指相同的对象a。 如果然后做

b = "bananas"; 

那么你有没有修改字符串,你有重新分配 B上它不再指同一对象a

在另一方面

int[] c = { 1, 2, 3 }; 
int[] d = c; 

在这里我们再次d分配给指代相同的对象(一个阵列),为c。如果你再这样做:

d[0] = 10; 

那么你修改阵列的内容,无论cd参考。

0

您有3个字符串对象和1个数组对象。
“A1”, “A2”, “RRR”
{1,2,3}的所有字符串的

String a = "a1"; // a points to a new object "a1" 
String b = "a2"; // b points to a new object "a2" 
a=b; // a points to b's object "a2" 
a = "rrr"; // a points to new object "rrr" 

System.out.println(a); // prints "rrr" to console 
System.out.println(b); // Prints "a2" to console 

int[] arr1 = {1,2,3}; // arr1 points to new array {1,2,3} 
int[] arr2 = arr1; // arr2 points to array in arr1 {1,2,3} 
arr2[0]= 19; // modifies the array arr2 points to {19, 2, 3} 
System.out.println(arr1[0]); // Prints "19" to console 
0

首先是不可变的。 Immutalbe意味着你不能改变对象本身,但你可以改变参考。 像你的情况 -

String a = "a1"; // a is a reference variable and point to new object with value "a1" 

    String b = "a2"; // b is a reference and point to new object with value "a2" 

    a=b; // now a is referencing same object as b is referencing, a and b value is "a2" 

    a = "rrr"; // at this time "rrr" is creating a new String object with value "rrr" and now a is pointing to this object. 

所以B仍指向“A2”,现在被指向新对象“RRR”。这就是为什么两种打印不同的价值。

System.out.println(a); 
    System.out.println(b);