赞
踩
低层由object数组实现,但是这个数组是动态的
modCount++(在迭代的过程中或者)是用于在多线程环境检测结构是否发生变化的,变了会抛出ConcurrentModificationException异常
插入元素时,先检测长度是否等于elementData数组的长度,等于就调用grow()
minCapacity(最小扩容后容量)这里新增一个所以要加一
Arrays.copyOf将原来的数组拷贝给扩容后的新数组,底层使用的是System.arraycopy
调用newCapacity获取扩容后的新容量
oldCapacity为没扩容时的容量
newCapacity为新容量,大小为oldCapacity+1.5倍左右的oldCapacity(>>向右移一位,位运算效率高)
如果newCapacity比minCapacity(最小扩容量)小,直接返回minCapacity(即扩容后为minCapacity大小)
并且如果elementData为DEFAULTCAPACITY_EMPTY_ELEMENTDATA(即默认的空数组),就取与DEFAULT_CAPACITY(默认容量)中大的那个返回
minCapacity<0不知道为啥,之前if -minCapacity为负不久不能进了,还是说newCapacity和minCapacity都能为负数,直接就oom了
如果newCapacity比minCapacity大,判断newCapacity和MAX_ARRAY_SIZE[=Integer.MAX_VALUE - 8(这个减8是为了容错性)],小于返回newCapacity,如果比MAX_ARRAY_SIZE都大则调用
hugeCapacity
newCapacity没法扩这么大,只能扩minCapacity这个大小了
判断minCapacity和MAX_ARRAY_SIZE,如果还是比MAX_ARRAY_SIZE大,直接返回Integer的最大值(都给你吧QAQ),没有MAX_ARRAY_SIZE就返回MAX_ARRAY_SIZE
Q1:为啥容1.5倍左右
来源
1.k=1.5时,就能充分利用前面已经释放的空间。如果k >= 2,新容量刚刚好永远大于过去所有废弃的数组容量
2.>>1刚好是1.5倍左右,方便
Q2:ensureCapacity
当插入大量数据时,使用ensureCapacity预先设置扩容大小,可以提高效率,减少扩容消耗的时间
双向链表实现
每一个node节点都是一个对象,包含一个prev(前)指针,next(后)指针,数据区
数组,类似arrylist,但是方法有synchroniz修饰
ArrayList由动态数组实现(数组存放在内存整块),适合下标访问(快速随机访问),查询快;不保证线程安全
时间消耗在:新增时如果在中间位置插入,后面的数组下标需要改变;扩容
如果对arraylist指定合适的初始容量,采用尾插法新增数据可以大幅提升性能
LinkedList由双向链表实现(链表每块位于随机位置),适合插入和删除;不保证线程安全
在插入大量对象时,会创建大量node节点,效率会降低
使用Iterator遍历,如果使用for循环遍历性能低(for循环由下标访问)
在linkedlist使用indexOf会遍历链表,效率低
ArrayList 是 List 的主要实现类,适用于频繁的查找工作,线程不安全
Vector 是 List 的古老实现类,线程安全的
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。