LinkedList
基本概念
LinkedList
是一个双向链表的实现类,它实现了 List
、Deque
、Queue
和 Cloneable
接口,底层使用双向链表结构,适合频繁插入和删除操作。
主要特点
-
有序,可重复。
-
查询速度较慢,插入/删除速度较快(相较于
ArrayList
)。 -
允许
null
元素。 -
线程不安全,效率高于
Vector
。
常用方法
方法 | 描述 |
---|---|
add(E e) |
在末尾添加元素 |
add(int index, E element) |
在指定位置插入元素 |
remove(int index) |
删除指定位置元素 |
get(int index) |
获取指定位置元素 |
getFirst() / getLast() |
获取第一个 / 最后一个元素 |
removeFirst() / removeLast() |
删除第一个 / 最后一个元素 |
offer(E e) |
添加到队列末尾 |
poll() |
弹出队列头部元素 |
适用场景
-
频繁增删元素的场景,如队列、栈的实现。
-
实现双向队列(Deque)。
JAVA中实现队列
// 创建单向链表
LinkedList<String> list = new LinkedList<>();
// 添加元素
list.push("元素1");
list.push("元素2");
list.push("元素3");
// 遍历链表
System.out.println("未移除的链表元素:" + list);
//移除元素 最新添加的元素
list.remove();
// 遍历链表
System.out.println("移除最新元素后的链表元素:" + list);
//创建双向链表
LinkedList<String> queue = new LinkedList<>();
queue.offer("元素A");
queue.offer("元素B");
queue.offer("元素C");
// 遍历双向链表
System.out.println("链表元素:" + queue.poll()); // 获取并移除头部元素
Vector
基本概念
Vector
是一种动态数组的实现,线程安全,是 Java 早期的集合类之一。它实现了 List
接口。
主要特点
-
底层是数组,支持快速随机访问。
-
增长方式为:容量不足时,扩容为原来的 2 倍。
-
线程安全 :所有方法都是同步(synchronized)方法,效率比
ArrayList
低。 -
允许
null
元素。
常用方法
方法 | 描述 |
---|---|
add(E e) |
添加元素到末尾 |
add(int index, E element) |
在指定位置插入 |
remove(int index) |
移除指定位置元素 |
get(int index) |
获取指定索引元素 |
size() |
获取大小 |
capacity() |
当前容量 |
trimToSize() |
将容量调整为当前大小,节省内存 |
ensureCapacity(int minCapacity) |
确保最小容量 |
适用场景
-
多线程并发环境中需要使用线程安全的 List。
-
遗留系统或兼容旧代码(现代开发中很少使用)。
总结对比
Set相关知识
Set
是 Java 集合框架中一个 不允许重复元素 的集合接口。
它的常见实现类包括:
-
✅
HashSet
:基于哈希表,无序,查找/插入快。 -
✅
TreeSet
:基于红黑树,有序,可排序。 -
✅
LinkedHashSet
:有插入顺序,内部基于 HashSet + 双向链表。
HashSet
HashSet
是一个基于 HashMap
实现的 Set,底层使用哈希表来存储元素,不保证元素顺序。
public HashSet() {
map = new HashMap<>();
}
实际上每个元素都作为 HashMap
的 key 存储,value 是一个固定对象 PRESENT
。
添加元素时,先调用 hashCode()
→ 再调用 equals()
判断是否重复。
时间复杂度:增删查为 O(1) (理想状态下),HashSet 无序的原因是:元素存储在哈希桶中,位置取决于 hashCode
。
Set<String> set = new HashSet<>();
// 添加元素
set.add("Hello");
set.add("World");
set.add("!!");
//遍历元素
for (String s : set) {
System.out.println(s);
}
TreeSet
TreeSet
是一个有序的 Set ,底层基于 红黑树 (自平衡二叉搜索树),元素自动按排序顺序 排列,不允许重复元素。
Set<Integer> treeSet = new HashSet<>();
// 添加元素
treeSet.add(5);
treeSet.add(9);
treeSet.add(3);
treeSet.add(1);
treeSet.add(7);
// 遍历元素
treeSet.forEach(System.out::println);
特性 | HashSet | TreeSet |
---|---|---|
元素是否排序 | ❌ 无序 | ✅ 自动排序 |
底层结构 | HashMap | TreeMap(红黑树) |
插入复杂度 | O(1) | O(log n) |
是否允许 null | ✅ 允许一个 | ⚠️ 最多允许一个(仅在无 Comparator 情况下) |
是否线程安全 | ❌ 否 | ❌ 否 |
特性 | LinkedList | Vector |
---|---|---|
底层结构 | 双向链表 | 动态数组 |
是否线程安全 | 否 | 是 |
插入删除效率 | 高 | 低 |
随机访问效率 | 低 | 高 |
是否过时 | 否 | 是(被 ArrayList + Collections.synchronizedList() 替代) |
适用场景 | 队列、栈等 | 多线程旧代码中使用 |