java.util.ArrayList与java.util.Arrays$ArrayList区别(转)
来源:互联网 发布:管理数据分析 编辑:程序博客网 时间:2024/06/15 19:11
转自:http://blog.csdn.net/maywehe/article/details/52553954
写demo的时候,为了避免用list.add方法,特意写了个数组然后转换成list。一开始以为转换成的list就是实现了AbstractList的通用的List, 比如ArrayList或者LinkedList等。 当调用add方法的时候, 奇怪的事情发生了。
String[] arrays = new String[] { "1", "2", "3" };List<String> list = Arrays.asList(arrays);list.add("4");
- 1
- 2
- 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.maywe.list.Demo.main(Demo.java:43)
- 1
- 2
- 3
- 4
List 调用add方法是最普遍不过的场景,怎么会抛异常呢? 赶快去研究下源码。
java.util.Arrays$ArrayList 源码
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) { if (array==null) throw new NullPointerException(); a = array; } public int size() { return a.length; } public Object[] toArray() { return a.clone(); } 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; } public E get(int index) { return a[index]; } public E set(int index, E element) { E oldValue = a[index]; a[index] = element; return oldValue; } public int indexOf(Object o) { 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; } public boolean contains(Object o) { return indexOf(o) != -1; } }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
的确是实现了AbstractList,但是没有实现add方法, 在看看AbstractList的add方法:
public boolean add(E e) { add(size(), e); return true; }public void add(int index, E element) { throw new UnsupportedOperationException(); }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
UnsupportedOperationException 就是怎么抛出来的。
所以java.util.Arrays$ArrayList只能在不超过capacity的情况下调用set设置元素,不能增加元素。
顺便研究了下java.util..ArrayList的add方法。
public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; }
- 1
- 2
- 3
- 4
- 5
- 在List的最后Append新元素,capacity增加一个
public void add(int index, E element) { rangeCheckForAdd(index); ensureCapacityInternal(size + 1); // Increments modCount!! System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = element; size++; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 在index指定的位置增加元素E, 同时index右边的(索引>index) 所有元素右移;
- 如果参数index大于当前的size会抛出异常,因为capacity只是增加一;
- 因为存在“右移”操作,建议没有必要的情况下调用List#add(E e)即可,避免不必要的“右移”操作
demo 代码:
String[] arrays = new String[] { "1", "2", "3" }; List<String> list = Arrays.asList(arrays); System.out.println(list); System.out.println(list.getClass()); List<String> list2 = new ArrayList<String>(list); list2.add(0, "0"); System.out.println(list2); System.out.println(list.getClass());
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
结果输出:
[1, 2, 3]class java.util.Arrays$ArrayList[0, 1, 2, 3]class java.util.Arrays$ArrayList
- 1
- 2
- 3
- 4
阅读全文
0 0
- java.util.ArrayList与java.util.Arrays$ArrayList区别(转)
- java.util.ArrayList与java.util.Arrays$ArrayList区别
- java.util.ArrayList学习
- java.util.ArrayList
- JAVA.Util.ArrayList
- java.util.ArrayList size()
- 【源代码】java.util.ArrayList
- 11 java.util.ArrayList
- java.util.ArrayList 源码
- Java-Util之ArrayList
- java.util.ArrayList<E>
- java.util.ArrayList
- java.util.ArrayList
- java.util.ArrayList
- java.lang.ClassCastException: java.util.Arrays$ArrayList cannot be cast to java.util.ArrayList
- 1. java.util.List 与 2.java.util.ArrayList<E>
- java.util.ConcurrentModificationException at java.util.ArrayList
- 【java】java.util.ArrayList类
- XMLHttpRequest
- 最小生成树--Truck History(poj 1789);
- 云星数据---Scala实战系列(精品版)】:Scala入门教程014-Scala实战源码-Scala函数定义与调用方式
- [图]Microsoft Store上线字体:未来Windows 10可轻松切换字体
- CSS样式添加及基础语法------借鉴w3shool.com.cn
- java.util.ArrayList与java.util.Arrays$ArrayList区别(转)
- 优达(Udacity)-机器学习基础-回归
- Intellij idea 16 打war包发布spring-boot maven项目 全记录
- 算法题练习系列之(四十一):童年生活二三事
- 统计学习方法 第5章 决策树(1)
- 用python实现登录验证码
- 分类与回归
- phpstorm 10.0.0.3注册码
- 浅析Linux防火墙