0

我需要在 Java 方法中传递一个字节 [],在方法内部我需要“更改”字节 [],但我不想更改本地字节 [],我想更改传递的字节 [ ] 到方法,例如指针。

byte[] arr = new byte[10];
doSomethingWithByteArr(arr);
// And now, arr would have changed...
4

3 回答 3

1

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);
    }
}
于 2012-06-13T23:13:32.353 回答
0

在 Java 中,只有原始类型在传递给函数时才会被复制。该伪代码应该可以按您的预期工作。

尽管在 Java 中所有内容都是通过副本传递的,但非原始类型实际上是引用,这就是为什么您的 byte[] 在函数内部和外部引用相同实例的原因。

于 2012-06-13T23:13:36.407 回答
0

不知道我是否理解你的困境。

Java 每次都按值传递其参数。这意味着如果它是一个原始的,它传递它的值,如果它是一个对象或数组,它传递它所引用的对象的值。

所以如果你传递一个数组,你可以修改它,因为它是一个别名,它将反映在方法之外的数组上。但是您将无法将 arr 变量指向方法代码中的新引用,如果您想更改它,您可以返回一个新的 byte[] 并分配给它。

据我所知,Java 不支持通过引用传递参数。

于 2012-06-13T23:13:59.087 回答