ArrayList源码(一)

来源:互联网 发布:中航微电子重庆 知乎 编辑:程序博客网 时间:2024/06/17 04:18
public class ArrayList<E> extends AbstractList<E>        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
底层使用数组
private transient Object[] elementData;
java 的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,
序列化对象的时候,这个属性就不会序列化到指定的目的地中。
transient关键字只能修饰变量,而不能修饰方法和类。一个静态变量不管是否被transient修饰,均不能被序列化
private static final int DEFAULT_CAPACITY = 10;

默认的初始容量为10

有三个构造函数

一。自定义长度的 public ArrayList(initialCapacity)

二。默认长度10, public ArrayList()

三。构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的

 public ArrayList(Collection<? extends E> c) {        elementData = c.toArray();        size = elementData.length;        // c.toArray might (incorrectly) not return Object[] (see 6260652)        if (elementData.getClass() != Object[].class)            elementData = Arrays.copyOf(elementData, size, Object[].class);    }

重点聊一下这个吧,这边我看到有人说不懂为什么这边要判断
是因为toArray返回的不一定是一个object的,
如:List<String> strList= Arrays.asList("abc")
 Object[] strList=stringList.toArray();
 System.out.println(strList.getClass());
 这边返回的是class java.lang.String
 判断以后复制数组
 延伸:System.arraycopy() 和 Arrays.copyOf()的区别

数组扩容

private void ensureExplicitCapacity(int minCapacity) {        modCount++;        // overflow-conscious code        if (minCapacity - elementData.length > 0)            grow(minCapacity);    } private void grow(int minCapacity) {        // overflow-conscious code        int oldCapacity = elementData.length;        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:        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;    }

grow中有这样的一行
int newCapacity = oldCapacity + (oldCapacity >> 1);

位移运算符:>>(带符号右移),

表示的是新的数组扩容为原来的1.5倍的大小
但是有一个限制,表示的是要分配的数组的最大大小;

private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;

如果超过这个大小,会报OutOfMemoryError的异常。那么就要使用MAX_ARRAY_SIZE的长度


在方法里面有一个modCount++,

这个属性是AbstractList中的

 protected transient int modCount = 0;


 表示的是这个list的结构已经被修改过的次数; 具体解释

ArrayList 还给我们提供了将底层数组的容量调整为当前列表保存的实际元素的大小的功能。
它可以通过 trimToSize() 方法来实现。该方法可以最小化 ArrayList 实例的存储量

public void trimToSize() {        modCount++;        if (size < elementData.length) {            elementData = Arrays.copyOf(elementData, size);        }    }


原创粉丝点击