对于1-和多维数组,array.clone()的输出不同

时间:2014-11-16 19:26:03

标签: java arrays

案例1,一维:

double[]vals = new double[4];
vals[0] = 1;
vals[1] = 123;
vals[2] = -1;
vals[3] = 2;

double[] vals4 = vals.clone();

double newval = 55;
vals[0] += newval;

for (int k=0;k<vals.length;k++){
  System.out.println("k= " + vals[k]);
  System.out.println("k= " + vals4[k]);               
}

输出

k= 56.0
k= 1.0
k= 123.0
k= 123.0
k= -1.0
k= -1.0
k= 2.0
k= 2.0

案例2,二维:

double[][] vals3 = new double[][]{
                     {1,2},
                     {3,4}
                   };

double[][] vals2 = vals3.clone();
vals3[0][0] += 112;

for (int i=0;i<vals3.length;i++){
  for (int j=0;j<vals3[0].length;j++){
    System.out.println(vals2[i][j]);
    System.out.println(vals3[i][j]);
  }          
}  

输出

113.0
113.0
2.0
2.0
3.0
3.0
4.0
4.0

我使用相同的函数array.clone(),但为什么数组元素在2-dim情况下改变,当我更改数组的输入时,但不是在1-dim情况下?

2 个答案:

答案 0 :(得分:4)

Java只有单维数组。 double[][]是对double[]的引用数组,因此当您克隆引用数组时,您将获得另一个对相同底层数组的引用数组。

要进行深度克隆,您可以创建一个相同大小的新double [] []并克隆单个double [] s

e.g。

 public static double[][] deepClone(double[][] d) {
     double[][] ret = new double[d.length][];
     for(int i = 0; i < ret.length; i++)
         ret[i] = d[i].clone();
     return ret;
 }

答案 1 :(得分:1)

是的,因为array.clone()复制了引用,换句话说,数组克隆就是&#34;浅&#34;副本。