2019独角兽企业重金招聘Python工程师标准>>>

先看实例程序,然后我们分析该程序

public class ArraysClone {@Testpublic void test() {int[] datas = {1, 2, 3, 4, 5};Integer[] datas1 = {1, 2, 3, 4, 5};System.out.println(datas1);System.out.println(Arrays.asList(datas1).size());System.out.println(datas.equals(Arrays.asList(datas).get(0)));List list = Arrays.asList(datas1);list.add(9);System.out.println(list);}
}
[Ljava.lang.Integer;@20fa23c1
5
truejava.lang.UnsupportedOperationExceptionat java.util.AbstractList.add(AbstractList.java:148)at java.util.AbstractList.add(AbstractList.java:108)at advance.ArraysClone.test(ArraysClone.java:20)

我们要看的第一个掉眼的事是为什么datas.equals.(Arrays.asList(datas).get(0))返回true。这是因为int,float这些基础类型是没有泛型的,平常之所以泛型用起来没有问题,是的,是包装类,看下面实例:

@Testpublic void test1() {int a=12;testGenericType(a);Integer b=13;testGenericType(b);}public <T> void testGenericType(T t) {System.out.println(t.getClass() + "->" + t);}
class java.lang.Integer->12
class java.lang.Integer->13

但是这个掉眼的这个地方并没有发生boxed,而这也是数组的一大特性,它本省也是一个对象,如打印结果,[Ljava.lang.Integer;@20fa23c1 这个[L表示一维数组,且跟了全限定名。因而int arrays[]是一个对象额,故而其大小为1,故而比较相等! 第而个就是我们出现的异常,之所已发生异常,是因为此ArrayList非我们常用的ArraysList,这个ArrayList是Arrays里自己定义的,asList 返回的是一个长度不可变的列表。数组是多长,转换成的列表是多长,我们是无法通过 add、remove 来增加或者减少其长度的。具体看源码:

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 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;}@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) != -1;}@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);}}

我们发现它并没有重写add.remove方法.看其父类的方法(注意set方法重写过了!)

    public void add(int index, E element) {throw new UnsupportedOperationException();}public E set(int index, E element) {throw new UnsupportedOperationException();}public E remove(int index) {throw new UnsupportedOperationException();}

这就是异常原因。

转载于:https://my.oschina.net/xd03122049/blog/867231

Arrays.asList问题相关推荐

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

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:juejin.im/post/5d10e52ee51d454 ...

  2. Arrays.asList方法总结

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

  3. Arrays.asList详解

    记得以前写过一段这样的代码: String[] arr=...{"a","b","c"}; List l = Arrays.asList(a ...

  4. 集合 Arrays.asList | java.lang.UnsupportedOperationException: null

    // Arrays.asList(xxx) 返回的是一个内部类, 不是正常认为实现的Collection // 无法进行增删 // 直接解决办法List<String> asList = ...

  5. 正确认识Arrays.asList方法

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

  6. Java Arrays.asList注意事项

    Arrays.asList用来将数组转化为List,这个看似功能很明了的方法却暗藏玄机. 请先看下面的程序: int[] datas = new int[]{1,2,3,4,5}; List list ...

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

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

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

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

  9. java集合的批量新建_java使用Arrays.asList快速创建List集合

    程序中某段案例代码如下: Map> tMap = new HashMap>(); tMap.put(name, Arrays.asList(new CronTrigger[] { trig ...

最新文章

  1. python第一天作业:字典
  2. nginx大量TIME_WAIT的解决办法--转
  3. tf.placeholder使用错误
  4. Hadoop在MapReduce中使用压缩详解
  5. vb6 由于超出容量限制 不能创建新事务_分布式限流?你也能轻松玩转(没啥新技术)...
  6. 产品经理思维模型:文化母体、品牌寄生、超级符号
  7. python-字符串数据类型-0222
  8. cart算法_机器学习十大算法之一——决策树CART算法
  9. CUDA TOOlkit Programming Guide 3. Programming Interface
  10. 常用数据结构有哪些(转)
  11. dts无法识别excel中的数字值?
  12. c include 多层目录_Gradle多模块(工程)配置解析 - 满足每个开发者的目录喜好
  13. 如何给awk传外部参数
  14. adams2015怎么把工具栏打开_怎么合并音乐?教大家3种快速完成音频合并的办法!...
  15. 多线程并发测试工具类
  16. matlab 0106,matlab中的plotyy
  17. Android wps自定义功能,完美兼容安卓4.2新增多项功能 WPS移动版升级至5.2
  18. 【云计算】一文了解裸金属服务器(一)
  19. Android实现应用数字角标
  20. (Yuni)Markdown光速入门

热门文章

  1. 红帽linux系统更改主机名称,怎么在 redhat 中修改计算机名
  2. 基于单片机的超市储物柜设计_657【毕设课设】基于单片机智能存柜储物柜存储柜系统设计...
  3. 磁盘上没有足够的空间完成此操作_三年多啦,那么多IT人还没有搞定这个问题...
  4. ajax send上传出错,Ajax在xmlhttp.send上出错
  5. java 调用solr服务器_Solr环境搭建及IK分词的集成及solrJ的调用(一)
  6. java线程stop re_Java 多线程 之 stop停止线程实例
  7. 教你在 Kubuntu 21.10 中升级 KDE Plasma 5.24
  8. 机械转电子工程嵌入式方向靠谱吗?怎么上手学习?
  9. 入门单片机需要购买什么东西,学哪款单片机最好?
  10. java 创建servlet_javaweb02-创建第一个Servlet