如何在Java中使用Arrays.asList方法

这期内容当中小编将会给大家带来有关如何在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);
  }

  /**
   * @serial include
   */
  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));

上述就是小编为大家分享的如何在Java中使用Arrays.asList方法了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注创新互联行业资讯频道。


当前名称:如何在Java中使用Arrays.asList方法
转载来源:http://myzitong.com/article/peosoj.html