Java基础总结

来源:互联网 发布:淘宝网有电脑客户端吗 编辑:程序博客网 时间:2024/06/06 00:30
Java基础总结 - ArrayList详解
这篇文章只是把大学记的笔记整理到博客,方便自己查看,不保证权威性(•̀ᴗ•́)و ̑
对照着源码走流程比较好
Arraylist成员变量://默认的容量    private static final int DEFAULT_CAPACITY = 10;//内部定义的空数组(当数组为空时等于这个数组)    private static final Object[] EMPTY_ELEMENTDATA = {};//存值的数组    private transient Object[] elementData;//存值数组大小    private int size;//父类AbstructList继承下来的,记录修改次数    private int modCount构造函数://指定了大小就直接初始化成这个大小    public ArrayList(int initialCapacity) {super();if (initialCapacity < 0)throw new IllegalArgumentException("Illegal Capacity: "+   initialCapacity);this.elementData = new Object[initialCapacity];}//无参构造函数时使存值数组等于空数组public ArrayList() {super();this.elementData = EMPTY_ELEMENTDATA;}public ArrayList(Collection<? extends E> c) {elementData = c.toArray();size = elementData.length;if (elementData.getClass() != Object[].class)elementData = Arrays.copyOf(elementData, size, Object[].class);}插入的时候:public boolean add(E e) {//确保size+1小于存值数组大小ensureCapacityInternal(size + 1);  ------->private void ensureCapacityInternal(int minCapacity) {//当存值数组还是空的时候if (elementData == EMPTY_ELEMENTDATA) {    //最小容量等于 10与当前需要容量的较大值    minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);}        ensureExplicitCapacity(minCapacity);-------->    private void ensureExplicitCapacity(int minCapacity) {modCount++;//需要容量大于存值数组长度if (minCapacity - elementData.length > 0)    grow(minCapacity);-----------> private void grow(int minCapacity) {int oldCapacity = elementData.length;//简单点就是扩大1.5倍,当初始化时0*0/2=0,使得newCapacity - minCapacity < 0,所以大小直接等于10,跟详细的分析可以看后面//jdk1.6中是1.5倍+1int newCapacity = oldCapacity + (oldCapacity >> 1);if (newCapacity - minCapacity < 0)    newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)    newCapacity = hugeCapacity(minCapacity);elementData = Arrays.copyOf(elementData, newCapacity);    }    private static int hugeCapacity(int minCapacity) {if (minCapacity < 0) // overflow    throw new OutOfMemoryError();return (minCapacity > MAX_ARRAY_SIZE) ?    Integer.MAX_VALUE :    MAX_ARRAY_SIZE;    }    }    }elementData[size++] = e;//很自信保证成功return true;    }    public void add(int index, E element) {rangeCheckForAdd(index);ensureCapacityInternal(size + 1);  // Increments modCount!!//对自身进行拷贝操作System.arraycopy(elementData, index, elementData, index + 1,size - index);elementData[index] = element;size++;    }