リスト内の各項目を分割するこの単純な varargs メソッドがあります。
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));
}
}
配列のコピーを渡すことを期待していますが、どうやらそれ自体のローカルコピーではなく、渡した配列を何らかの形で変更しているようです:
$ 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]
そこで、この簡単なテスト プログラムを書きました。
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);
}
}
そして、それは私が期待することを行います。オブジェクト配列を渡す前に複製しますf
(したがって、異なるオブジェクト識別子):
$ javac B.java && java B
[Ljava.lang.Object;@1242719c
[Ljava.lang.Object;@4830c221
では、独自のコピーではなく呼び出し元の配列f
を変更するにはどうすればよいでしょうか。A