java linkedlist性能,Java ArrayList 与 LinkedList性能对比

ArrayList是如何插入、删除数据的?

image.png

1.当插入一个data的时候会先检查数组是否需要扩容。

扩容的机制并不是说我需要添加N个数据 我就扩N个位置,而是有默认大小10个长度,当位置不够时通过位运算扩大1.5倍。因此当存放大量数据时,每次扩容都会消耗很多资源。

具体请参考(https://www.cnblogs.com/baichunyu/p/12965241.html)

扩容代码.png

2.数据复制与赋值

System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);

将data后面的数据G、H、I进行复制并赋值到后面一位并将data赋值到指定位置

image.png

这样就完成了一次add,当我们插入的数据后面数据越多就会越消耗性能,越慢。删除也是同理。

LinkedList是如何插入、删除数据的?

LinkedList是典型的链表设计(双向链表)

链表设计图.png

每个数据都包含了本数据和上一个数据的指针与下一个数据的指针。

LinkedList.Node.class

private static class Node {

E item;

Node next;

Node prev;

Node(Node prev, E element, Node next) {

this.item = element;

this.next = next;

this.prev = prev;

}

}

当你需要添加数据时,只需要将数据填入链表,并修改对应数据的指针既可以实现。

总结

由此可见,当需要插入数据时,LinkedList的性能是优于ArrayList的。

相反,当你需要查询数据的时候,ArrayList是更快的,因为ArrayList是数组,直接通过下标就可以访问到,而链表需要你循环找到位置。

你可能感兴趣的:(java,linkedlist性能)