java Arrays.asList 返回什么与普通 ArrayList 区别介绍

 更新时间:2026年01月12日 09:28:46   作者:看透也说透kevin  
Arrays.asList()返回一个固定大小的List视图,而不是java.util.ArrayList,它不支持add和remove操作,但支持set操作,本文介绍java Arrays.asList返回什么与普通 ArrayList区别,感兴趣的朋友跟随小编一起看看吧

核心结论

  • 它返回什么? Arrays.asList() 返回一个由指定数组支持的、固定大小的 List 视图。
  • 有区别吗? 有巨大区别。它返回的不是我们常用的 java.util.ArrayList,而是一个内部自定义的、行为受限的类。

详细区别与解释

我们可以通过一个表格和代码示例来清晰地对比:

特性Arrays.asList(...) 返回的列表new ArrayList<>()
所属类一个私有的、内部的 Arrays$ArrayListjava.util.ArrayList
数据结构基于原始数组的一个“视图”(View)基于可动态扩容的数组
大小是否可变固定大小(Fixed-size)可变大小(Resizable)
支持添加元素。调用 add() 会抛出 UnsupportedOperationException
支持删除元素。调用 remove() 会抛出 UnsupportedOperationException
支持修改元素set(index, element) 方法可用
与原数组的关系共享底层数据。修改列表元素等于修改原数组完全独立。创建时拷贝元素,与原数组无关

代码示例

import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
public class Main {
    public static void main(String[] args) {
        // 1. 创建一个原始数组
        String[] originalArray = {"A", "B", "C"};
        // 2. 使用 Arrays.asList 得到一个 List
        List<String> asList = Arrays.asList(originalArray);
        System.out.println("asList: " + asList); // 输出: [A, B, C]
        // 3. 创建一个普通的 ArrayList
        List<String> realArrayList = new ArrayList<>(Arrays.asList(originalArray));
        System.out.println("realArrayList: " + realArrayList); // 输出: [A, B, C]
        // --- 测试修改元素 (两者都支持) ---
        asList.set(0, "A_Modified");
        realArrayList.set(0, "A_Modified");
        System.out.println("After set(0):");
        System.out.println("asList: " + asList); // 输出: [A_Modified, B, C]
        System.out.println("realArrayList: " + realArrayList); // 输出: [A_Modified, B, C]
        System.out.println("originalArray: " + Arrays.toString(originalArray)); 
        // 关键!原数组也被修改了: [A_Modified, B, C]
        // 这说明 asList 和 originalArray 共享底层数据
        // --- 测试添加元素 (关键区别) ---
        try {
            realArrayList.add("D"); // 成功
            System.out.println("realArrayList after add: " + realArrayList); // [A_Modified, B, C, D]
        } catch (Exception e) {
            System.out.println("realArrayList add failed: " + e);
        }
        try {
            asList.add("D"); // 失败!抛出异常
        } catch (Exception e) {
            System.out.println("asList add failed: " + e); 
            // 输出: java.lang.UnsupportedOperationException
        }
        // --- 测试删除元素 (关键区别) ---
        try {
            realArrayList.remove(0); // 成功
            System.out.println("realArrayList after remove: " + realArrayList); // [B, C, D]
        } catch (Exception e) {
            System.out.println("realArrayList remove failed: " + e);
        }
        try {
            asList.remove(0); // 失败!抛出异常
        } catch (Exception e) {
            System.out.println("asList remove failed: " + e);
            // 输出: java.lang.UnsupportedOperationException
        }
    }
}

为什么会这样设计?

Arrays.asList() 的设计目的不是为了创建一个全能、可变的集合,而是为了提供一个在数组和期望接收 List 参数的API之间进行转换的桥梁。

它的主要用途是:

  1. 当你需要一个快速、轻量级的列表视图来遍历或访问数组元素时。
  2. 当一个方法需要传入 List 参数,而你手头正好有一个数组时,可以快速包装一下。例如:someMethodThatTakesList(Arrays.asList(myArray))

如何得到一个真正可变的ArrayList?

如果你需要的是一个可以随意添加、删除元素的完整功能的 ArrayList,你应该新建一个

String[] myArray = {“A”, “B”, “C”};
// 方法一:最常用和推荐的方法
List list1 = new ArrayList<>(Arrays.asList(myArray));

// 方法二:使用 Java 8 的 Stream API (更现代)
List list2 = Arrays.stream(myArray).collect(Collectors.toList());

// 方法三:如果你需要的是特定类型的ArrayList,而不是通用的List接口
ArrayList list3 = new ArrayList<>(Arrays.asList(myArray));

总结:

记住 Arrays.asList() 返回的是一个尺寸固定的“假”列表,它只是原始数组的一个只读视图(除了修改元素值)。在绝大多数需要操作集合内容的场景下,你都应该将它作为构造参数,创建一个真正的 java.util.ArrayList

到此这篇关于java Arrays.asList 返回什么与普通 ArrayList 区别介绍的文章就介绍到这了,更多相关java Arrays.asList与ArrayList 区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java8 使用工厂方法supplyAsync创建CompletableFuture实例

    Java8 使用工厂方法supplyAsync创建CompletableFuture实例

    这篇文章主要介绍了Java8 使用工厂方法supplyAsync创建CompletableFuture实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Spring中容器创建的四种方式示例

    Spring中容器创建的四种方式示例

    这篇文章主要介绍了Spring中容器创建的四种方式示例,Spring容器是Spring框架的核心部分,它负责管理和组织应用程序中的对象,它提供了一种轻量级的、非侵入式的方式来实现对象的创建、依赖注入和生命周期管理,需要的朋友可以参考下
    2023-10-10
  • SpringBoot下的值注入(推荐)

    SpringBoot下的值注入(推荐)

    这篇文章主要介绍了SpringBoot下的值注入(推荐)的相关资料,需要的朋友可以参考下
    2017-05-05
  • Spring @Async 注解异步调用失效的五种解决方案

    Spring @Async 注解异步调用失效的五种解决方案

    加上了@Async 注解,期待它能异步执行,结果发现它还是同步执行的?更困惑的是,同样的注解在其他地方却能正常工作,这个问题困扰了很多 Java 开发者,尤其是当你在同一个类中调用带有@Async 注解的方法时,今天,我们就来深入解析这个问题的原因,并提供多种实用的解决方案
    2025-05-05
  • IDEA使用SpringAssistant插件创建SpringCloud项目

    IDEA使用SpringAssistant插件创建SpringCloud项目

    IDEA 功能强大,可以用来高效的开发应该程序。它还支持第三方插件、用户可以根据需要添加自己喜欢的插件。下面介绍如何使用 IDEA 创建 Spring Cloud 项目
    2021-06-06
  • 详解Java ES多节点任务的高效分发与收集实现

    详解Java ES多节点任务的高效分发与收集实现

    ElasticSearch 是一个高可用开源全文检索和分析组件。提供存储服务,搜索服务,大数据准实时分析等。一般用于提供一些提供复杂搜索的应用
    2021-06-06
  • SpringMVC 中的视图使用 JSP的过程

    SpringMVC 中的视图使用 JSP的过程

    本文介绍了如何在 SpringMVC 中使用 JSP 视图,包括如何创建 JSP 视图、配置 JSP 视图解析器、以及如何在控制器方法中使用JSP视图,本文给大家介绍的非常详细,需要的朋友参考下吧
    2023-07-07
  • SpringBoot 自定义+动态切换数据源教程

    SpringBoot 自定义+动态切换数据源教程

    这篇文章主要介绍了SpringBoot 自定义+动态切换数据源教程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • JavaEE线程安全定时器模式任务

    JavaEE线程安全定时器模式任务

    这篇文章主要介绍了JavaEE线程安全定时器模式任务,定时器模式像是一个闹钟定时,在一定时间之后被唤醒并执行某个之前设定好的任务,感兴趣的小伙伴可以参考一下
    2022-06-06
  • Java中的接口和抽象类用法实例详解

    Java中的接口和抽象类用法实例详解

    这篇文章主要介绍了Java中的接口和抽象类用法,结合实例形式较为详细的分析了Java中关于接口和抽象类的概念、定义、用法与相关注意事项,需要的朋友可以参考下
    2015-12-12

最新评论