Java Arrays.asList() 详解及示例

Java技术 潘老师 7个月前 (09-20) 174 ℃ (0) 扫码查看

Arrays.asList() 是 Java 中的一个静态方法,用于将数组或多个参数转换为 List 集合,它在数组与集合之间起到了桥梁的作用,方便我们利用集合的各种方法和特性。在下文中,我们将深入探讨 Arrays.asList() 的语法、使用场景、注意事项、避免踩坑以及总结。

1、语法

Arrays.asList() 的语法格式如下:

public static <T> List<T> asList(T... a)

该方法接受一个泛型参数 T,用于表示数组或参数的类型。需要注意的是,T 必须是引用类型,不能是基本类型,例如 int、double、char 等。如果传入基本类型的数组,Arrays.asList() 方法会将其视为一个 Object 类型的元素,而不是将其每个元素视为 Object 类型。因此,结果返回的 List 只包含一个元素,即原始数组本身。

返回的 List 是 Arrays 类的内部类,它保留对原始数组的引用。这意味着对 List 的修改会反映到数组上,反之亦然。然而,需要注意的是,这个 List 的大小是固定的,不支持增加或删除操作,否则会引发 UnsupportedOperationException 异常。

此外,返回的 List 是可序列化的,并且实现了 RandomAccess 接口,这表示它支持随机访问操作。

2、应用场景

Arrays.asList() 可以用在以下几种场景中:

当我们需要创建一个不需要改变大小或内容的 List 集合时,可以使用 Arrays.asList() 来快速初始化一些元素。例如:

// 使用 Arrays.asList() 创建一个不可变的 List
List list = Arrays.asList("a", "b", "c");
System.out.println(list); // [a, b, c]

当我们需要创建一个空的或只包含一个元素的 List 集合时,可以使用 Arrays.asList() 来简化代码。例如:

// 使用 Arrays.asList() 创建一个不可变的空 List
List emptyList = Arrays.asList();
System.out.println(emptyList); // []

// 使用 Arrays.asList() 创建一个不可变的单元素 List
List singletonList = Arrays.asList("a");
System.out.println(singletonList); // [a]

当我们需要从一个数组或其他集合类创建一个不可变的 List 集合时,可以使用 Arrays.asList() 来方便地进行转换。例如:

// 使用 Arrays.asList() 从数组创建一个不可变的 List
String[] array = {"a", "b", "c"};
List listFromArray = Arrays.asList(array);
System.out.println(listFromArray); // [a, b, c]

// 使用 Arrays.asList() 从其他集合类创建一个不可变的 List
Set set = new HashSet();
set.add("a");
set.add("b");
set.add("c");
List listFromSet = Arrays.asList(set.toArray(new String[0]));
System.out.println(listFromSet); // [a, b, c]

当我们需要利用一些集合类的方法或特性时,可以使用 Arrays.asList() 将数组转换为集合。例如:

// 使用 Arrays.asList() 把数组转换成集合,并使用 Collections 类的方法
String[] array = {"a", "b", "c"};
List list = Arrays.asList(array);
Collections.sort(list); // 对集合进行排序
System.out.println(list); // [a, b, c]
Collections.reverse(list); // 对集合进行反转
System.out.println(list); // [c, b, a]
Collections.shuffle(list); // 对集合进行随机打乱
System.out.println(list); // [b, a, c] 或者其他随机顺序

// 使用 Arrays.asList() 把数组转换成集合,并使用 Stream API
String[] array = {"a", "b", "c"};
List list = Arrays.asList(array);
list.stream().forEach(System.out::println); // 对集合进行遍历并打印每个元素
list.stream().map(String::toUpperCase).forEach(System.out::println); // 对集合进行映射并打印每个元素的大写形式
list.stream().filter(s -> s.startsWith("a")).forEach(System.out::println); // 对集合进行过滤并打印以 a 开头的元素

3、避坑指南

Arrays.asList() 不支持基本数据类型的数组:Arrays.asList() 只能接受 Object 类型的参数或数组。基本数据类型(如 int、double、char 等)不是 Object 的子类,因此无法直接作为 Arrays.asList() 的参数。如果传入一个基本数据类型的数组,Arrays.asList() 会将整个数组视为一个 Object 类型的元素,而不是将数组的每个元素视为单独的 Object 类型元素。这将导致返回的 List 只包含一个元素,即原始数组本身。

如果需要将基本数据类型的数组转换为 List,可以采取以下方法:

  • 使用循环遍历数组,并将每个元素添加到 List 中。这会利用自动装箱(autoboxing)功能,将基本数据类型转换为对应的包装类(如 Integer、Double、Character 等)。
  • 使用 Java 8 中的 Stream API,可以使用一行代码将数组转换为 List。可以使用 Arrays.stream() 或 IntStream.of() 等方法,然后调用 boxed() 和 collect() 方法。
  • 借助第三方库,如 Guava 或 Apache Commons Lang,它们提供了处理基本数据类型数组和集合的工具类和方法。

示例代码如下:

// 使用循环遍历数组,并把每个元素添加到 List 中
int[] array = {1, 2, 3};
List list = new ArrayList();
for (int num : array) {
    list.add(num); // 利用自动装箱
}
System.out.println(list); // [1, 2, 3]

// 使用 Stream API 实现数组到 List 的转换
int[] array = {1, 2, 3};
List list = Arrays.stream(array).boxed().collect(Collectors.toList());
System.out.println(list); // [1, 2, 3]

// 使用 Guava 实现数组到 List 的转换
int[] array = {1, 2, 3};
List list = Ints.asList(array);
System.out.println(list); // [1, 2, 3]

Arrays.asList() 返回的 List 是不可变的,无法进行增加或删除操作,否则会引发 UnsupportedOperationException 异常。这是因为 Arrays.asList() 返回的 List 实际上是一个由 Arrays 类的内部类创建的,它没有实现 add() 和 remove() 等修改集合内容的方法。

如果需要创建一个可变的 List 集合,可以考虑以下方法之一:

使用 ArrayList 的构造函数

一种方法是使用 ArrayList 的构造函数,将 Arrays.asList() 的结果作为参数传递,这将创建一个新的 ArrayList 对象,并将原始数组中的元素复制到新的 ArrayList 中,从而可以在新的 ArrayList 上执行添加和删除操作,而不会影响原始数组。

例如:

// 使用 ArrayList 的构造器创建一个可变的 List
String[] array = {"a", "b", "c"};
List list = new ArrayList(Arrays.asList(array));
System.out.println(list); // [a, b, c]
list.add("d"); // 可以增加元素
System.out.println(list); // [a, b, c, d]

使用 Java 8 中的 Stream API

使用 Java 8 中的 Stream API,可以使用一行代码将数组转换为 List。可以使用 Arrays.stream()IntStream.of() 等方法,然后调用 collect() 方法。例如:

// 使用 Stream API 实现数组到 List 的转换
int[] array = {1, 2, 3};
List list = Arrays.stream(array).boxed().collect(Collectors.toList());
System.out.println(list); // [1, 2, 3]
list.add(4); // 可以增加元素
System.out.println(list); // [1, 2, 3, 4]

4、总结

Java Arrays.asList() 是一个简单而有用的方法,但也需要注意其中的限制和注意事项。根据具体的需求和场景选择合适的方法非常重要。感谢您的阅读,希望这篇文章对你有所帮助。如有任何进一步的问题或需要更多信息,随时都可以提出。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/java/9143.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】