Java 方法更改传递给它的变量

Java method changes the variable which was passed to it

我试图在我的程序中实现加密,但 运行 遇到了一些方法上的困难。我有一个未加密的数组,它应该保持未加密状态,另一个数组我想加密。但是,当我调用该方法时,它会加密两个数组。

import java.util.Base64;

public class test {
    public static void main(String[] args) {
        String[] arr = {"1", "2"};
        String[] arrEncrypted = encryption(arr);
        System.out.println(arr[0]);
        System.out.println(arrEncrypted[0]);
    }
    public static String[] encryption(String[]  data) {
        for (int i = 0; i < data.length; i++) { // get each element of data
            String encodedString = Base64.getEncoder().encodeToString(data[i].getBytes()); // encryption
            data[i] = encodedString; // reassign
        }
        return data;
    }
}

我找不到问题,因为据我所知,我 return 加密数据并将其分配给另一个数组,但由于某种原因,我传递的数组也发生了变化。

这是输出

MQ== //has to be 1
MQ== //correct

在此先感谢您的帮助!

三件事:

  1. 不能“传变量”,只能传变量的值

  2. 变量“arr”不是数组,它有一个引用数组的值。

  3. 因此变量“data”得到了“arr”值的副本,它是对同一个数组.[=11的引用=]

您应该为输出分配一个新数组,例如

String[] outData = new String[data.length];

当您调用 encryption(arr) 时,您正在传递该对象的 reference 的值,这意味着您最终会直接改变它。如果您没有 return data 并将 encryption 声明为 void return,您的输入数组仍将是“加密的”。

如果您只想 return 一个新数组而不修改输入,您可以初始化一个与输入长度相同的新空 String[],并为其分配元素在你的 for 循环中。

例如,

    public static String[] encryption(String[]  data) {
        String[] encrypted = new String[data.length];
        for (int i = 0; i < data.length; i++) { // get each element of data
            String encodedString = Base64.getEncoder().encodeToString(data[i].getBytes()); // encryption
            encrypted[i] = encodedString; // reassign
        }
        return encrypted;
    }

请参阅 Is Java "pass-by-reference" or "pass-by-value"? 以了解当您传递 data 参数时幕后发生的事情的详尽解释。