• ArrayList,LinkedList,Vector的区别


    ArrayList总结
    1. 底层数组实现,使用默认构造方法初始化出来的容量是10
    2. 扩容的长度是在原长度基础上加二分之一
    3. 实现了RandomAccess接口,底层又是数组,get读取元素性能很好
    4. 线程不安全,所有的方法均不是同步方法也没有加锁,因此多线程下慎用
    5. 顺序添加很方便
    6. 删除和插入需要复制数组 性能很差(可以使用LinkindList)

    ArrayList和Vector的区别

    标准答案
    1. ArrayList是线程不安全的,Vector是线程安全的
    2. 扩容时候ArrayList扩0.5倍,Vector扩1倍
    3. 初始扩容值都为10

    那么问题来了

    ArrayList有没有办法线程安全?

    Collections工具类有一个synchronizedList方法

    可以把list变为线程安全的集合,但是意义不大,因为可以使用Vector

    Vector为什么是线程安全的?

    老实讲,抛开多线程 它俩区别没多大,但是多线程下就不一样了,因为Vector的关键方法都使用了synchronized修饰。

    LinkedList 是双向列表。根据index处于前半段还是后半段,来判断已头结点还是尾结点为起来来遍历,来获得当前index所代表的值

    • 链表批量增加,是靠for循环遍历要添加的数组,依次执行插入节点操作。对比ArrayList是通过System.arraycopy完成批量增加的。增加一定会修改modCount。
    • 通过下标获取某个node 的时候,(add select),会根据index处于前半段还是后半段 进行一个折半,以提升查询效率

    • 删也一定会修改modCount。 按下标删,也是先根据index找到Node,然后去链表上unlink掉这个Node。 按元素删,会先去遍历链表寻找是否有该Node,如果有,去链表上unlink掉这个Node。

    • 改也是先根据index找到Node,然后替换值。改不修改modCount。
    • 查本身就是根据index找到Node。
    • 所以它的CRUD操作里,都涉及到根据index去找到Node的操作。
    他还提供了 List 接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆,栈、队列和双向队列使用,因为它还是实现了Deque接口,而Deque接口同时继承了Queue接口
    而Queue队列接口也同属于Collection接口下面



  • 相关阅读:
    webpack学习之——模块(Modules)
    dns-prefetch对网站速度能提升有多少?详解dns-prefetch。
    类数组对象汇总
    HTML input type=file文件选择表单的汇总(二)
    238. 除自身以外数组的乘积
    1029.两地调度
    滑动窗口:无重复字符的最长子串
    统计网格中的矩形以及正方形
    关于正负数的二进制新发现以及求法
    基础练习: 矩阵乘法
  • 原文地址:https://www.cnblogs.com/nyhhd/p/12655119.html
Copyright © 2020-2023  润新知