Arrays.asList问题
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问题相关推荐
- 为什么阿里巴巴开发手册明确说明 Arrays.asList() 不能使用其修改方法
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:juejin.im/post/5d10e52ee51d454 ...
- Arrays.asList方法总结
作用 : Arrays.asList() 将一个数组转化为一个List对象,这个方法会返回一个ArrayList类型的对象, 这个ArrayList类并非java.util.ArrayList类,而是 ...
- Arrays.asList详解
记得以前写过一段这样的代码: String[] arr=...{"a","b","c"}; List l = Arrays.asList(a ...
- 集合 Arrays.asList | java.lang.UnsupportedOperationException: null
// Arrays.asList(xxx) 返回的是一个内部类, 不是正常认为实现的Collection // 无法进行增删 // 直接解决办法List<String> asList = ...
- 正确认识Arrays.asList方法
Arrays工具类提供了一个方法asList, 使用该方法可以将一个变长参数或者数组转换成List . 其源代码如下: /*** Returns a fixed-size list backed by ...
- Java Arrays.asList注意事项
Arrays.asList用来将数组转化为List,这个看似功能很明了的方法却暗藏玄机. 请先看下面的程序: int[] datas = new int[]{1,2,3,4,5}; List list ...
- java arrays.aslist()_Java中Arrays.asList()方法详解及实例
Arrays.asList() 是将数组作为列表. 问题来源于: public class Test { public static void main(String[] args) { int[] ...
- arrays中copyof_为什么阿里巴巴开发手册明确说明 Arrays.asList() 不能使用其修改方法?...
作者:我想问问天 来源:https://juejin.im/post/5d10e52ee51d454f6f16ec11 引语: 阿里巴巴java开发规范说到使用工具类Arrays.asList()方法 ...
- java集合的批量新建_java使用Arrays.asList快速创建List集合
程序中某段案例代码如下: Map> tMap = new HashMap>(); tMap.put(name, Arrays.asList(new CronTrigger[] { trig ...
最新文章
- python第一天作业:字典
- nginx大量TIME_WAIT的解决办法--转
- tf.placeholder使用错误
- Hadoop在MapReduce中使用压缩详解
- vb6 由于超出容量限制 不能创建新事务_分布式限流?你也能轻松玩转(没啥新技术)...
- 产品经理思维模型:文化母体、品牌寄生、超级符号
- python-字符串数据类型-0222
- cart算法_机器学习十大算法之一——决策树CART算法
- CUDA TOOlkit Programming Guide 3. Programming Interface
- 常用数据结构有哪些(转)
- dts无法识别excel中的数字值?
- c include 多层目录_Gradle多模块(工程)配置解析 - 满足每个开发者的目录喜好
- 如何给awk传外部参数
- adams2015怎么把工具栏打开_怎么合并音乐?教大家3种快速完成音频合并的办法!...
- 多线程并发测试工具类
- matlab 0106,matlab中的plotyy
- Android wps自定义功能,完美兼容安卓4.2新增多项功能 WPS移动版升级至5.2
- 【云计算】一文了解裸金属服务器(一)
- Android实现应用数字角标
- (Yuni)Markdown光速入门
热门文章
- 红帽linux系统更改主机名称,怎么在 redhat 中修改计算机名
- 基于单片机的超市储物柜设计_657【毕设课设】基于单片机智能存柜储物柜存储柜系统设计...
- 磁盘上没有足够的空间完成此操作_三年多啦,那么多IT人还没有搞定这个问题...
- ajax send上传出错,Ajax在xmlhttp.send上出错
- java 调用solr服务器_Solr环境搭建及IK分词的集成及solrJ的调用(一)
- java线程stop re_Java 多线程 之 stop停止线程实例
- 教你在 Kubuntu 21.10 中升级 KDE Plasma 5.24
- 机械转电子工程嵌入式方向靠谱吗?怎么上手学习?
- 入门单片机需要购买什么东西,学哪款单片机最好?
- java 创建servlet_javaweb02-创建第一个Servlet