Java - 字符串和数组引用

时间:2014-09-19 18:35:57

标签: java arrays string

刚开始学习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指向" - 这意味着如果我改变它们,它们也需要改变吗?

谢谢!

4 个答案:

答案 0 :(得分:10)

在数组中,您实际上是在修改数组,因此如果一个引用被更改,另一个引用也会被更改。

在字符串的情况下,您修改对象,您只需为该引用指定不同的对象。 正如您所指出的那样:a=b表示“指向与b相同的对象指向”。按照同样的思路,a="rrr"的意思是“指向文字”rrr“”,这与b无关。

答案 1 :(得分: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引用的数组内容。

答案 2 :(得分: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

答案 3 :(得分:0)

首先,String是一个不可变的。 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"现在a指向新对象" rrr"。这就是为什么两者都有不同的价值。

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