今天的内容

1.ArrayList【重点】

2.LinkedList【开发不用,但是面试会问】

3.Object【所有的超类】

4.Set接口

1.ArrayList

首先看官方API

Collection下面有一个子接口叫List

List接口下面有一个实现类叫ArrayList

ArrayList底层是数组

ArrayList也是容器,可以放数据

源码分析

/**
    * Default initial capacity.
    默认的变量,变量值是10   默认的初始化的容量
    */
   private static final int DEFAULT_CAPACITY = 10;
/**
    * Shared empty array instance used for empty instances.
    声明了一个空的数组EMPTY_ELEMENTDATA 变量
    */
   private static final Object[] EMPTY_ELEMENTDATA = {};
/**
    * Shared empty array instance used for default sized empty instances. We
    * distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when
    * first element is added.
    默认容量的空数组
    */
   private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
/**
    * The size of the ArrayList (the number of elements it contains).
    *
    * @serial
    数组的有效的容量 size 默认值是0
    */
   private int size;
/**
    * Constructs an empty list with the specified initial capacity.
    *
    * @param initialCapacity the initial capacity of the list
    * @throws IllegalArgumentException if the specified initial capacity
    *         is negative
    构造方法,在实例化的时候调用有参数的构造
    */
   public ArrayList(int initialCapacity) {
       if (initialCapacity > 0) {
           this.elementData = new Object[initialCapacity];
      } else if (initialCapacity == 0) {
           this.elementData = EMPTY_ELEMENTDATA;
      } else {
           throw new IllegalArgumentException("Illegal Capacity: "+
                                              initialCapacity);
      }
  }
/**
    * Constructs an empty list with an initial capacity of ten.
    无参数的构造方法
    构造了一个初始化容量为10的空的数组
    */
   public ArrayList() {
       this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
  }


//扩容的方法。当数组的容量不够的话,会自动扩容
private void grow(int minCapacity) {
       // overflow-conscious code
    //oldCapacity 是老的容量
       int oldCapacity = elementData.length;//10个容量 数组里面只能放10个元素
    //newCapacity新的容量 (oldCapacity >> 1);叫位元算符
    // int newCapacity = oldCapacity + oldCapacity * 0.5;
    //int newCapacity = 1.5 * oldCapacity;//扩容的是原来数组的1.5倍
    //原来的数据是10   扩容以后的容量是15  
       int newCapacity = oldCapacity + (oldCapacity >> 1);
       if (newCapacity - minCapacity < 0)
           newCapacity = minCapacity;
       if (newCapacity - MAX_ARRAY_SIZE > 0)
           newCapacity = hugeCapacity(minCapacity);
       // minCapacity is usually close to size, so this is a win:
    //扩容完以后,进行数组的赋值
    //[1,2,3,4,5,6,7,8,9,10] 原来的数组
    //[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] 在赋值一个数组这个数组容量是15
    //进行数组的扩容了,新的数组还有有老数组中的数据
//所以使用copy方法
       elementData = Arrays.copyOf(elementData, newCapacity);
  }

面试题:
ArrayList处理数据的特征:
增数据删数据比较慢。为什么?
      增加数据效率低:
      1.有可能会涉及到数组的扩容,涉及到数组的copy
      2.添加数据到指定位置的时候,会导致从添加数据位置开始整体后移