我试图在我的程序中实现加密,但在方法上遇到了一些困难。我有一个未加密的数组,它应该保持未加密,另一个数组我想加密。然而,当我调用这个方法时,它会加密两个数组。
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
提前感谢您的帮助!
您混淆了内存中的实际对象(位于堆上)和对它的引用(位于堆栈中)
STACK HEAP
arr <---- actual array
arrEncrypted <---- actual array (the same)
如果要创建数组的副本,需要使用方法array。copyOf()
或数组。copyOfRange()
。
三件事:
>
不能"传递变量",只能传递变量的值。
变量“arr”不是数组,它有一个引用数组的值。
因此,变量“data”获取“arr”值的副本,该值是对同一数组的引用。
您应该为输出分配一个新数组,比如
String[] outData = new String[data.length];
当您调用加密(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中典型的初学者练习,如下所示: 现在,您只需要编写一个方面即可拦截所有方法执行(以及可选的构造函数执行,如下所示): 运行时,此方面将打印