java
jdk1.8
ArrayList优势:元素随机访问速度快我们知道ArrayList的底层数据结构是数组,这也就使得ArrayList特性上有了数组的的特征,对于数组来说,我们可以通过元素下标很轻松的一次性定位到元素,因此,这就使得ArrayList在元素的访问上具有大的优势。
ArrayList劣势:插入、删除元素速度慢由于其底层是数组,数组存入内存中是连续的存储空间,因此在进行插入和删除操作的时候,在插入位置,添加插入元素后,后面的位置下标需要向后面移动,删除操作时,删除元素位置后的下标都需要向前移动,这样执行的复杂程度随元素增多而增多,运行速度自然相对较慢如下在下标1插入一个元素:
LinkedList的优势:插入、删除操作速度快Linkedlist的底层数据结构是双向链表,由于链表以结点作为存储单元,这些存储单元可以是不连续的。每个结点由两部分组成:存储的数值+前序结点和后序结点的指针,在数据删除的时候,只需要将这个元素的前后指针删除,前一个元素的指针直接指向后一个数据就行,更改的只是指针地址,并不影响其他,因此,LinkedList在数据插入和删除时具有绝对优势。
LinkedList的劣势:随机访问速度慢同样,也是由于指针是需要一步一步向后移动的,直到找到需操作的节点,因此,在随机访问时,只能进行遍历,随着元素增多,遍历数据量越来越大,因此随机访问速度慢;如下图,如果要找3节点的data,必须从1节点next指针,然后找到2的next指针,再到节点3的next,才能取到节点3的data
利用程序示例测试ArrayList和LinkedList的访问速度:编程简单进行测试,调用get、add、remove方法,数据量为10000条,统计的数据是10000次调用方法的总耗时,单次无法比较差异;
运行结果如下:
减少数据量和统计1000次,此时只有几毫秒的差距,可以忽略不计,因此在数量较小,调用次数比较少时,两个线性表几乎没有差距,当达到10k量级以上才会有较大差距。以下是1000次的输出;
测试的都是多次调用综合起来的数据才能看出差距
在特定环境下,运算速度还与硬件如cpu运算有关,因此需要综合起来评估