ArrayList是List接口的大小可变数组的实现。每个ArrayList实例都有一个容量,随着向ArrayList中增加元素,其容量也在不断增加。
ArrayList类中存在两个成员变量:
private transient Object[] data;//对象数组
private int size;//大小
构造方法ArrayList(),默认初始容量为10的空列表
ArrayList创建实例通常都需要加上泛型,定义方式为:public ArrayList(int initialCapacity){ if(initialCapacity<0) throw new IllegalArgumentException("初始化容量出错:"+initailCapacity); this.data=new Object[initialCapacity];//data为ArrayList的一个成员 } public ArrayList(){ this(10);//代表上面的带参数构造函数 }
使用add方法往aList中添加元素,在ArrayList中帮我们处理了添加方式,添加末尾处ArrayList<Object> aList=new ArrayList<Object>();//aList存放的元素为Object类型
其中的第一个2,和第二个添加的“2”都是Object类型,因此如果使用int或者String接收值会报错:aList.add(2); aList.add("2");
纵然我们很清楚获取的应该是什么类型,但是编译器还是报错,因此我们必须强制类型转换int a=aList.get(0);//编译报错:类型不匹配,不能从Object类型转化为int String b=aList.get(1);//编译报错:类型不匹配,不能从Object类型转化为String
上面我们用到了get方法,用来获取元素数据,在底层调用中先进行一次判定,判定是否索引越界,越界则进行异常抛出处理:int a=(Integer)aList.get(0); String b=(String)aList.get(1);//编译成功
进行了上面索引的检查后,然后执行返回元素数据:private void RangeCheck(int index){ if(index>=size) throw new IndexOutOfBoundsException("索引"+index+"但是size为:"+size); }
public E get(int index) { RangeCheck(index); return (E)data[index]; }
这里返回的是个E就是ArrayList<E>类中的E,也叫泛型,它的好处就是可以将实际的数据类型放置到创建对象的时候来确定,对代码的重用性起了很大的作用,ArrayList<Object>就是确定为Object对象。