Java 或 JIT 编译器在参数不变时优化 Arrays.asList 吗?
Do the Java or JIT compilers optimise Arrays.asList when the parameters are unchanged?
例如:Arrays.asList("1", "2", "3")
这会在应用程序的生命周期中每次调用时创建一个新数组(用于可变参数)和一个新的 ArrayList 吗?
returned 列表是可变的。这必须 return 每次调用都有不同的列表。
据我所知,对于带有 Varargs
java 的方法,将创建一个临时数组并将其发送给方法。所以用这个方法实现:
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
创建新的 ArrayList
和 ArrayList
的构造函数:
private final E[] a;
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
因此新 ArrayList 包含对列表对象的引用或 Varargs
发送到方法。
我认为数组和Varargs
没有区别。对于 Varargs
编译器将创建一个临时数组,并且在 运行 时间内没有太大区别。
然而,JVM 之间总是存在差异,您必须了解它,但我认为 Varargs
和普通数组之间没有差异。
例如:Arrays.asList("1", "2", "3")
这会在应用程序的生命周期中每次调用时创建一个新数组(用于可变参数)和一个新的 ArrayList 吗?
returned 列表是可变的。这必须 return 每次调用都有不同的列表。
据我所知,对于带有 Varargs
java 的方法,将创建一个临时数组并将其发送给方法。所以用这个方法实现:
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
创建新的 ArrayList
和 ArrayList
的构造函数:
private final E[] a;
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
因此新 ArrayList 包含对列表对象的引用或 Varargs
发送到方法。
我认为数组和Varargs
没有区别。对于 Varargs
编译器将创建一个临时数组,并且在 运行 时间内没有太大区别。
然而,JVM 之间总是存在差异,您必须了解它,但我认为 Varargs
和普通数组之间没有差异。