ArrayList、 LinkedList、 Vector

ArrayList、 LinkedList、 Vector 的区别和实现原理。

ArrayList 和 Vector 只能按顺序存储元素(从下标为 0 的位置开始) , 删除元素的时候, 需要移位并置空, 默认初始容量都是 10。
ArrayList 和 Vector 基于数组实现的, LinkedList 基于双向循环链表实现的(含有头结点) 。

一.线程安全性

ArrayList 不具有线程安全性, 用在单线程环境中。 LinkedList 也是线程不安全的, 如果在并发环境下使用它们, 可以用 Colletions 类中的静态方法 synchronizedList()对ArrayList 和 LinkedList 进行调用即可。
Vector 是线程安全的, 即它的大部分方法都包含有关键字 synchronized。 Vector 的效率没有 ArrayList 和 LinkedList 高。

二.扩容机制

从内部实现机制来讲, ArrayList 和 Vector 都是使用 Objec 的数组形式来存储的。 当你向这两种类型中增加元素的时候, 若容量不够, 需要进行扩容。 ArrayList 扩容后的容量是之前的 1.5 倍, 然后, 把之前的数据拷贝到新建的数组。 Vector 默认情况下扩容后的容量是之前的 2 倍

Vector 可以设置容量增量, 而 ArrayList 不可以。 在 Vector 中有capacityIncrement:向量 的大小 大于 其容量 时, 容 量自动 增加的 量。 如果在 创建 Vector 时, 指定 了capacityIncrement 的大小; 则每次当 Vector 中动态数组容量需要增加时, 如果容量的增量大于零, 增加的大小都是 capacityIncrement。 如果容量的增量小于等于零, 则每次需要增
大容量时, 向量的容量将增大为之前的 2 倍。

可变长度数组的原理: 当元素个数超过数组的长度时, 会产生一个新数组, 将原数组的数据复制到新数组, 再将新的元素添加到新数组中。

三.增删查改的效率

ArrayList 和 Vector 中, 从指定的位置(用 index) 检索一个对象, 或在集合的末尾插入、 删除一个对象的时间是一样的, 可表示为 O(1)。 但是, 如果在集合的其他位置增加或移除元素那么花费的时间是 O(n) 。

LinkedList 中, 在插入、 删除集合中任何位置的元素所花费的时间都是一样的—O(1), 但它在索引一个元素的时候比较慢 O(n) 。

猜你喜欢

转载自blog.csdn.net/jcsyl_mshot/article/details/80196740