关于list


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>
        implements List<E>,

RandomAccess,

Cloneable,

java.io.Serializable{}

JDK1.7中,使用无参数构造方法创建ArrayList对象时,默认底层数组长度是10。JDK1.8中,使用无参数构造方法创建ArrayList对象时,默认底层数组长度是0;第一次添加元素,容量不足就要进行扩容了

public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

private static int calculateCapacity(Object[] elementData, int minCapacity) {
    if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
        return Math.max(DEFAULT_CAPACITY, minCapacity);
    }
    return 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);
    }

原文地址:https://www.cnblogs.com/vincentmax/p/14241181.html