参数不变时,Java或JIT编译器是否优化Arrays.asList?

时间:2018-10-25 13:20:23

标签: java jit

例如:Arrays.asList("1", "2", "3")

这是否会在应用程序的生命周期中每次调用它时创建一个新数组(用于varargs)和一个新的ArrayList?

2 个答案:

答案 0 :(得分:1)

返回的列表是可变的。每个调用都必须返回一个不同的列表。

答案 1 :(得分:0)

据我所知,

对于带有Varargs的方法,java将创建一个临时数组并将其发送给方法。因此,使用此方法实现:

public static <T> List<T> asList(T... a) {
    return new ArrayList<>(a);
}

这将创建新的ArrayListArrayList的构造方法:

private final E[] a;

ArrayList(E[] array) {
    a = Objects.requireNonNull(array);
}

因此,新的ArrayList包含对发送到方法的list或Varargs对象的引用。
我认为数组和Varargs之间没有区别。 Varargs的编译器将创建一个临时数组,并且在运行时没有任何区别。
但是在JVM之间总是存在必须阅读的区别,但是我不认为Varargs与普通数组之间存在区别。