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接口下面



  • 相关阅读:
    Redis数据库
    python的web运用
    python对 if __name__=='__main__'的理解
    python的函数
    python的四种内置数据结构
    python的循环和选择
    关于oracle设置主键自增的问题
    用HttpClient和用HttpURLConnection做爬虫发现爬取的代码少了的问题
    ORACLE not available如何解决
    集合(下)
  • 原文地址:https://www.cnblogs.com/nyhhd/p/12655119.html
Copyright © 2011-2022 走看看