Java中ArrayList的单行初始化方法

Java中ArrayList的单行初始化方法

技术背景

在Java开发中,我们经常需要初始化列表,尤其是ArrayList,用于存储和管理数据。为了提高代码的简洁性和可读性,我们希望能在一行代码内完成ArrayList的初始化。本文将介绍多种在Java中单行初始化ArrayList的方法。

实现步骤

1. 使用Arrays.asList方法

1
2
3
4
5
6
7
8
9
10
11
12
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {
public static void main(String[] args) {
// 创建一个不可变大小的List
List<String> places = Arrays.asList("Buenos Aires", "Córdoba", "La Plata");
// 若需要可变的ArrayList,可进一步转换
ArrayList<String> mutablePlaces = new ArrayList<>(places);
}
}

Arrays.asList方法会返回一个固定大小的列表,若要得到可变的ArrayList,可将其作为参数传递给ArrayList的构造函数。

2. 使用双括号初始化

1
2
3
4
5
6
7
8
9
10
11
12
import java.util.ArrayList;
import java.util.List;

public class Main {
public static void main(String[] args) {
List<String> places = new ArrayList<String>() {{
add("A");
add("B");
add("C");
}};
}
}

双括号初始化实际上创建了一个ArrayList的匿名子类,并在实例初始化块中添加元素。不过这种方法会创建额外的类,可能会带来一些性能开销。

3. 使用List.of方法(Java 9及以上)

1
2
3
4
5
6
7
8
9
10
11
import java.util.ArrayList;
import java.util.List;

public class Main {
public static void main(String[] args) {
// 创建一个不可变的List
List<String> places = List.of("Buenos Aires", "Córdoba", "La Plata");
// 若需要可变的ArrayList,可进一步转换
ArrayList<String> mutablePlaces = new ArrayList<>(places);
}
}

List.of方法会返回一个不可变的列表,若要得到可变的ArrayList,同样可将其作为参数传递给ArrayList的构造函数。

4. 使用Stream API(Java 8及以上)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {
public static void main(String[] args) {
// 创建一个List
List<String> places = Stream.of("Buenos Aires", "Córdoba", "La Plata")
.collect(Collectors.toList());
// 若需要确保是ArrayList
ArrayList<String> arrayListPlaces = Stream.of("Buenos Aires", "Córdoba", "La Plata")
.collect(Collectors.toCollection(ArrayList::new));
}
}

Stream API提供了一种灵活的方式来处理元素,通过Stream.of创建流,再使用collect方法将流转换为列表。

5. 使用Guava库

1
2
3
4
5
6
7
8
9
import com.google.common.collect.Lists;
import java.util.ArrayList;
import java.util.List;

public class Main {
public static void main(String[] args) {
ArrayList<String> places = Lists.newArrayList("Buenos Aires", "Córdoba", "La Plata");
}
}

Guava库提供了Lists.newArrayList方法,可方便地创建并初始化ArrayList

核心代码

以下是一个综合示例,展示了上述多种方法的使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import com.google.common.collect.Lists;

public class ArrayListInitialization {
public static void main(String[] args) {
// 使用Arrays.asList
List<String> list1 = Arrays.asList("A", "B", "C");
ArrayList<String> arrayList1 = new ArrayList<>(list1);

// 使用双括号初始化
List<String> list2 = new ArrayList<String>() {{
add("A");
add("B");
add("C");
}};

// 使用List.of(Java 9及以上)
List<String> list3 = List.of("A", "B", "C");
ArrayList<String> arrayList3 = new ArrayList<>(list3);

// 使用Stream API
List<String> list4 = Stream.of("A", "B", "C").collect(Collectors.toList());
ArrayList<String> arrayList4 = Stream.of("A", "B", "C")
.collect(Collectors.toCollection(ArrayList::new));

// 使用Guava库
ArrayList<String> arrayList5 = Lists.newArrayList("A", "B", "C");
}
}

最佳实践

  • 选择合适的方法:根据项目的Java版本和具体需求选择合适的初始化方法。如果是Java 9及以上版本,推荐使用List.of方法;如果需要灵活处理元素,可使用Stream API。
  • 考虑可变性:如果列表需要在后续进行修改,确保初始化的列表是可变的。如使用Arrays.asListList.of返回的列表是不可变的,需要进一步转换为ArrayList
  • 避免过度依赖外部库:虽然Guava库提供了方便的方法,但如果项目中没有引入该库,不建议为了初始化ArrayList而引入它。

常见问题

1. Arrays.asListList.of的区别

  • Arrays.asList返回的列表是固定大小的,可通过set方法修改元素,但不能添加或删除元素;List.of返回的列表是不可变的,任何修改操作都会抛出异常。
  • Arrays.asList允许传入null元素,而List.of不允许。

2. 双括号初始化的缺点

双括号初始化会创建一个匿名子类,增加了类的数量和内存开销,同时可能导致内存泄漏。因此,不建议在性能敏感的场景中使用。

3. Stream API的性能问题

使用Stream API初始化列表可能会带来一定的性能开销,尤其是在处理大量元素时。因此,在性能要求较高的场景中,应谨慎使用。


Java中ArrayList的单行初始化方法
https://119291.xyz/posts/java-arraylist-one-line-initialization/
作者
ww
发布于
2025年4月23日
许可协议