Java之Arrays.asList陷阱
Java.Util.Arrays可以将数组转换为List,具体的定义如下:
@SafeVarargs
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
可以看到实际上是将这个数组转换成为了ArrayList<>,看似没有问题,但是当我们使用add和remove的时候,会发现会抛出UnsupportedOperationException,为什么?这个不科学呀!
进入Arrays的源代码才发现...尼玛这坑人...
| 1. Arrays.asList方法中返回的是List<>,但是实际上它继承的是AbstractList<> |
| 2. AbstractList<>继承自AbstractCollection<>和List<> |
| 3. Arrays.asList之后出来的List<>是无法操作add和remove的,会抛出UnsupportedOperationException异常 |
Arrays.asList中返回的ArrayList<>定义:
private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
{
...
}
AbstractList的定义:
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
...
}
那下面在来看一下ArrayList<E>中add和remove方法的实现吧,搜索了一下,没有找到add和remove方法!
好吧,那我去AbstractList里找,搜了一下,找到了add方法的定义:
public boolean add(E e) {
add(size(), e);
return true;
}
好吧,那继续F3查找add(int index, E element)的定义:
public void add(int index, E element) {
throw new UnsupportedOperationException();
}
看到了什么?坑爹吧就!
再看看remove方法:
public E remove(int index) {
throw new UnsupportedOperationException();
}
好吧,一排排的黑线啊...
终于找到原因了,那怎么处理呢?
解决方案:
需要用ArrayList处理一下:
Long[] idLongArrs = {1L, 2L, 3L};
ArrayList<Long> ids = new ArrayList<Long>(Arrays.asList(idLongArrs));
Java之Arrays.asList陷阱的更多相关文章
- 【转】java.util.Arrays.asList 的用法
DK 1.4对java.util.Arrays.asList的定义,函数参数是Object[].所以,在1.4中asList()并不支持基本类型的数组作参数. JDK 1.5中,java.util.A ...
- java.util.Arrays.asList 的小问题
JDK 1.4对java.util.Arrays.asList的定义,函数参数是Object[].所以,在1.4中asList()并不支持基本类型的数组作参数. JDK 1.5中,java.util. ...
- 由于java.util.Arrays.asList(...)导致的异常
前言: Collections.toArray()与Arrays.asList() 是Java API提供的友好的相互转换工具,日常开发中用于列表和数组之间的转换非常方便,但今天测试时,发现一下隐藏的 ...
- java之Arrays.asList
使用Arrays.asList()的原因无非是想将数组或一些元素转为集合,而你得到的集合并不一定是你想要的那个集合. 而一开始asList的设计时用于打印数组而设计的,但jdk1.5开始,有了另一个比 ...
- 【Java集合的详细研究2】浅谈Arrays.asList的使用
首先,该方法是将数组转化为list.有以下几点需要注意: (1)该方法不适用于基本数据类型(byte,short,int,long,float,double,boolean) (2)该方法将数组与列表 ...
- java Arrays.asList
List<String> list = Arrays.asList("A B C D E F G H I J K L ".split(" ")); ...
- 【Java必修课】好用的Arrays.asList也有这三个坑
好用的asList 在开发或写测试用例的过程中,经常会用到Arrays.asList()这个方法,可以快速方便地将数组转化成一个List.例如: List<String> list = A ...
- Java踩坑记系列之Arrays.AsList
java.util.Arrays的asList方法可以方便的将数组转化为集合,我们平时开发在初始化ArrayList时使用的比较多,可以简化代码,但这个静态方法asList()有几个坑需要注意: 一. ...
- Arrays.asList() 的使用注意
Sometimes it is needed to convert a Java array to List or Collection because the latter is a more po ...
随机推荐
- Spring 对JDBC的支持(JdbcTemplate)
Spring对数据库的操作,使用JdbcTemplate对象 需要引入相关的jar文件 如版本:(Spring核心jar包就不列了) spring-jdbc-3.2.5.RELEASE.jar spr ...
- Python问题记录:如何处理中文网页中的多余空格
在制作Epub电子书的时候,因为有从网络上下载的格式比较混乱的电子书,现在打算自己用Pythonc处理一下. 1.如何删除掉网页(html)中的多余空额.尤其是包含在tag(标签:span.p)当中的 ...
- ScrollView 尽量避免嵌套RelativeLayout,非常惨痛的教训
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...
- 360极速浏览器在XP系统下的一个bug
今天在做页面开发的时候,发现360浏览器在XP系统下不支持focus事件,而主流的IE(包括IE6),firefox,chrome都没有这个问题.前段开发的悲剧啊,各种浏览器兼容性的问题.
- 虚拟机环境Centos如何上网
虚拟机环境Centos如何上网----------by ruffianfish.痞子鱼 因为我是用的虚拟机的环境,所以一切操作角度从虚拟机出发. 虚拟机环境的优点: 适合新手学习linux 永远不要怕 ...
- sql性能优化总结(转)
网上看到一篇sql优化的文章,整理了一下,发现很不错,虽然知道其中的部分,但是没有这么全面的总结分析过…… 一. 目的 数据库参数进行优化所获得的性能提升全部加起来只占数据库应用系统性能提升的40 ...
- android 布局权重问题(转载)
//权重和父容器orientation有关 horizontal 指水平方向权重 android:layout_width vertical 指垂直方向权重 android:layout_he ...
- wpf+xml实现的一个随机生成早晚餐的小demo
话说每到吃完的时间就发愁,真的不知道该吃什么,然后就想到做一个生成吃什么的小软件,既然这个软件如此的简单,就打算用wpf开发吧,也不用数据库了,直接保存在xml中就可以了 程序整体结构如下图 首先我写 ...
- 不建议使用NSUserDefault存储大量数据
NSUserDefaults 其实是一个 plist 文件(有待验证),即使只是修改一个 key 都会 load 整个文件,不适合存储大量数据. NSUserDefaults是保存成文本格式的,容易被 ...
- Quartz1.8.5例子(十一)
/* * Copyright 2005 - 2009 Terracotta, Inc. * * Licensed under the Apache License, Version 2.0 (the ...