刚开始学习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 :(得分: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;
然后您修改 c
和d
引用的数组内容。
答案 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);