复制引用数组

时间:2016-12-25 10:31:18

标签: java arrays reference

我正在阅读有关复制引用数组的内容。

Object[] obj1 = {new Integer(11),
                   new StringBuffer("foobar"),
                   new Double(12.95)};

  Object[] obj2 =  new Object[obj1.length];
  for(int i = 0; i < obj1.length; i ++)
        obj2[i] = obj1[i];

  //this change to obj1 does NOT effect obj2.
  obj1[0] = new Integer(5);

  System.out.println(Arrays.toString(obj1));
  System.out.println(Arrays.toString(obj2));
  System.out.println();


  //this change to obj1 DOES effect obj2
  ((StringBuffer) obj1[1]).append('s');

  System.out.println(Arrays.toString(obj1));
  System.out.println(Arrays.toString(obj2));

两个数组都指向相同的元素,但是在第二种情况下改变第二个数组不是第一种情况。有人解释我为什么不在这里改变第二个数组。

3 个答案:

答案 0 :(得分:2)

obj1[0] = new Integer(5);

在这里,您将新对象的引用分配给其中一个数组的第一个索引,因此另一个数组的第一个索引始终引用不同的对象而不受影响。

((StringBuffer) obj1[1]).append('s');

在这里,您要更改obj1[1]引用的对象的状态,该对象与obj2[1]引用的对象相同。因此,两个阵列都会受到影响。

答案 1 :(得分:1)

在第一种情况下,您正在更改同一个对象(通过调用append方法)。在第二个中,您将使用不同的引用替换引用。原始数组仍然指向原始引用,因此保持不变。

答案 2 :(得分:1)

这里

obj1[0] = new Integer(5); 

你改变了obj1的第一个元素所引用的对象 更改引用引用的对象不会将更改应用于引用此对象的其他引用。 所以,现在两个数组的第一个元素不再引用同一个对象。

这里:

((StringBuffer) obj1[1]).append('s');

两个数组的第一个元素始终引用相同的对象。 您已更改引用的对象的内容。因此,关于此对象的所有引用都会看到更改。