今天分享一个Arrays类中的asList方法,首先看下面一个例子:

import java.util.Arrays;
import java.util.List;public class TestAsList {public static void main(String[] args){int[] arr = {2,4,6,8,10};Integer[] arrInteger = {2,4,6,8,10};List list = Arrays.asList(arr);List list1 = Arrays.asList(arrInteger);System.out.println("list中元素的个数" + list.size());System.out.println("list中元素的数据类型" +list.get(0).getClass());System.out.println("list1中元素的个数" + list1.size());System.out.println("list1中元素的数据类型" + list1.get(0).getClass());}
}

运行结果:

list中元素的个数1
list中元素的数据类型class [I
list1中元素的个数5
list1中元素的数据类型class java.lang.Integer

从这个结果可以看出,同样是数组arr和arrInteger,一个是基础数据类型,一个是包装类型,但是调用asList方法后,所得结果是不一样的。

当数组是基本数据类型的时候,调用asList方法后,list的大小为1,list中的元素是一个数组类型;
当数组是包装类型的时候,调用asList方法后,list的大小为5,list中的元素是Integer类型。

为什么会出现这种情况,我们需要来看一下asList的方法源码,如下所示:

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

通过源码,我们可以看出来asList方法接收一个泛型化的可变参数列表,当传入一个基本数据类型的数组的时候,它会把这个基本数据类型的数组当做一个参数传入,然后返回一个新的ArrayList,其中a就是这个基本类型的数组,所以可变参数列表只接收了一个参数就是数组。当传入一个包装类型对象数组的时候,其中数组中的每一个元素都是一个对象,所以可变参数列表会传入五个对象类型Integer,还有一点是因为基础数据类型是不能被泛型化的,所以才会导致上面代码运行的结果。

注意点:在使用集合等的时候,如果需要使用到泛型,需要保证的是不要使用基础数据类型为泛型参数,这样是一种错误的做法。

例子2,一般我们用集合的时候,都会向集合中添加新的元素,那么我们可以尝试修改上述的代码,来使用add方法来添加新的元素,看看会出现什么问题?

import java.util.Arrays;
import java.util.List;public class TestAsList {public static void main(String[] args){int[] arr = {2,4,6,8,10};Integer[] arrInteger = {2,4,6,8,10};List list = Arrays.asList(arr);List list1 = Arrays.asList(arrInteger);System.out.println("list中元素的个数" + list.size());System.out.println("list中元素的数据类型" +list.get(0).getClass());System.out.println("list1中元素的个数" + list1.size());System.out.println("list1中元素的数据类型" + list1.get(0).getClass());list1.add(0);System.out.println(list1.size());}
}

运行结果如下:

Exception in thread "main" list中元素的个数1
list中元素的数据类型class [I
list1中元素的个数5
list1中元素的数据类型class java.lang.Integer
java.lang.UnsupportedOperationExceptionat java.base/java.util.AbstractList.add(AbstractList.java:153)at java.base/java.util.AbstractList.add(AbstractList.java:111)at com.TestAsList.main(TestAsList.java:17)

事情不好,为什么我用list1.add(0)会抛出不支持操作的异常呢?此时你还需要去阅读asList的源码,
该asList方法中返回一个new ArrayList(a),其中这个ArrayList不是java.util.ArrayList,而是Arrays类中自己内部类ArrayList,看下面的源码可以发现,该内部类ArrayList并没有add方法,所以会抛出不支持操作异常。

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);}@Overridepublic int size() {return a.length;}@Overridepublic Object[] toArray() {return Arrays.copyOf(a, a.length, Object[].class);}@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;}@Overridepublic E get(int index) {return a[index];}@Overridepublic E set(int index, E element) {E oldValue = a[index];a[index] = element;return oldValue;}@Overridepublic 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;}@Overridepublic boolean contains(Object o) {return indexOf(o) >= 0;}@Overridepublic Spliterator<E> spliterator() {return Spliterators.spliterator(a, Spliterator.ORDERED);}@Overridepublic void forEach(Consumer<? super E> action) {Objects.requireNonNull(action);for (E e : a) {action.accept(e);}}@Overridepublic 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]);}}@Overridepublic void sort(Comparator<? super E> c) {Arrays.sort(a, c);}@Overridepublic Iterator<E> iterator() {return new ArrayItr<>(a);}}

综上所述,在使用带有泛型化的参数的时候,需要注意数据类型。还有就是注意那个方法调用,首先需要看该对象是否拥有该方法,然后在决定是否使用。

Arrays中的asList方法相关推荐

  1. Arrays中的asList注意的点以及解决方案

    前言: Arrays.asList()返回ArrayList对象.但是这个ArrayList对象是Arrays内部类. so方法返回的ArrayList对象的特性: 该方法不适用于基本数据类型(byt ...

  2. Arrays.asList方法总结

    作用 : Arrays.asList() 将一个数组转化为一个List对象,这个方法会返回一个ArrayList类型的对象, 这个ArrayList类并非java.util.ArrayList类,而是 ...

  3. 浅谈Arrays.asList()方法的使用

    浅谈Arrays.asList()方法的使用 首先,该方法是将数组转化为list.有以下几点需要注意: (1)该方法不适用于基本数据类型(byte,short,int,long,float,doubl ...

  4. Java 细节汇总(4)-Arrays 中的双轴快排

    文章目录 1. Arrays 中的双轴快排 2. Java 中 switch 支持字符串的原理 3. Java 中 break,continue 标签的用法 4. Java 中 Math.ceil() ...

  5. java arrays.aslist()_Java中Arrays.asList()方法详解及实例

    Arrays.asList() 是将数组作为列表. 问题来源于: public class Test { public static void main(String[] args) { int[] ...

  6. arrays中copyof_为什么阿里巴巴开发手册明确说明 Arrays.asList() 不能使用其修改方法?...

    作者:我想问问天 来源:https://juejin.im/post/5d10e52ee51d454f6f16ec11 引语: 阿里巴巴java开发规范说到使用工具类Arrays.asList()方法 ...

  7. java中的asList_Java中的Arrays.asList()方法

    Arrays.asList()返回一个List,但是这种情况下,其底层的实现是一个final数组,因此不能调整其尺寸 如下代码片段: package chapter11.t1; import java ...

  8. 正确认识Arrays.asList方法

    Arrays工具类提供了一个方法asList, 使用该方法可以将一个变长参数或者数组转换成List . 其源代码如下: /*** Returns a fixed-size list backed by ...

  9. Java Arrays.asList()方法详解

    本文是对Arrays.asList()方法从源码角度进行分析,解析使用中的一些困惑. 首先看Arrays.asList()的源码 public static <T> List<T&g ...

最新文章

  1. (数论)51NOD 1135 原根
  2. 机器学习面试知识点汇总(Machine Learning Core Concepts Collection)
  3. 关于xmpp协议发送消息,登录认证SSL报错的问题
  4. 【CodeForces - 608C】Chain Reaction (二分 或 dp ,思维)
  5. C++中引用()基础认识
  6. 屏蔽非法路由,好好上网!
  7. 机器学习实战(Machine Learning in Action)学习笔记————06.k-均值聚类算法(kMeans)学习笔记...
  8. 2014全国计算机等级考试四级数据库工程师考试大纲,4月全国计算机等级考试四级数据库工程师笔试试卷(1)...
  9. 转:百度又开始踢新浪屁股了
  10. 支持rotate和大小限制的golang log库
  11. 百度如何使用Go语言重构日请求量千亿级别的系统?
  12. SpringMVC深度探险(四) —— SpringMVC核心配置文件详解
  13. node.js 爬取腾讯地图API全国行政区数据
  14. 在Excel中如何实现快速互换两列内容
  15. scrapy 中日志的使用
  16. 品优购项目--登录页面
  17. ftp服务器与共享文件对比,ftp服务器与共享的区别
  18. CSS3 animation-fill-mode 属性
  19. 如何打造又快又好的PPT(一)
  20. 177本名著浓缩成了177句话

热门文章

  1. database honeypot by design
  2. 《程序员的呐喊》一一1.6 神秘机器的笔记
  3. MYSQL主键值加1
  4. Java如何创建数组并初始化
  5. Java解析XML文件的方式
  6. 在线PS软件有哪些不错的推荐
  7. Ae 入门系列之六:形状图层
  8. 【Realflow】Domain 节点翻译
  9. 三、Socket测试示例
  10. 计网大作业--SMTP邮件代理服务器