栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java Arrays.asList使用方法解析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 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  List asList(T... a) {
    return new ArrayList<>(a);
  }

  
  private static class ArrayList extends AbstractList
    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[] toArray(T[] a) {
      int size = size();
      if (a.length < size)
 return Arrays.copyOf(this.a, size,
     (Class) 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 spliterator() {
      return Spliterators.spliterator(a, Spliterator.ORDERED);
    }

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

    @Override
    public void replaceAll(UnaryOperator 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 c) {
      Arrays.sort(a, c);
    }
  }

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

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

  1、java8的流转换

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

  2、Collections工具类

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

  3、多一层封装创建

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/134749.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号