Java Array Equality与Array Content Equality

rsh*_*haq 0 java arrays double pass-by-reference pass-by-value

我不确定如果我一直没有看到这个编程语言的重要部分我是否错了.

简而言之,我的代码包含一个名为"buckets"的双精度数组.我的代码需要逐个索引地解析这个数组,检查它的值,并在一个名为"finalVals"的新数组中存储最后5个值.存储桶数组将包含大约100个值,其中大多数为零且不需要.5个连续零的序列将意味着我需要的数据的结束.所以我需要在桶中返回最后5个值,其中值都是非零值.它存储在名为"nonZeros"的数组中.

lastVal = new double[5]; // A global variable already declared but not set
double nonZeros[] = new double[5]; // A local variable
int numberOfZeros = 0;
for (int i = 0; i < buckets.length; i++) {
    double val = buckets[i];
    if (val == 0) {
        System.out.println("Encountered a zero.");
        numberOfZeros++;
        lastVal[0] = lastVal[1];
        lastVal[1] = lastVal[2];
        lastVal[2] = lastVal[3];
        lastVal[3] = lastVal[4];
        lastVal[4] = val;
    }
    else if (val != 0) {
        System.out.println("Did not encounter a zero.");
        numberOfZeros = 0;
        lastVal[0] = lastVal[1];
        lastVal[1] = lastVal[2];
        lastVal[2] = lastVal[3];
        lastVal[3] = lastVal[4];
        lastVal[4] = val;
        nonZeros = lastVal; // This is where the problem was
    }
    prettyPrintArrays(lastVal,nonZeros);
    if (numberOfZeros == 5) { break; }
}
return nonZeros;
Run Code Online (Sandbox Code Playgroud)

问题出在最后一组.if条件确实正确地检测val是否为0(或实际为0.0).并保持lastVal中的最后5个值有效.但是,当执行该非工作行时,代码的行为就好像nonZeros成为一个简单指向lastVal的指针.即使在val中遇到零,nonZeros数组总是从那里存储与lastVal相同的值.我的理解是这些变量是独立的.因此,当我们遇到非零时,我期待nonZeros只保留与lastVal相同的值.并且函数总是在遇到5个连续的零之前返回桶的最后5个值.

解决方案是使用代码来替换那个有问题的行,该代码单独设置nonZeros的内容,就像我为lastVal所做的那样.所以我在这里的代码中遗漏了一些明显的东西,总是将lastZeros设置为lastVal?或者我误解了nonZeros = lastVal; 实际上呢?

Ell*_*sch 5

当你这样做的时候

nonZeros = lastVal;
Run Code Online (Sandbox Code Playgroud)

您将lastVal的引用分配给nonZeros(是的,nonZeros成为一个简单指向lastVal的指针).那不是副本.你可以使用System.arraycopy((Object src, int srcPos, Object dest, int destPos, int length)喜欢

System.arraycopy(lastVal, 0, nonZeros, 0, nonZeros.length);
Run Code Online (Sandbox Code Playgroud)

  • @rshaw Java总是*按值传递.但是Object类型(包括数组)的值是一个引用.它会将`nonZeros`的引用更改为`lastVal`的引用. (2认同)