没有合适的资源?快使用搜索试试~ 我知道了~
Java集合Collection接口List接口重复有序List接口的主要实现类,底层用数组实现优点访问速度快缺点插入和删除开销大:增加和删除元素时,需要对整个
资源详情
资源评论
资源推荐
将原数组里的元素复制到新数组里
JDK8
创建
初始时,底层数组的容量为0,当添加第一个元素时,才将数组容量设置为10
add:
private void rangeCheckForAdd(int index) {
if (index > size || index < 0)
throw new
IndexOutOfBoundsException(outOfBoundsMsg(index));
}
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData,
minCapacity));
}
private void ensureExplicitCapacity(int minCapacity) {
// 记录list被结构化修改的次数
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
/* void add(index, element) */
public void add(int index, E element) {
// 如果要插入的位置超过现有数组元素长度,或者小于0,抛出异常
rangeCheckForAdd(index);
// 判断是否要扩容,增加modCount
ensureCapacityInternal(size + 1); // Increments modCount!!
// 把子数组移动到后面
System.arraycopy(elementData, index, elementData, index +
1,
size - index);
// 插入数组
elementData[index] = element;
// 数组元素大小++
size++;
}
/* boolean add(Element) */
public boolean add(E e) {
// 判断是否要扩容,modCount++
ensureCapacityInternal(size + 1); // Increments modCount!!
// 把新元素插入到现有元素后面
elementData[size++] = e;
// 返回 true
return true;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
扩容:和JDK7类似
2 LinkedList
用双向链表存储元素
add():
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
// 设置新的存储能力为原来的1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
// 扩容之后仍小于最低存储要求minCapacity
if (newCapacity - minCapacity < 0)
//
newCapacity = minCapacity;
// 扩容后超过了最大容量 MAX_ARRAY_SIZE = Integer.MAX_VALUE -
8,
if (newCapacity - MAX_ARRAY_SIZE > 0) //private static
final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
transient int size = 0;
// 头节点
transient Node<E> first;
// 尾节点
transient Node<E> last;
1
2
3
4
5
void linkLast(E e) {
// 获取尾节点
final Node<E> l = last;
// 创建新节点
final Node<E> newNode = new Node<>(l, e, null);
// 把最后一个节点指向新插入的节点
last = newNode;
// 如果新节点前面一个节点为空,说明现在的LinkedList是空的
if (l == null)
// 把头节点指向新节点
first = newNode;
else
// 否则,把新节点插入到前一个节点后面
l.next = newNode;
// size++
size++;
// 记录列表改变的次数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
剩余12页未读,继续阅读
断脚的鸟
- 粉丝: 19
- 资源: 301
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0