int[] arr1 = new int[3];
System.out.println(arr1[1]);//输出结果为:0
Integer[] arr2 = new Integer[3];
System.out.println(arr2[1]);//数据结果为:null
List<Integer> list = new ArrayList<Integer>();
System.out.println(list.get(1));//角标越界
请问:ArrayList底层的数据结构是数组,而且初始化时构造一个初始容量为 10 的空列表。
为什么int[]数组和Integer[]数组可以取出第2个元素,而集合却出现角标越界异常呢?作者: 李辉 时间: 2013-3-4 14:29
{:soso_e132:}俺也不知道呀! 还是先抢个沙发坐坐先 {:soso_e120:}作者: 陈圳 时间: 2013-3-4 14:37
int[] arr1 = new int[3];
System.out.println(arr1[1]);//输出结果为:0
Integer[] arr2 = new Integer[3];
System.out.println(arr2[1]);//数据结果为:null
List<Integer> list = new ArrayList<Integer>();
System.out.println(list.get(1));//角标越界------------=这代表你创建一个ArrayList集合,他初始化为空
//而你上面写的数组,都是已经确定大小的,并且在创建时,系统已经隐式的赋了值.空的容器里面没有对象.
//当你想往里面加入东西时,才有东西可取.否则就是一个空瓶子
//容器和数组是不一样的.数组的特性:创立必须确定大小,而容器虽然使用他的结构,但是并不代表他使用他的结构就变成了数组.作者: 吴硕 时间: 2013-3-4 15:12
如何允许你访问,则说明集合中已经有元素了,元素为null
但事实上并没有向集合中增加元素
所以不会允许你访问的作者: 谢达 时间: 2013-3-4 15:53
从ArrayList的源码中可以解决楼主的问题,ArrayList的get方法定义
public E get(int index) {
RangeCheck(index); //此处会进行检查
//RangeCheck(index)定义
/*private void RangeCheck(int index) {
if (index >= size) //当前size为0,index为1 所以抛出IndexOutOfBoundsException
throw new IndexOutOfBoundsException(
"Index: "+index+", Size: "+size);
}*/