详解 Lists.newArrayList() 的作用

Lists.newArrayList() 是 Google Guava 库中提供的一个工具方法,用于便捷地创建一个新的 ArrayList 实例。它的主要作用是简化 ArrayList 的创建过程,尤其是在需要快速初始化集合并添加元素时非常方便。

作用说明

相比 Java 标准库的 new ArrayList<>()Lists.newArrayList() 有以下优势:

  1. 可以在创建时直接传入初始元素,无需先创建集合再调用 add() 方法
  2. 类型推断更简洁,无需显式指定泛型类型
  3. 提供了多种重载方法,适应不同的使用场景

源码解析

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));
    }
}

源码要点说明

  1. 私有构造函数:确保工具类不能被实例化

  2. 多种重载形式

    • 无参版本:直接创建空列表
    • 可变参数版本:接收多个元素并创建列表
    • 迭代器版本:从迭代器创建列表
    • 可迭代对象版本:从集合等可迭代对象创建列表
  3. 容量优化

    • 在可变参数版本中,通过 computeArrayListCapacity() 计算初始容量
    • 公式为 5 + 元素数量 + 元素数量/10,既避免容量过小导致频繁扩容,又不会过度浪费空间
  4. 类型安全

    • 使用 @SafeVarargs 注解确保可变参数的类型安全
    • 泛型方法保证集合元素类型的一致性

使用示例:

java 复制代码
// 创建空列表
List<String> emptyList = Lists.newArrayList();

// 创建包含初始元素的列表
List<Integer> numbers = Lists.newArrayList(1, 2, 3, 4);

// 从其他集合创建
List<String> copyList = Lists.newArrayList(existingCollection);

这种工具方法体现了 Guava 库的设计理念:通过提供更简洁、更安全、更高效的工具类来增强 Java 标准库的功能。

相关推荐
花千树-0109 分钟前
Java 接入多家大模型 API 实战对比
java·开发语言·人工智能·ai·langchain·ai编程
卓怡学长11 分钟前
m326数据结构课程网络学习平台的设计与实现+vue
java·spring·tomcat·maven·intellij-idea·mybatis
han_hanker42 分钟前
@Validated @Valid 用法
java·spring boot
小CC吃豆子44 分钟前
详细介绍一下静态分析工具 SonarQube
java
DevOpenClub1 小时前
全国三甲医院主体信息 API 接口
java·大数据·数据库
上海合宙LuatOS1 小时前
LuatOS扩展库API——【exremotecam】网络摄像头控制
开发语言·网络·物联网·lua·luatos
言慢行善1 小时前
SpringBoot中的注解介绍
java·spring boot·后端
一勺菠萝丶1 小时前
管理后台使用手册在线预览与首次登录引导弹窗实现
java·前端·数据库
feng_you_ying_li1 小时前
C++11,{}的初始化情况与左右值及其引用
开发语言·数据结构·c++
xiaotao1311 小时前
JS new 操作符完整执行过程
开发语言·前端·javascript·原型模式