public class TestArrayList { public static void main(String[] args) { //1.创建一个ArrayList对象,用来存储多个分数 ArrayList list = new ArrayList(); //2.向ArrayList添加分数 list.add(67); //向末尾添加 list.add(89); // 集合的元素必须是对象类型,不能是基本数据类型。 list.add(78);//如果要放入基本数据类型,需要使用包装类 list.add(89);//JDK5之后,自动装箱 list.add(96); //list.add(Integer.valueOf(67)); //[67, 89, 78, 89, 96] list.add(2, 100); //[67, 89, 100, 78, 89, 96] ArrayList list2 = new ArrayList(); list2.add(45); list2.add(54); list2.add(45); //list.addAll(list2); //[67, 89, 100, 78, 89, 96, 45, 54, 45] list.addAll(0, list2); //list2.addAll(list); //[45, 54, 45, 67, 89, 100, 78, 89, 96] //3.获取ArrayList中的分数 System.out.println(list.toString()); System.out.println(list.size()); System.out.println(list.get(2)); //遍历ArrayList1:使用for循环 System.out.println("-------使用for循环-------"); for (int i = 0; i < list.size() ; i++) { int elem = (int) list.get(i); System.out.println(i+" "+elem); } //遍历ArrayList2:使用for-each循环 System.out.println("-------使用for-each循环--------"); for(Object elem :list){ System.out.println(elem); } //遍历ArrayList3:使用迭代器Iterator System.out.println("---------使用迭代器Iterator-----------"); Iterator it = list.iterator(); while(it.hasNext()){ int elem = (int) it.next(); System.out.println(elem); } } }
理解 ArrayList的源码
- ArrayList底层就是一个长度可以动态增长的Object数组;(StringBuilder底层就是一个长度可以动态增长的char数组)
-
public class ArrayList<E> extends AbstractList<E> implements
List<E>, RandomAccess, Cloneable, Serializable{
private static final int DEFAULT_CAPACITY = 10;
private static final Object[] EMPTY_ELEMENTDATA = {};
private static final Object[]DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
transient Object[] elementData;private int size;
}
- 接口是可以一个方法也不提供的,比如 RandomAccess, Cloneable, java.io.Serializable
public class ArrayList<E> extends AbstractList<E> RandomAccess, Cloneable, java.io.Serializable{} |
JDK1.7中,使用无参数构造方法创建ArrayList对象时,默认底层数组长度是10。JDK1.8中,使用无参数构造方法创建ArrayList对象时,默认底层数组长度是0;第一次添加元素,容量不足就要进行扩容了
public ArrayList() { private static int calculateCapacity(Object[] elementData, int minCapacity) { |
- 容量不足时进行扩容,默认扩容50%。如果扩容50%还不足容纳新增元素,就扩容为能容纳新增元素的最小数量。
-
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}