zoukankan      html  css  js  c++  java
  • 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接口下面



  • 相关阅读:
    C语言初学者应该知道的(一)
    【文摘】中国IT从业者的职业——软件项目管理师
    只有荒凉的沙漠,没有荒凉的人生 ——黄渤
    定时更改桌面背景
    C语言初学者应该知道的(二)
    整理那些书
    Linux操作系统———李纳斯
    【c笔记】一个很好的编程题
    【c 笔记】windows的wsprintf不支持浮点型的%f
    【文摘】中国IT从业者的职业——软件测试员
  • 原文地址:https://www.cnblogs.com/nyhhd/p/12655119.html
Copyright © 2011-2022 走看看