Java 初始化 List 的几种方法

本文介绍了Java中初始化List的几种常见方法,包括使用ArrayList、Guava的Lists.newArrayList、Arrays.asList以及List.of。强调了使用Arrays.asList和List.of创建的List是不可变的,会在尝试修改时抛出UnsupportedOperationException。并提供了将不可变List转换为可变List的解决方案,即通过newArrayList进行包装。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最常见的初始化 List 方法为:

List<String> languages = new ArrayList<>();
languages.add("Java");
languages.add("PHP");
languages.add("Python");
System.out.println(languages);

但是实际上,我们并不会直接使用 new ArrayList 来初始化 List。

你可以使用 Guava 的 newArrayList 来直接初始化。

List<String> languages = Lists.newArrayList();

上面 2 种方法初始化的 List 是可变的,因此你可以对初始化成功的 List 进行添加和删除。

Arrays

使用这个方法初始化的 List 是不可变的。

考虑使用下面的代码来初始化一个 List。

List<Integer> list1 = Arrays.asList(1,2);

Arrays 是 JDK 的一个类,你可以使用这个类来初始化一个 List。

考察下面的代码:

        List<Integer> list1 = Arrays.asList(1,2);
        list1.add(3);

将会给你一个:java.lang.UnsupportedOperationException 异常。

这是一个运行时错误,不是编译错误。

因此你在编译的时候是不会提示的。

List

使用这个方法初始化的 List 是不可变的。

考虑使用下面的代码来初始化一个 List。

List<Integer> list = List.of(1,2);

List 是 JDK 的一个类,你可以使用这个类来初始化一个 List。

考察下面的代码:

        List<Integer> list1 = List.of(1,2);
        list1.add(3);

将会给你一个:java.lang.UnsupportedOperationException 异常。

将不可变 List 变成可变

如果 List 是不可变的。

我们可以使用 new ArrayList<> 来包装下就可以了

考察下面的代码:

        List<Integer>list2 = new ArrayList<>(Arrays.asList(1,2));
        list2.add(3);

如果使用上面的代码的话,你创建的 List 就可以是可变的了,可以对创建的 List 进行修改和删除。

Java 初始化 List 的几种方法 - Java - OSSEZicon-default.png?t=M276https://www.ossez.com/t/java-list/13915

 

### Java初始化List集合的方式 #### 使用数组转换成列表 一种方法是通过创建一个数组并将其传递给`Arrays.asList()`方法来快速构建固定大小的列表。此操作返回由指定数组支持的固定大小列表实例。 ```java import java.util.Arrays; import java.util.List; public class Example { public static void main(String[] args) { String[] animals = {"dog", "cat"}; List<String> animalList = Arrays.asList(animals); System.out.println(animalList); // 输出: [dog, cat] } } ``` 这种方法适用于已知元素数量的情况,但是需要注意的是,修改底层数组会影响到列表的内容,反之亦然[^1]。 #### 利用匿名内部类语法糖 对于较新的Java版本(特别是自Java 9起),可以直接利用钻石运算符结合匿名内部类的方式来简化代码: ```java import java.util.ArrayList; import java.util.List; public class Example { public static void main(String[] args) { List<String> list = new ArrayList<>() {{ add("apple"); add("banana"); }}; System.out.println(list); // 输出: [apple, banana] } } ``` 不过这种方式实际上是在运行时动态地向新创建的对象里添加成员,因此效率上可能不如其他几种方案高效[^4]。 #### 借助于`Collections.singletonList()` 当只需要表示只含有单一元素的不可变列表时,可以采用`Collections.singletonList(T o)`函数。这会生成一个仅含参数所指明的那个唯一项的新列表对象。 ```java import java.util.Collections; import java.util.List; public class Example { public static void main(String[] args) { List<String> singleItemList = Collections.singletonList("onlyOneElement"); System.out.println(singleItemList); // 输出: [onlyOneElement] } } ``` 该实现特别适合那些确实只需表达单个实体的情形下使用;然而由于其不可变特性,在实际应用中的灵活性受到一定限制[^2]。 #### 结合`nCopies`与`ArrayList`构造器 为了获得既定重复次数相同值组成的可扩展列表,则可以通过先调用`Collections.nCopies(int n,T o)`获取相应模式序列后再传入到`ArrayList`构造器之中完成最终赋值过程。 ```java import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Example { public static void main(String[] args) { List<String> repeatableList = new ArrayList<>(Collections.nCopies(3,"sameValue")); repeatableList.add("differentValue"); System.out.println(repeatableList); // 输出: [sameValue, sameValue, sameValue, differentValue] } } ``` 上述做法巧妙融合了两者优势——既能保持初始状态下各位置上的数据一致性又允许后续追加更多不同类型的条目加入其中[^3]。 #### 应用Stream API (Java 8及以上) 最后值得一提的是自从引入流式处理机制之后还可以借助它来进行更加简洁优雅的操作形式如下所示: ```java import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; public class Example { public static void main(String[] args) { List<Integer> numberList = Stream.of(1, 2, 3).collect(Collectors.toList()); System.out.println(numberList); // 输出: [1, 2, 3] } } ``` 这里运用到了`Stream.of()`配合收集器(`Collectors`)从而实现了从一系列离散数值直接映射至目标容器内的效果.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HoneyMoose

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值