美文网首页Java程序优化
三、核心数据结构List

三、核心数据结构List

作者: 城市里永远的学习者 | 来源:发表于2018-11-21 17:56 被阅读0次

    下图为List核心数据结构

    image.png
    实现上的差异
    1.ArrayList和Vector采用数组实现,两类封装的操作都是对内部数组的操作,比如向数组动态添加、删除元素等;两者几乎使用了相同算法,只是ArrayList未对方法设置同步,Vector是使用了线程同步方法,而且性能差异很小。
    2.LinkedList采用了双向链表实现,由一系列的表项组成。一个表项包括:元素内容、前驱表项、后驱表项,无论LinkedList是否为空,都有一个header表项,即是开始也是结尾,header的后驱就是链表的第一个元素,前驱就是最后一个元素。
    image.png
    适用场景
    1.末尾追加元素:
    如果是在末尾追加元素操作,ArrayList是很快的,但是有可能会涉及到扩容并进行数组复制调用System.arrayCopy(),所以效率还是相当高的;LinkedList由于是数组加双向链表,直接将header元素指向新元素即可,但是由于数组里存的Entry,所以会额外增加内存消耗
    2.添加元素到任意位置
    由于ArrayList是数组,所以会进行数组复制,而且越靠前,要复制的数组元素就越多,当往一个元素个数很多的ArrayList添加到任意位置时,很比较慢;而LinkedList不存在这个问题,和在尾部插入是一样的时间消耗
    3.删除某位置元素
    同2
    4.遍历元素
    ArrayList基于数组实现,随机访问的速度很快,在遍历List时可以优先考虑使用随机访问,但对于linkedList基于链表实现的,随机访问性能非常差,要避免。

    相关文章

      网友评论

        本文标题:三、核心数据结构List

        本文链接:https://www.haomeiwen.com/subject/rfpcqqtx.html