软件编程
位置:首页>> 软件编程>> java编程>> Java Arrays.asList使用方法解析

Java Arrays.asList使用方法解析

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

标签:java,Arrays,asList

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

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com