ArrayList总结
- 底层数组实现,使用默认构造方法初始化出来的容量是10
- 扩容的长度是在原长度基础上加二分之一
- 实现了RandomAccess接口,底层又是数组,get读取元素性能很好
- 线程不安全,所有的方法均不是同步方法也没有加锁,因此多线程下慎用
- 顺序添加很方便
- 删除和插入需要复制数组 性能很差(可以使用LinkindList)
ArrayList和Vector的区别
标准答案
- ArrayList是线程不安全的,Vector是线程安全的
- 扩容时候ArrayList扩0.5倍,Vector扩1倍
- 初始扩容值都为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接口下面