Java Arrays.asList使用方法解析

作者:风缱云流 时间:2023-11-26 06:27:09 

Arrays.asList()方法的作用是将数组或一些元素转为集合,而你得到的集合并不是我们通常使用的List集合,而是Arrays里面的一个内部类。阿里的开发手册上java开发规范说到使用工具类Arrays.asList()方法把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出java.lang.UnsupportedOperationException的异常。

一、Arrays.asList的方法说明


public static void main(String[] args) {
   String[] strs = {"1","2","3"};
   List<String> asList = Arrays.asList(strs);
   System.out.println(asList.size());
   asList.add("4");
 }

运行结果如下,asList的add和remove方法都会抛异常。

3
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at com.basic.practice.ArraysPractice.main(ArraysPractice.java:12)

而set方法,则可以正常调用。

asList.set(1, "4");

方法没有抛异常,正常返回结果:

3
[1, 4, 3]

Process finished with exit code 0

查看下Arrays.asList()方法的源码,可以发现asList里面直接用传入的数组创建并反悔了ArrayList,而这个ArrayList是Arrays的内部类,它的size()方法直接取的是构造方法传参时的数组的长度,ArrayList虽然实现了List接口,但是并没有重写add和remove方法,但重写了get和set方法。


@SafeVarargs
 @SuppressWarnings("varargs")
 public static <T> List<T> asList(T... a) {
   return new ArrayList<>(a);
 }

/**
  * @serial include
  */
 private static class ArrayList<E> extends AbstractList<E>
   implements RandomAccess, java.io.Serializable
 {
   private static final long serialVersionUID = -2764017481108945198L;
   private final E[] a;

ArrayList(E[] array) {
     a = Objects.requireNonNull(array);
   }

@Override
   public int size() {
     return a.length;
   }

@Override
   public Object[] toArray() {
     return a.clone();
   }

@Override
   @SuppressWarnings("unchecked")
   public <T> T[] toArray(T[] a) {
     int size = size();
     if (a.length < size)
       return Arrays.copyOf(this.a, size,
                  (Class<? extends T[]>) a.getClass());
     System.arraycopy(this.a, 0, a, 0, size);
     if (a.length > size)
       a[size] = null;
     return a;
   }

@Override
   public E get(int index) {
     return a[index];
   }

@Override
   public E set(int index, E element) {
     E oldValue = a[index];
     a[index] = element;
     return oldValue;
   }

@Override
   public int indexOf(Object o) {
     E[] a = this.a;
     if (o == null) {
       for (int i = 0; i < a.length; i++)
         if (a[i] == null)
           return i;
     } else {
       for (int i = 0; i < a.length; i++)
         if (o.equals(a[i]))
           return i;
     }
     return -1;
   }

@Override
   public boolean contains(Object o) {
     return indexOf(o) != -1;
   }

@Override
   public Spliterator<E> spliterator() {
     return Spliterators.spliterator(a, Spliterator.ORDERED);
   }

@Override
   public void forEach(Consumer<? super E> action) {
     Objects.requireNonNull(action);
     for (E e : a) {
       action.accept(e);
     }
   }

@Override
   public void replaceAll(UnaryOperator<E> operator) {
     Objects.requireNonNull(operator);
     E[] a = this.a;
     for (int i = 0; i < a.length; i++) {
       a[i] = operator.apply(a[i]);
     }
   }
   @Override
   public void sort(Comparator<? super E> c) {
     Arrays.sort(a, c);
   }
 }

org.springframework.util.CollectionUtils.arrayToList()方法内部上也是会有这样的问题,底层也是使用的Arrays.asList()的方法。

二、常见的数组转list的方式

1、java8的流转换

List<String> list = Stream.of(strs).collect(Collectors.toList());

2、Collections工具类

ArrayList<String> list1 = new ArrayList<>();
Collections.addAll(list1,strs);

3、多一层封装创建

List<String> strings = new ArrayList<>(Arrays.asList(strs));

来源:https://www.cnblogs.com/8593l/p/12528471.html

标签:java,Arrays,asList
0
投稿

猜你喜欢

  • java高并发之线程组详解

    2023-02-15 21:30:25
  • Java命令设计模式优雅解耦命令和执行提高代码可维护性

    2023-11-23 06:25:46
  • Ajax实现省市区三级联动

    2023-01-14 05:09:58
  • C#二进制读写BinaryReader、BinaryWriter、BinaryFormatter

    2022-03-07 23:01:28
  • C# JSON格式化转换辅助类 ConvertJson

    2023-09-27 19:40:20
  • 关于C++运算符重载的一些困惑详解

    2023-05-25 15:33:20
  • Java使用@EnableEurekaServer实现自动装配详解

    2023-08-23 19:50:32
  • Unity3d 使用Gizmos画一个圆圈

    2022-05-22 05:10:52
  • 全面理解Java类和对象

    2021-11-17 11:11:50
  • Java设计模式之观察者模式(Observer模式)介绍

    2022-10-16 04:40:42
  • java读取文件字符集示例方法

    2023-11-09 12:35:39
  • 使用mybatis-plus的insert方法遇到的问题及解决方法(添加时id值不存在异常)

    2023-11-12 19:25:55
  • Java关于JDK1.8新特性的Stream流

    2021-06-02 11:36:35
  • C#实现字体旋转的方法

    2023-01-19 06:41:40
  • SpringBoot 如何优雅的实现跨服务器上传文件的示例

    2023-07-03 21:42:56
  • C# 无边框窗体之窗体移动实现代码

    2021-07-22 04:36:48
  • C# 创建高精度定时器的示例

    2023-03-09 12:35:58
  • kotlin 协程上下文异常处理详解

    2022-09-30 06:32:52
  • springboot+mybatis-plus 两种方式打印sql语句的方法

    2022-12-29 13:41:11
  • MyBatis查询数据返回null的解决

    2021-11-17 20:46:48
  • asp之家 软件编程 m.aspxhome.com