java linkedlist 数组_关于数组:Java ArrayList和LinkedList – 在最终实现细节中添加元素...

我对arraylist比链表更快的理解是,使用arraylist你基本上只需要一个动作 - 更新end数组元素的引用,而使用链表你必须做更多的事情,例如 创建一个新节点,更新2个引用,浏览链表并更新最后一个节点以指向新节点等。

但是我不确定java如何实现这些。 arraylist如何知道"last"元素的位置,它是存储最后一个元素的值还是遍历数组并在最后一个元素之后添加一个新元素?

和链表一样,它们是否存储了对列表中最后一个节点的引用,还是它们遍历整个列表以达到目的?

JDK附带了源代码。 读它们,你会发现的。

看看来源:

数组列表:

public boolean add(E e) {

ensureCapacityInternal(size + 1);  // Increments modCount!!

elementData[size++] = e;

return true;

}

链表:

public boolean add(E e) {

linkLast(e);

return true;

}

void linkLast(E e) {

final Node l = last;

final Node newNode = new Node<>(l, e, null);

last = newNode;

if (l == null)

first = newNode;

else

l.next = newNode;

size++;

modCount++;

}

数组列表仅在某些操作中更快。如果在数组中间添加元素,则arraylist需要将所有数据基本复制到新数组中。只有当arraylist已经为新数据分配了空间时,在数据为空时(通常在最后)插入数据时才会很快。按索引读取/更新速度非常快。

LinkedList在插入时很快,因为它永远不需要复制整个数组。但访问链接列表中的数据很慢,因为您需要"遍历"所有元素,直到您找到要查找的元素。

您始终可以查看java.*类的来源。

但是,特别回答你的问题:ArrayList类中有int字段,其中包含填充内部数组区域的当前大小。在ArrayList对象中添加新值时,此字段会递增,然后直接寻址到内部数组中的该元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值