【1. 要点】

该方法是将数组转化成List集合的方法。

List list = Arrays.asList("a","b","c");

注意:

(1)该方法适用于对象型数据的数组(String、Integer...)

(2)该方法不建议使用于基本数据类型的数组(byte,short,int,long,float,double,boolean)

(3)该方法将数组与List列表链接起来:当更新其一个时,另一个自动更新

(4)不支持add()、remove()、clear()等方法

【2.Arrays.asList()是个坑】

用此方法得到的List的长度是不可改变的,

当你向这个List添加或删除一个元素时(例如 list.add("d");)程序就会抛出异常(java.lang.UnsupportedOperationException)。 怎么会这样?只需要看看asList()方法是怎么实现的就行了:

public static <T> List<T> asList(T... a) {return new ArrayList<>(a);}

当你看到这段代码时可能觉得没啥问题啊,不就是返回了一个ArrayList对象吗?问题就出在这里。

这个ArrayList不是java.util包下的,而是java.util.Arrays.ArrayList

它是Arrays类自己定义的一个静态内部类,这个内部类没有实现add()、remove()方法,而是直接使用它的父类AbstractList的相应方法。

而AbstractList中的add()和remove()是直接抛出java.lang.UnsupportedOperationException异常的!

public void add(int index, E element) { throw new UnsupportedOperationException();}

public E remove(int index) {throw new UnsupportedOperationException();}

总结:如果你的List只是用来遍历,就用Arrays.asList()。

如果你的List还要添加或删除元素,还是乖乖地new一个java.util.ArrayList,然后一个一个的添加元素。

【3.示例代码】

package cn.wyc;

import java.util.Arrays;
import java.util.List; public class Test {
public static void main(String[] args){ //1、对象类型(String型)的数组数组使用asList(),正常
String[] strings = {"aa", "bb", "cc"};
List<String> stringList = Arrays.asList(strings);
System.out.print("1、String类型数组使用asList(),正常: ");
for(String str : stringList){
System.out.print(str + " ");
}
System.out.println(); //2、对象类型(Integer)的数组使用asList(),正常
Integer[] integers = new Integer[] {1, 2, 3};
List<Integer> integerList = Arrays.asList(integers);
System.out.print("2、对象类型的数组使用asList(),正常: ");
for(int i : integerList){
System.out.print(i + " ");
}
// for(Object o : integerList){
// System.out.print(o + " ");
// }
System.out.println(); //3、基本数据类型的数组使用asList(),出错
int[] ints = new int[]{1, 2, 3};
List intList = Arrays.asList(ints);
System.out.print("3、基本数据类型的数组使用asList(),出错(输出的是一个引用,把ints当成一个元素了):");
for(Object o : intList){
System.out.print(o.toString());
}
System.out.println(); System.out.print(" " + "这样遍历才能正确输出:");
int[] ints1 = (int[]) intList.get(0);
for(int i : ints1){
System.out.print(i + " ");
}
System.out.println(); //4、当更新数组或者List,另一个将自动获得更新
System.out.print("4、当更新数组或者List,另一个将自动获得更新: ");
integerList.set(0, 5);
for(Object o : integerList){
System.out.print(o + " ");
}
for(Object o : integers){
System.out.print (o + " ");
}
System.out.println(); //5、add() remove() 报错
System.out.print("5、add() remove() 报错: ");
// integerList.remove(0);
// integerList.add(3, 4);
// integerList.clear();
} }

输出:

1、String类型数组使用asList(),正常:  aa bb cc
2、对象类型的数组使用asList(),正常: 1 2 3
3、基本数据类型的数组使用asList(),出错(输出的是一个引用,把ints当成一个元素了):[I@1540e19d
这样遍历才能正确输出:1 2 3
4、当更新数组或者List,另一个将自动获得更新: 5 2 3 5 2 3
5、add()、remove()、clear() 报错:

Arrays.asList() 详解的更多相关文章

  1. java.util.Arrays类详解(源码总结)

    概述 Arrays类位于java.util包下,是一个对数组操作的工具类.今天详细的看了看Arrays类的4千多行源码,现将Arrays类中的方法做一个总结(JDK版本:1.6.0_34).Array ...

  2. Arrays类详解

    数组是数据结构中最简单的一种类型.在平常的使用上也比较多见.今天就来总结一下数组在使用过程中的一些心得 1.java中包装数组的一些基本用法的抽象类  java.util.Arrays.这个类中包含操 ...

  3. 详解 Arrays类

    请关注本人博文--<详解 普通数组 -- Arrays类 与 浅克隆> Arrays类: 概述: 针对数组进行操作的工具类.它提供了对于数组的值的排序.查找等功能. 现在,本人来展示一下A ...

  4. AsList()方法详解

    AsList()方法详解 在Java中,我们应该如何将一个数组array转换为一个List列表并赋初始值?首先想到的肯定是利用List自带的add()方法,先new一个List对象,再使用add()方 ...

  5. 详解 普通数组 —— Arrays类 与 浅克隆

    我们在C语言中,编一些代码量规模比较大的程序,几乎都会用到 "数组" 或 "链表" ,但是,在本人之前的博文中,却对这两个知识点从未提到过,那么,本人将通过这篇 ...

  6. java:数组操作工具类 java.util.Arrays包 主要方法详解

    Arrays类位于Java.util包下,是一个对数组操作的工具类,现将Arrays类中的方法做一个总结(JDK版本:1.6.0_34).Arrays类中的方法可以分为八类: sort(对数组排序) ...

  7. Java 8 Stream API详解--转

    原文地址:http://blog.csdn.net/chszs/article/details/47038607 Java 8 Stream API详解 一.Stream API介绍 Java8引入了 ...

  8. MyBatis的Mapper文件的foreach标签详解

    MyBatis的Mapper文件的foreach标签用来迭代用户传递过来的Lise或者Array,让后根据迭代来拼凑或者批量处理数据.如:使用foreach来拼接in子语句. 在学习MyBatis M ...

  9. java反射机制深入详解

    java反射机制深入详解  转自:http://www.cnblogs.com/hxsyl/archive/2013/03/23/2977593.html 一.概念 反射就是把Java的各种成分映射成 ...

  10. HandlerMapping 详解

    HandlerMapping 详解 1. 导言 万丈高楼平地起,SpringMVC的辉煌离不开每个组件的相互协作,上一章详细阐述了SpringMVC整个体系结构及实现原理,知道HandlerMappi ...

随机推荐

  1. Object.freeze冻结属性和v-if结合requestAnimationFrame分帧渲染解决白屏

    计算100W条数据的长度造成2s延迟 <template> <div> <h1>数据总长度{{ arrList.length }}</h1> </ ...

  2. 使用 SK Plugin 给 LLM 添加能力

    前几篇我们介绍了如何使用 SK + ollama 跟 LLM 进行基本的对话.如果只是对话的话其实不用什么 SK 也是可以的.今天让我们给 LLM 整点活,让它真的给我们干点啥. What is Pl ...

  3. 为什么要把数据模型分为:Entity,DTO,Response,Request呢?具体有什么作用呢

    开发中,我们通常把数据模型分为几个部分,探讨下他们具体都有那些作用. 1. Entity(实体) 实体类代表数据库表结构,与数据库表一一对应. // 例如 User.cs public class U ...

  4. 三步把asp.net core 3.1应用部署到centos7

    一.编译发布Asp.net core 应用 直接使用vs2019编译发布后,通过ftp上传到centos的 /www/ 目录下,不再赘述. 二.centos安装asp.net core runtime ...

  5. 编译Ubuntu 24.04 LTS 内核(BuildYourOwnKernel)

    1.配置环境 修改apt源 修改 /etc/apt/sources.list.d/ubuntu.sources ,添加 "deb-src"到 Types:,修改后的文件内容如下: ...

  6. 记录一个uniapp写的小程序的手写板,横屏,用于签名,也可竖屏

    今天需要在小程序增加一个手写板的功能,但是得横向的手写纵向的保存,直接上代码,竖屏的时候不需要旋转图片 <template> <view class="wrapper&qu ...

  7. CyclicBarrier底层实现和原理

    1.CyclicBarrier 字面意思是可循环(Cyclic)使用的屏障(Barrier).它要做的事情是让一组线程到达一个屏障(同步点)时被阻塞,直到最后一个线程到达屏障时候,屏障才会开门.所有被 ...

  8. Kotlin:【字符串操作】substring、split、replace、字符串比较==与===、foreach遍历字符

    字符串的内存区域问题: 都在常量池内,相同的字符串比较属于同一引用 在字符串常量池开辟了新的内存区域,一共有三个对象,所以引用比较不相等

  9. Winform-耗时操作导致界面渲染滞后

    原因: 某些耗时操作阻塞了主线程. 理解上述原因,需先搞清楚Winform线程机制.主要有以下2点特性:1.单线程模型:2.依赖消息循环. 1.单线程模型 Winform 默认是单线程.通常,所有的U ...

  10. 去除小程序scroll-view产生的横向滚动条

    <template> <view class="page-demo"> <scroll-view class="scrool-more&qu ...