详解 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 标准库的功能。

相关推荐
小羊没烦恼!37 分钟前
T-SQL查询进阶--理解SQL SERVER中的分区表
服务器·开发语言·前端·javascript·html
小蒜学长41 分钟前
微信小程序-高校自习室管理系统(代码+数据库+LW)
java·spring boot·后端·微信小程序·自习室管理
鸥梨菌Honevid1 小时前
UVM 中 REQ 和 RSP 类型详解:从通信模型到 item_done 与 put_response
java·前端·servlet
爱吃香菜的初学者1 小时前
十六.Linux——多线程(2)
linux·运维·开发语言
瑞克-桑切斯1 小时前
真实企业场景 运维安全与管理
java·网络·github
jeo陽1 小时前
04-循环实战:素数、最大公约数、级数求和与枚举法
c语言·开发语言·数据结构
老板一杯拿铁1 小时前
Java 八股文面试详解:从基础到进阶的全面梳理
java·面试
const_qiu1 小时前
第 2.5 章 2.5.4-2.5.5:JWT 双 Token 与声明式权限守卫
java·人工智能
暖核1 小时前
kubeadm 集群运维:Worker 节点下线删除、整套集群销毁重建指南
运维·开发语言·php
bug菌1 小时前
一个周末就想把短链服务推到 10 万 QPS,真能靠加 Redis 做到吗?
java·redis·go