Java ArrayList和LinkedList-在最终实现细节处添加元素
我对arraylist比linkedlist快的原因的理解是,对于arraylist,您基本上只需要一个操作—更新数组元素末尾的引用,而对于链表,您需要做更多的操作,例如创建一个新节点,更新2个引用,浏览链接列表并更新最后一个节点以指向新节点等 然而,我不确定java如何实现这些。arraylist如何知道“last”元素在哪里,它是存储最后一个元素的值还是遍历数组并在最后一个元素之后添加新元素Java ArrayList和LinkedList-在最终实现细节处添加元素,java,arrays,collections,arraylist,linked-list,Java,Arrays,Collections,Arraylist,Linked List,我对arraylist比linkedlist快的原因的理解是,对于arraylist,您基本上只需要一个操作—更新数组元素末尾的引用,而对于链表,您需要做更多的操作,例如创建一个新节点,更新2个引用,浏览链接列表并更新最后一个节点以指向新节点等 然而,我不确定java如何实现这些。arraylist如何知道“last”元素在哪里,它是存储最后一个元素的值还是遍历数组并在最后一个元素之后添加新元素 和链表,它们是存储对列表中最后一个节点的引用,还是遍历整个列表直到结束?您可以随时查看java.*类
和链表,它们是存储对列表中最后一个节点的引用,还是遍历整个列表直到结束?您可以随时查看
java.*
类的源代码
但是,要回答您的特定问题:int
字段位于ArrayList
类中,它包含填充的内部数组区域的当前大小。当您在ArrayList
对象中添加新值时,此字段将递增,然后直接寻址到内部数组中的该元素。查看源:
:
:
public boolean add(E){
最后链接(e);
返回true;
}
无效链接last(E){
最终节点l=最后一个;
最终节点newNode=新节点(l,e,null);
last=newNode;
if(l==null)
第一个=新节点;
其他的
l、 next=newNode;
大小++;
modCount++;
}
数组列表仅在某些操作中更快。如果在数组中间添加元素,数组需要将所有数据基本复制到一个新数组中。只有在arraylist已经为新数据分配了空间的情况下,插入空数据(通常是在最后)时,arraylist的速度才会很快。按索引读取/更新非常快
LinkedList插入时速度很快,因为它从不需要复制整个数组。但是访问链表中的数据很慢,因为您需要“遍历”所有元素,直到找到要查找的元素为止 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<E> l = last;
final Node<E> newNode = new Node<>(l, e, null);
last = newNode;
if (l == null)
first = newNode;
else
l.next = newNode;
size++;
modCount++;
}