从java集合结构能够看出来ArrayList是属于Collection中的List范畴的。从源代码中是这样表示的,
public classArrayList<E> extends AbstractList<E>
implementsList<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList有两个属性:
/**
* The array buffer into which the elementsof the ArrayList are stored.
* The capacity of the ArrayList is thelength of this array buffer.
*/
privatetransientObject[] elementData;
/**
* The size of the ArrayList (the number ofelements it contains).
*
* @serial
*/
private int size;
从两个属性能够看出来ArrayList的数据结构是Object数组。这里的Object数组是transient来修饰的,针对这个关键字的介绍参见博客《java的transient关键字》。
ArrayList有三个构造函数:
publicArrayList(intinitialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("IllegalCapacity: "+
initialCapacity);
this.elementData= newObject[initialCapacity];
}
public ArrayList() {
this(10);
}
publicArrayList(Collection<? extends E> c) {
elementData = c.toArray();
size = elementData.length;
// c.toArraymight (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass()!= Object[].class)
elementData = Arrays.copyOf(elementData, size,Object[].class);
}
}
第一个构造函数传入一个数组长度,以此来实例化Object数组,第二个构造函数默认实例化Object数组的长度为10,第三个构造函数是传入一个Collection集合,将集合转换为数组赋给Object数组,长度赋给size,如果此时传入的集合的类型不是Object类型的话就通过数组拷贝的方法将类型转换成Object类型。
下面来看几个关键的方法:
public int size() {
return size;
}
publicbooleanisEmpty() {
return size== 0;
}
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
这三个方法比较简单,区size值和判断是否是空以及判断是否包含某个对象。
在最后一个方法中涉及到了indexOf方法:
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
这个方法是针对数组进行遍历,如果存在则返回索引值,如果没有发现则返回-1。
后面还有toArray方法和clone方法以及lastIndexOf,简单介绍一下源代码,首先toArray主要是通过Arrays.copyof方法将数组和集合建立一个桥梁,clone方法就是拷贝,这里注意是浅拷贝方法,lastIndexOf是从后面进行索引,这个与indexOf正好相反。
后面就是经常用的get、set、add、remove等方法了。下一篇博客来介绍。