源码实现
public E get(int index) { //检查index Objects.checkIndex(index, size); //然后调用方法 return elementData(index); } E elementData(int index) { //直接下标取元素 return (E) elementData[index]; }很简单就不说了
remove
源码实现按照索引删除
public E remove(int index) { //检查index Objects.checkIndex(index, size); final Object[] es = elementData; //用于返回值 E oldValue = (E) es[index]; fastRemove(es, index); return oldValue; } private void fastRemove(Object[] es, int i) { modCount++; final int newSize; //去掉一个元素后的长度如果大于指定删除的索引的位置 if ((newSize = size - 1) > i) //把删除元素后面的元素往前挪一位 System.arraycopy(es, i + 1, es, i, newSize - i); //避免内存泄露 es[size = newSize] = null; }
源码实现按照对象删除
public boolean remove(Object o) { final Object[] es = elementData; final int size = this.size; int i = 0; //元素首次出现位置记录 //寻找元素的逻辑 found: { if (o == null) { for (; i < size; i++) if (es[i] == null) break found; } else { for (; i < size; i++) if (o.equals(es[i])) break found; } //到这代表没找到.返回false return false; } //找到了就按照下标删除 fastRemove(e s, i); return true; } indexOf
源码实现
public int indexOf(Object o) { return indexOfRange(o, 0, size); } int indexOfRange(Object o, int start, int end) { Object[] es = elementData; if (o == null) { for (int i = start; i < end; i++) { if (es[i] == null) { //寻找到首个想等元素的时候返回索引 return i; } } } else { for (int i = start; i < end; i++) { if (o.equals(es[i])) { //寻找到首个想等元素的时候返回索引 return i; } } } //未找到返回-1 return -1; }这个实现比较简单,并且ArrayList的一些*indexOf*类似的方法的大致思路都是如此的
writeObject
这是序列化的方法
private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException { //将操作次数记录 int expectedModCount = modCount; //将类中的no-static和no-transient属性写到流中 s.defaultWriteObject(); s.writeInt(size); //依次写出元素 for (int i=0; i<size; i++) { s.writeObject(elementData[i]); } //如果再次过程中数组中内容遭到改变,序列化停止并且抛出异常 if (modCount != expectedModCount) { throw new ConcurrentModificationException(); } } readObject
这是反序列化的方法
private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException { // 读取大小和其他的内容 s.defaultReadObject(); //读取容量 s.readInt(); //如果读取到size>0 if (size > 0) { // 与clone()一样,根据大小而非容量分配数组 SharedSecrets.getJavaObjectInputStreamAccess().checkArray(s, Object[].class, size); //创建存储数组 Object[] elements = new Object[size]; //依次将数据读出来并赋值 for (int i = 0; i < size; i++) { elements[i] = s.readObject(); } //然后赋值给本类的全局变量 elementData = elements; } else if (size == 0) { //size为0代表空集合,那么就直接使用常量替换 elementData = EMPTY_ELEMENTDATA; } else { //非法的,出异常 throw new java.io.InvalidObjectException("Invalid size: " + size); } }