方法意外地更改了我的数组的值

时间:2014-04-24 14:03:47

标签: java arrays

计算百分比的方法(来自我不想改变的数组,但它是):

private float values[] = { AGREE, DISAGREE };

private float[] calculateData(float[] data) {
    // TODO Auto-generated method stub
    float total = 0;
    for (int i = 0; i < data.length; i++) {
        total += data[i];
    }
    // 180 is the amount of degrees of the circle - setting it up to half
    // circle 360 means full circle
    for (int i = 0; i < data.length; i++) {
        data[i] = 180 * (data[i] / total);
    }

调用方法:

float[] degrees = calculateData(values);

如果我在调用此方法之前记录数组的值,我得到1.0,1.0但是在调用方法之后我得到90.0,90.0为什么?如果我不改变values[]

我知道它在这个方法中正在发生,因为当我删除它时,我得到1.0,1.0(我实际想要得到的)

编辑:

感谢您的答案,所以如果我理解正确的话:如果方法的参数被更改,那么当调用方法时,设置为参数的对象也会被更改。

4 个答案:

答案 0 :(得分:1)

您正在修改第二个阵列

答案 1 :(得分:1)

数组变量只是引用。如果您将values作为data传递,则data指向与<{1}}相同的相同数组。请考虑以下示例:

values

如果您不想这样,则需要制作副本

答案 2 :(得分:1)

您正在此处修改数组:data[i] = 180 * (data[i] / total);

您在函数的参数中获取数组的地址,而不是它的副本,因此如果您在函数中修改它,它将修改您在calculateData函数上挂起时传递的数组。 / p>

答案 3 :(得分:1)

您需要在方法中使用新的数组,例如下面的代码中的newData,您需要从return方法中获取该数组:

private float[] calculateData(float[] data) {

    float[] newData;

    float total = 0;
    for (int i = 0; i < data.length; i++) {
        total += data[i];
    }
    for (int i = 0; i < data.length; i++) {
        newData[i] = 180 * (data[i] / total);
    }

    return newData;
}