当前位置: 首页 > 知识库问答 >
问题:

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

柴星津
2023-03-14

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

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;
    }
}

我无法发现问题,因为在我的理解中,我返回加密数据并将其分配给另一个数组,但由于某种原因,我传递的数组也发生了变化。

这是输出

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

提前感谢您的帮助!

共有3个答案

边银龙
2023-03-14

您混淆了内存中的实际对象(位于堆上)和对它的引用(位于堆栈中)

STACK                   HEAP

arr           <----  actual array
arrEncrypted  <----  actual array (the same)

如果要创建数组的副本,需要使用方法array。copyOf()数组。copyOfRange()

苏华荣
2023-03-14

三件事:

>

  • 不能"传递变量",只能传递变量的值。

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

    因此,变量“data”获取“arr”值的副本,该值是对同一数组的引用。

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

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

  • 丰景同
    2023-03-14

    当您调用加密(arr)时,您正在传递该对象的引用值,这意味着您将直接对其进行变异。如果您没有返回数据,并将加密声明为无效返回,您的输入数组仍将是“加密的”

    如果您想只返回一个新数组而不修改输入,您可以初始化一个新的空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;
        }
    
    

    请看Java是“按引用传递”还是“按值传递”?当你传递数据参数时,详细解释引擎盖下发生了什么。

     类似资料:
    • 问题内容: 当我看到以下代码无法按预期工作时,我有些困惑。 我认为Java总是通过引用将变量传递给函数。因此,为什么函数不能重新分配变量? 该程序输出。 问题答案: 对对象的引用是通过Java中的 值 传递的,因此在方法内部分配给局部变量不会更改原始变量。仅局部变量指向新字符串。稍微了解一下ASCII艺术可能会更容易理解。 最初,您有: 首次输入方法setNotNull时,您 将在中 获得null

    • 问题内容: 如何将整个数组传递给方法? 如何正确执行此操作? 问题答案: 你做这个: 只需将其作为其他任何变量传递即可。 在Java中,数组是通过引用传递的。

    • 问题内容: 我有类似下面的代码: 但是,该变量未在ActionListener类的范围内定义。如何传递变量? 问题答案: 除了Hovercraft的答案外,您还应注意,您不会被迫对侦听器使用匿名类。气垫船的答案代码类似于以下代码:

    • 我有这样的代码。 @RequestMapping(Value=“/Persons”,Method=RequestMethod.Post)public@ResponseBody String addUser(@RequestParam String name){ 谢谢...

    • 问题内容: 是否可以使用反射API将参数传递给Java中的方法? 是否可以使用诸如AspectJ之类的AOP库来实现这一目标? 我在Android上运行。 。 问题答案: 是否可以使用诸如AspectJ之类的AOP库来实现这一目标? 当然可以。这是AspectJ中典型的初学者练习,如下所示: 现在,您只需要编写一个方面即可拦截所有方法执行(以及可选的构造函数执行,如下所示): 运行时,此方面将打印