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



原文地址:https://www.cnblogs.com/nyhhd/p/12655119.html