有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java复制引用数组

我在读关于复制引用数组的书

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));

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


共 (2) 个答案

  1. # 1 楼答案

    obj1[0] = new Integer(5);
    

    在这里,您将一个对新对象的引用分配给其中一个数组的第一个索引,因此另一个数组的第一个索引将继续引用另一个对象,并且不受影响

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

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

  2. # 2 楼答案

    这里

    obj1[0] = new Integer(5); 
    

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

    这里:

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

    两个数组的第一个元素总是引用同一个对象。 您已更改所引用对象的内容。所以这个对象上的所有引用都看到了变化