我需要在 Java 方法中传递一个字节 [],在方法内部我需要“更改”字节 [],但我不想更改本地字节 [],我想更改传递的字节 [ ] 到方法,例如指针。
byte[] arr = new byte[10];
doSomethingWithByteArr(arr);
// And now, arr would have changed...
我需要在 Java 方法中传递一个字节 [],在方法内部我需要“更改”字节 [],但我不想更改本地字节 [],我想更改传递的字节 [ ] 到方法,例如指针。
byte[] arr = new byte[10];
doSomethingWithByteArr(arr);
// And now, arr would have changed...
Java 在将非原始参数传递给方法时是按引用值传递,在传递原始参数时是按值传递,这意味着如果您有一个字节数组并将其传递给修改方法,则该对象将是修改的。
例子:
public static void main(String[] args) {
byte[] arr = new byte[10];
for (int i = 0; i < arr.length; i++) {
arr[i] = i;
}
// arr now contains { 0, 1, 2, 3, ... 9 }
System.out.println(Arrays.toString(arr));
randomize(arr);
// arr now contains (ex.) { 6, 3, 7, 1, 9, 3, 2, 6, 3, 0 }
System.out.println(Arrays.toString(arr));
}
public void randomize(byte[] arr) {
Random random = new Random();
for (int i = 0; i < arr.length; i++) {
arr[i] = random.nextInt(10);
}
}
在 Java 中,只有原始类型在传递给函数时才会被复制。该伪代码应该可以按您的预期工作。
尽管在 Java 中所有内容都是通过副本传递的,但非原始类型实际上是引用,这就是为什么您的 byte[] 在函数内部和外部引用相同实例的原因。
不知道我是否理解你的困境。
Java 每次都按值传递其参数。这意味着如果它是一个原始的,它传递它的值,如果它是一个对象或数组,它传递它所引用的对象的值。
所以如果你传递一个数组,你可以修改它,因为它是一个别名,它将反映在方法之外的数组上。但是您将无法将 arr 变量指向方法代码中的新引用,如果您想更改它,您可以返回一个新的 byte[] 并分配给它。
据我所知,Java 不支持通过引用传递参数。