ArrayList 带参数(Collection<? extends E> c)构造器的一点见解
来源:互联网 发布:vc6.0连接sql数据库 编辑:程序博客网 时间:2024/06/05 16:47
先贴上源码:
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
private static final Object[] EMPTY_ELEMENTDATA = {};
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
transient Object[] elementData; // non-private to simplify nested class access
...............................................
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
// c.toArray might (incorrectly) not return Object[] (see 6260652)
// Arrays.asList卻不是這樣,如果它的類型是一個Object[]子類(比如String[]),那麼toArray()就會返回這個子類而不是Object[]
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
// replace with empty array.
this.elementData = EMPTY_ELEMENTDATA;
}
}
..........................................
}
implements RandomAccess, java.io.Serializable
{
private static final long serialVersionUID = -2764017481108945198L;
private final E[] a;
ArrayList(E[] array) {
a = Objects.requireNonNull(array);
}
@Override
public int size() {
return a.length;
}
@Override
public Object[] toArray() {
return a.clone();
}
}
Arrays.asList()返回一个内部类,调用内部类的toArray()方法返回的不是一个Object[],而是E[]。
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
ArrayList构造器的源码 elementData.getClass()一旦不是一个Object[]就会将他复制成为一个Object[],为什么还要做这样一种转换?
String b[] = {"a","b"};
Object a[] = b;
向上转型是允许的,但是
String b[] = {"a","b"};
Object a[] = b;
a[0] = 1;
Exception in thread "main" java.lang.ArrayStoreException: java.lang.Integer 运行时抛出这个异常。
意味着如果不转成Object[],你想某个位置add一个Object的子类时,这个时候就会出现以上的异常。
- ArrayList 带参数(Collection<? extends E> c)构造器的一点见解
- public ArrayList(Collection<? extends E> c)中的 ? 和 E 是什么意思
- public ArrayList(Collection<? extends E> c){}中的 ? 和 E
- public ArrayList(Collection<? extends E> c)中的 ? 和 E 解释
- (72)泛型限定:?的用法,TreeSet(Collection<? extends E> c)参数的理解
- ArrayList.addAll(Collection<? extends E> c) 方法讲解
- HashSet(Collection<? extends E> c)
- 关于List<E>.addAll(Collection<? extends E> collection)传入参数null
- extends 构造器演示,基类带参数与不带参数区别
- c# 构造函数的一点见解
- 带参数的构造器
- Java中集合(一)Collection 、List<E> 、ArrayList<E>
- java集合系列08番外篇 ArrayList(Collection c)构造器中的bug介绍
- ”extends“之令人恶心的构造器
- 带参数的构造函数
- 带参数的构造函数
- 带参数的构造函数
- 带参数的构造函数
- [开源软件集萃]-1-GraphStudioNext
- ARM启动方式 特别是关于中断向量的讲解解决了我的迷惑 reset vector的重定向
- HC08传送类指令操作对CCR的影响如何?
- Android属性动画
- Python基础(7)- python各类模块、正则表达式、元字符、异常处理
- ArrayList 带参数(Collection<? extends E> c)构造器的一点见解
- Micrium DEMO9S12NE64 uCOS-II 官方包 调试记录!
- hexo+七牛云创建博客
- 【Linux学习笔记】4:常见目录作用
- 计算机设备名称英语词汇(2)
- Codewarrior 中的 .prm 文件
- java学习——java基础(七)之 IO
- Memcache笔记
- 网络丢包的四大原因和修复方法