簡體   English   中英

Java中的莫名其妙的數組分配行為

[英]Inexplicable Array assignment behavior in Java

所以就到這里。 我一直在為更大的項目構建軟件,現在,我對Java處理代碼的方式感到困惑。 我絕對不知道Java為什么在這里表現出它的行為方式。

似乎跳過了我的代碼的一部分,並且在沒有調用相應方法的情況下將值分配給與我期望的數組不同的數組。

現在,我已經使用IntelliJ Debugger進行了幾個小時的檢查,仔細檢查了所有內容,但是我還沒有找到導致事情按其方式發生的唯一原因。

package com.whatareyoudoing.java;
import java.util.Arrays;

/**
 * WHAT THE ACTUAL DUCK
 */
public class WTF {
    private int[] number;
    private int[] oldNumber;

    public WTF() {
        number = new int[1];
        oldNumber = new int[1];
    }

    public void putNumber(int c) {
        number[0] = c;
    }

    public void putOld() {
        if(Arrays.equals(oldNumber, number)) {
            System.out.println("Nothing to do!");
            return; //How on earth can they literally be the same?!
        }
        oldNumber = number;
    }

    public void doWTF() {
        putNumber(1); 
        putOld(); // Works.
        putNumber(2); // Expected Result: number = 2; oldNumber = 1 [NOPE] number = 2; oldNumber = 2
        putOld(); // [NOPE] Simply Skips with "Nothing to do"
        putNumber(3); // Same odd behaviour
        putOld(); // Aaaand skips again.
    }
}

第一次調用putNumber之后,再次使用putNumber會將值同時放入兩個變量( oldNumberNumber )中,而不是僅放入number[0]

我繼續盡可能地簡化我的代碼,因此本示例更為實際。 顯然,在我發現它的數組比單個元素更長的真實示例中。

我還用多維數組以及對象數組對其進行了測試。 行為沒有變化。

我現在完全感到困惑,完全不知道如何進行。 如果您可以對這個主題有所了解,請這樣做。 我很困惑。

下面的賦值語句:

    oldNumber = number;

使oldNumbernumber指向同一基礎數組。 也許您想要制作一個副本:

    System.arraycopy(number, 0, oldNumber, 0, number.length);

有關完整的詳細信息,請參見System.arraycopy文檔

這條線沒有按照您認為的去做。

oldNumber = number;

它不是將一個數組的內容復制到另一個數組。 它使引用變量oldNumber引用與number引用相同的數組對象。

oldNumber ----> [1]
number    -------^

因此,通過任一變量進行的任何更改都將寫入同一數組,並且通過引用同一數組的兩個引用都可以看到更改。

然后,稍后使用對同一數組的引用調用Arrays.equals ,因此它們是“相等的”。

您要復制以下行:

oldNumber[0] = number[0];

分配時

oldNumber = number

您不復制數組中的值。 oldNumber將指向完全相同的數組(將來任何一個變量的變化都將反映在另一個變量中)。

您可以使用

oldNumber = Arrays.copyOf(number, number.length);

在putOld函數中,您將第一個數組的引用分配給另一個。 在第一個調用oldNumber之后是一個指向數字的指針,如果您更改一個值,則另一個也會受到影響。

如果要復制值System.arraycopy()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM