ArrayList内部是一个数组,和计数的size变量,以及一系列辅助他增加容量大小的属性。
初始默认的大小是空。后续添加时,原来是空的情况下,就一次扩DEFAULT_CAPACITY = 10 个大小,如果不是空的,那么就按照一定规则进行扩容。
删除元素时并不会缩小数组的大小,需要通过用trimToSize()这个方法来将数组缩到size大小
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);//大小涨到n+n/2
if (newCapacity - minCapacity < 0)//如果涨了之后达不到要求的大小,就需要多大是多大
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)//如果涨了之后的大小超过了最大容量Integer.MAX_VALUE - 8,就判断一下是否为负数或变成Integer.MAX_VALUE
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);//最后使用数组的方法扩容
}
public void trimToSize() {
modCount++;
if (size < elementData.length) {
elementData = (size == 0)
? EMPTY_ELEMENTDATA
: Arrays.copyOf(elementData, size);
}
}
LinkList是一个包涵size,first结点,last结点的结构,每一个节点都保存着当前的值,前一个结点和后一个结点。实现大致与链表无异。
List则是一个声明一些表结构基本功能的接口。
Vector实现的也是动态数组,但其与ArrayList的不同之处在于,他是线程安全的(在对数组进行操作的方法上都加了synchronized),他也可以控制对数组扩容的大小。
补充:
-
ArratList和数组的区别?
数组是定长的,ArrayList变长,但在支持扩容的同时对效率影响很大
-
default关键字
又称friendly()声明时没有加修饰符默认是friendly,且此关键字使得该方法在包内可见,同一包中的类都可以访问这个方法。
在接口方法前添加这个关键字可以使得这个接口的实现不必重写此方法也能好使。
Ps:接口中方法默认访问权限是public,类中方法默认访问权限是default
3. Transient关键字
在变量前加入此关键字可防止变量被序列化,一般用于较敏感的数据前使用。百度安全验证