简介
本文介绍Java的List的一些对比,包括:Array与ArrayList区别、ArrayList与LinkedList异同、List与Set区别。
ArrayList与LinkedList异同
相同点
- 线程安全:都是线程不安全的
- 顺序:都是按照存入的顺序取出
不同点
项 | ArrayList | LinkedList |
实现方式 | 基于数组。 | 基于链表。 |
随机访问 | 支持随机访问。(实现了RandomAccess 接口) | 不支持随机访问。 |
插入效率 | 插入效率比较低(需要扩容时效率会变低)。 | 插入效率比较高(删除不一定高)。 |
时间复杂度 | get(int index) :O(1) add(E) (加到末尾) :O(1) add(index, E) :O(n) 后边元素需移动 remove(Object) :O(n) | get(int index) :O(n) add(E) (加到末尾):O(1) add(index, E) :O(n) 需要先查找到第几个元素 remove(Object) :O(n) |
使用场景 | 随机访问的场景。 | 插入很频繁的场景 用作:栈、队列或双向队列 |
List与Set区别
项 | List | Set |
重复 | 允许重复的对象(多个null也可以) | 不允许重复的对象(null也只能有一个) |
有序性 | 有序的。 保持了每个元素的插入顺序。即输出顺序就是输入顺序。 | 有序和无序都有。 HashSet:无法保证每个元素的存储顺序。 LinkedHashSet:按插入顺序存放。 |
数组与ArrayList区别
相同点
- 都具有索引(index)。即:可以通过index来直接获取和修改任意项。
- 他们所创建的对象都放在堆中。
- 都能够对自身进行枚举(因为都实现了IEnumerable接口)。
不同点
项 | 数组(Array) | ArrayList |
数据类型 | 可以是基本类型或对象类型。 | 只能是对象类型。 |
大小 | 大小是固定的,Array对象的初始化必须指定大小 | 大小是动态的 |
数据存放 | 连续存放 | 对象的引用是连续的,但对象本身在内存中的位置不一定连续。 |
插入与删除 | 不能够添加和删除其中的项 | 可以在任意位置插入和删除项。 |
效率 | 高 | 低 |
请先
!