Lists.newArrayList() 是 Google Guava 库中提供的一个工具方法,用于便捷地创建一个新的 ArrayList 实例。它的主要作用是简化 ArrayList 的创建过程,尤其是在需要快速初始化集合并添加元素时非常方便。
作用说明
相比 Java 标准库的 new ArrayList<>(),Lists.newArrayList() 有以下优势:
- 可以在创建时直接传入初始元素,无需先创建集合再调用
add()方法 - 类型推断更简洁,无需显式指定泛型类型
- 提供了多种重载方法,适应不同的使用场景
源码解析
Guava 中 Lists.newArrayList() 的核心源码如下(简化版):
java
public final class Lists {
// 私有构造函数,防止实例化工具类
private Lists() {}
// 创建一个空的ArrayList
public static <E> ArrayList<E> newArrayList() {
return new ArrayList<>();
}
// 创建包含指定元素的ArrayList
@SafeVarargs
public static <E> ArrayList<E> newArrayList(E... elements) {
// 优化初始容量,避免不必要的扩容
int capacity = computeArrayListCapacity(elements.length);
ArrayList<E> list = new ArrayList<>(capacity);
Collections.addAll(list, elements);
return list;
}
// 从迭代器创建ArrayList
public static <E> ArrayList<E> newArrayList(Iterator<? extends E> elements) {
ArrayList<E> list = new ArrayList<>();
addAll(list, elements);
return list;
}
// 从可迭代对象创建ArrayList
public static <E> ArrayList<E> newArrayList(Iterable<? extends E> elements) {
// 针对已知大小的集合进行优化
if (elements instanceof Collection) {
@SuppressWarnings("unchecked")
Collection<? extends E> collection = (Collection<? extends E>) elements;
return new ArrayList<>(collection);
} else {
return newArrayList(elements.iterator());
}
}
// 计算初始容量,比传入的大小多50%并加1,最小为10
static int computeArrayListCapacity(int arraySize) {
checkNonnegative(arraySize, "arraySize");
return saturatedCast(5L + arraySize + (arraySize / 10));
}
}
源码要点说明
-
私有构造函数:确保工具类不能被实例化
-
多种重载形式:
- 无参版本:直接创建空列表
- 可变参数版本:接收多个元素并创建列表
- 迭代器版本:从迭代器创建列表
- 可迭代对象版本:从集合等可迭代对象创建列表
-
容量优化:
- 在可变参数版本中,通过
computeArrayListCapacity()计算初始容量 - 公式为
5 + 元素数量 + 元素数量/10,既避免容量过小导致频繁扩容,又不会过度浪费空间
- 在可变参数版本中,通过
-
类型安全:
- 使用
@SafeVarargs注解确保可变参数的类型安全 - 泛型方法保证集合元素类型的一致性
- 使用
使用示例:
java
// 创建空列表
List<String> emptyList = Lists.newArrayList();
// 创建包含初始元素的列表
List<Integer> numbers = Lists.newArrayList(1, 2, 3, 4);
// 从其他集合创建
List<String> copyList = Lists.newArrayList(existingCollection);
这种工具方法体现了 Guava 库的设计理念:通过提供更简洁、更安全、更高效的工具类来增强 Java 标准库的功能。