一天一个Arrays小知识——Arrays.asList()

Arrays.asList() 是 Java 中的一个静态方法,它属于 java.util.Arrays 类。这个方法的主要作用是将一个数组转换成一个固定大小的列表(List),但这个列表是由原数组支持的,也就是说,列表是非同步的,并且其大小是固定的,因为列表的大小是由原数组的大小决定的,不支持通过 add()remove() 方法来改变列表的大小

使用方法

java 复制代码
import java.util.Arrays;  
import java.util.List;  
  
public class Main {  
    public static void main(String[] args) {  
        // 创建一个数组  
        Integer[] numbers = {1, 2, 3, 4, 5};  
          
        // 使用 Arrays.asList() 将数组转换为列表  
        List<Integer> list = Arrays.asList(numbers);  
          
        // 遍历列表  
        for (Integer number : list) {  
            System.out.println(number);  
        }  
          
        // 注意:下面的代码会抛出 ConcurrentModificationException,因为返回的列表大小是固定的  
        // list.add(6); // 尝试添加元素会抛出异常  
          
        // 另一个常见的错误是尝试传递基本类型数组给 Arrays.asList()  
        // int[] basicNumbers = {1, 2, 3};  
        // List<Integer> basicList = Arrays.asList(basicNumbers); // 这不会按预期工作  
        // 因为 Arrays.asList() 会将 basicNumbers 数组本身作为列表的唯一元素  
          
        // 正确的做法是使用包装类型数组  
        Integer[] boxedNumbers = {1, 2, 3};  
        List<Integer> boxedList = Arrays.asList(boxedNumbers);  
          
        // 或者使用 Stream API 转换基本类型数组  
        int[] basicArray = {1, 2, 3};  
        List<Integer> streamList = Arrays.stream(basicArray).boxed().collect(Collectors.toList());  
    }  
}

注意事项

  1. 不可变大小 :返回的列表大小固定,不支持通过 add()remove() 方法修改。
  2. 类型安全Arrays.asList() 泛型参数必须是对象类型数组(如 Integer[]),如果传入基本类型数组(如 int[]),则整个数组会被视为列表中的单个元素。
  3. 性能 :由于返回的列表是由原数组支持的,因此在性能上,访问列表元素(通过索引或迭代器)通常比访问原始数组要快,但修改列表(尽管不支持)或将其转换为新的列表(如使用 new ArrayList<>(Arrays.asList(array)))会涉及到额外的内存分配和可能的复制操作。
  4. 同步性:返回的列表不是同步的,如果需要在多线程环境下使用,请自行同步访问。

使用时机

  1. 将数组传递给需要集合参数的方法

    当你有一个数组,但需要将其传递给一个期望接收 List 或其他集合类型参数的方法时,Arrays.asList() 可以非常方便地将数组转换为一个列表。

  2. 简化集合初始化

    当你需要快速初始化一个只包含少量元素的集合时,使用 Arrays.asList() 可以比逐个添加元素到集合中更简洁。

  3. 作为循环或迭代的数据源

    在需要使用数组元素进行迭代,但又想利用集合的迭代器或增强型 for 循环(也称为 "for-each" 循环)时,Arrays.asList() 提供了便利。

  4. 与集合框架的其他部分配合使用
    Arrays.asList() 返回的列表可以与集合框架中的其他类(如 Collections 类的工具方法)一起使用,以执行如排序、搜索或过滤等操作。

  5. 作为不可变列表的源

    由于 Arrays.asList() 返回的列表是固定大小的,并且其修改操作(除了 set(),如果列表支持的话)会抛出 UnsupportedOperationException,因此它可以作为不可变列表的源,用于需要不可变集合的场景。

  6. 在泛型代码中使用

    在泛型编程中,当你需要明确指定集合中元素的类型时,Arrays.asList() 提供了类型安全的方式来从数组创建列表。

相关推荐
怡人蝶梦1 小时前
Java后端技术栈问题排查实战:Spring Boot启动慢、Redis缓存击穿与Kafka消费堆积
java·jvm·redis·kafka·springboot·prometheus
瓯雅爱分享1 小时前
MES管理系统:Java+Vue,含源码与文档,实现生产过程实时监控、调度与优化,提升制造企业效能
java·mysql·vue·软件工程·源代码管理
bubiyoushang8881 小时前
matlab雷达定位仿真
开发语言·matlab
鬼多不菜2 小时前
一篇学习CSS的笔记
java·前端·css
深色風信子2 小时前
Eclipse 插件开发 5.3 编辑器 监听输入
java·eclipse·编辑器·编辑器 监听输入·插件 监听输入
yezipi耶不耶2 小时前
Rust入门之并发编程基础(一)
开发语言·后端·rust
Blossom.1182 小时前
人工智能在智能健康监测中的创新应用与未来趋势
java·人工智能·深度学习·机器学习·语音识别
shangjg32 小时前
Kafka 如何保证不重复消费
java·分布式·后端·kafka
无处不在的海贼3 小时前
小明的Java面试奇遇之互联网保险系统架构与性能优化
java·面试·架构