tôi có phương pháp này varargs đơn giản mà chia từng hạng mục trong danh sách:Phương pháp Varargs thay đổi mảng của người gọi thay vì bản sao của riêng nó?
import java.util.*;
class A {
static long f(long... xs) {
Arrays.sort(xs);
long y = 100000000;
for (int i = xs.length - 1; i >= 0; i--)
y /= xs[i];
return y;
}
static {
System.out.println(f(5,2,6,3,9,3,13,4,5));
long[] xs = new long[]{5,2,6,3,9,3,13,4,5};
System.out.println(Arrays.toString(xs));
System.out.println(f(xs));
System.out.println(Arrays.toString(xs));
}
}
tôi mong đợi nó để vượt qua một bản sao của mảng, nhưng dường như nó bằng cách nào đó sửa đổi các mảng tôi vượt qua trong, thay vì nó bản sao cục bộ riêng:
$ javac A.java && java A
79
[5, 2, 6, 3, 9, 3, 13, 4, 5]
79
[2, 3, 3, 4, 5, 5, 6, 9, 13]
Vì vậy, tôi đã viết chương trình này kiểm tra đơn giản:
class B {
static void f(Object... os) {
System.out.println(os);
}
static {
Object os = new Object[]{1,2,3};
System.out.println(os);
f(os);
}
}
Và nó làm những gì tôi mong đợi, nó bắt chước các BEF mảng đối tượng quặng đi qua nó vào f
(do đó định danh đối tượng khác nhau):
$ javac B.java && java B
[Ljava.lang.Object;@1242719c
[Ljava.lang.Object;@4830c221
Vậy làm thế nào sau đó là f
trong A
sửa đổi mảng của người gọi thay vì sao chép riêng của mình?
Bản sao Java tham chiếu theo giá trị. Nó không bao giờ sao chép hoặc nhân bản các đối tượng cũng như mảng làm đối số (hoặc bất kỳ tình huống nào khác) trừ khi bạn làm điều đó một cách rõ ràng. –