Java 常用数据结构完整教程
·
一、线性结构
1. 数组 Array
特点
固定长度、连续内存、查询快、增删慢,分一维数组、二维数组。
示例代码
java
运行
public class ArrayDemo {
public static void main(String[] args) {
// 1. 一维数组定义
int[] arr = {10, 20, 30, 40};
// 根据下标取值
System.out.println(arr[1]); // 20
// 遍历数组
for (int num : arr) {
System.out.print(num + " ");
}
// 2. 二维数组(矩阵)
int[][] matrix = {{1,2},{3,4}};
System.out.println("\n" + matrix[0][1]); // 2
}
}
核心解释
- 长度初始化后不可修改;
- 随机访问时间复杂度
O(1); - 中间插入 / 删除需要移动元素,
O(n); - 适合长度固定、频繁查询场景。
2. ArrayList 动态数组(List 实现)
特点
底层数组封装,自动扩容,有序可重复,查询快、中间增删慢。
示例代码
java
运行
import java.util.ArrayList;
public class ArrayListDemo {
public static void main(String[] args) {
// 创建集合
ArrayList<String> list = new ArrayList<>();
// 添加元素
list.add("Java");
list.add("MySQL");
list.add("Redis");
// 指定下标插入
list.add(1, "Spring");
// 获取元素
System.out.println(list.get(1)); // Spring
// 删除元素
list.remove("MySQL");
// 遍历
for (String s : list) {
System.out.print(s + " ");
}
// 获取长度
System.out.println("\n长度:" + list.size());
}
}
核心解释
- 默认容量 10,扩容规则:
原容量*1.5; - 允许
null、元素可重复、有序; - 尾部增删效率高,中间操作大量移位。
3. LinkedList 双向链表(List/Deque)
特点
底层双向链表,无扩容,头尾增删极快,随机查询慢。
示例代码
java
运行
import java.util.LinkedList;
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList<Integer> link = new LinkedList<>();
// 尾部添加
link.add(1);
// 头部添加
link.addFirst(0);
// 尾部添加
link.addLast(2);
System.out.println(link.getFirst()); // 0
System.out.println(link.getLast()); // 2
link.removeFirst(); // 删除头节点
System.out.println(link); // [1, 2]
}
}
核心解释
- 每个节点存
prev、value、next; - 头尾增删
O(1),按索引查找O(n); - 同时实现队列、双端队列接口,可做栈 / 队列。
4. Stack 栈(后进先出 LIFO)
特点
先进后出,Java 推荐用Deque代替老旧 Stack 类。
示例代码
java
运行
import java.util.Deque;
import java.util.LinkedList;
public class StackDemo {
public static void main(String[] args) {
Deque<String> stack = new LinkedList<>();
// 入栈
stack.push("A");
stack.push("B");
stack.push("C");
System.out.println(stack.peek()); // 取栈顶不删除 C
System.out.println(stack.pop()); // 出栈 C
System.out.println(stack); // [B, A]
}
}
核心解释
- push 入栈、pop 出栈、peek 查看栈顶;
- 适用场景:表达式求值、括号匹配、函数调用栈。
5. Queue 队列(先进先出 FIFO)
普通队列 LinkedList
java
运行
import java.util.LinkedList;
import java.util.Queue;
public class QueueDemo {
public static void main(String[] args) {
Queue<Integer> queue = new LinkedList<>();
queue.offer(1); // 入队
queue.offer(2);
queue.offer(3);
System.out.println(queue.peek()); // 队首 1
System.out.println(queue.poll()); // 出队 1
System.out.println(queue); // [2, 3]
}
}
优先级队列 PriorityQueue
自动元素排序,默认小顶堆
java
运行
import java.util.PriorityQueue;
import java.util.Queue;
public class PriorityQueueDemo {
public static void main(String[] args) {
Queue<Integer> pq = new PriorityQueue<>();
pq.add(5);
pq.add(2);
pq.add(8);
// 自动从小到大出队
while (!pq.isEmpty()) {
System.out.print(pq.poll() + " "); // 2 5 8
}
}
}
解释
- Queue:offer 入队、poll 出队、peek 队首;
- PriorityQueue:底层二叉堆,自定义对象需重写比较器。
二、哈希结构(无序、去重、键值映射)
1. HashSet 哈希集合(元素唯一,无序)
底层 HashMap,只存 key
java
运行
import java.util.HashSet;
import java.util.Set;
public class HashSetDemo {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("苹果");
set.add("香蕉");
set.add("苹果"); // 重复元素自动丢弃
System.out.println(set); // [苹果, 香蕉]
System.out.println(set.contains("香蕉")); // true
set.remove("香蕉");
}
}
解释
- 元素不可重复,无序;
- 增删查平均
O(1); - 自定义对象必须重写
equals()+hashCode()。
2. TreeSet 有序集合(红黑树)
自动升序去重
java
运行
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
TreeSet<Integer> treeSet = new TreeSet<>();
treeSet.add(9);
treeSet.add(3);
treeSet.add(6);
System.out.println(treeSet); // [3, 6, 9] 自动排序
}
}
解释
底层红黑树,查找、插入删除 O(logn);元素必须实现 Comparable。
3. HashMap 键值对哈希表(最常用)
java
运行
import java.util.HashMap;
import java.util.Map;
public class HashMapDemo {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
// 存键值
map.put("张三", 20);
map.put("李四", 22);
map.put("张三", 21); // 覆盖旧值
System.out.println(map.get("张三")); // 21
// 判断key是否存在
System.out.println(map.containsKey("李四"));
// 遍历键值对
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + "=" + entry.getValue());
}
}
}
核心解释
- JDK1.8 底层:数组 + 链表 + 红黑树;
- key 唯一,value 可重复,允许一个 null key、多个 null value;
- 负载因子 0.75,达到阈值自动扩容 2 倍;
- 平均读写
O(1)。
4. TreeMap 有序 Map(红黑树)
key 自动排序
java
运行
import java.util.TreeMap;
public class TreeMapDemo {
public static void main(String[] args) {
TreeMap<String, Integer> treeMap = new TreeMap<>();
treeMap.put("b", 2);
treeMap.put("a", 1);
System.out.println(treeMap); // {a=1, b=2}
}
}
5. LinkedHashMap / LinkedHashSet
保留插入顺序
java
运行
LinkedHashMap<String, Integer> linkMap = new LinkedHashMap<>();
linkMap.put("1",1);
linkMap.put("2",2);
System.out.println(linkMap); // 按插入顺序输出
三、树结构
1. 二叉树(自定义实现)
java
运行
// 树节点
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
public class BinaryTreeDemo {
// 中序遍历:左->根->右
public static void inOrder(TreeNode root) {
if (root == null) return;
inOrder(root.left);
System.out.print(root.val + " ");
inOrder(root.right);
}
public static void main(String[] args) {
// 构建二叉树
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
inOrder(root); // 2 1 3
}
}
解释
二叉树每个节点最多两个子节点;遍历分为前序、中序、后序、层序。
2. 二叉搜索树 BST
左子树 < 根 < 右子树,中序遍历有序,TreeSet/TreeMap 底层。
四、并发安全集合(多线程专用)
1. ConcurrentHashMap(线程安全 Map)
java
运行
import java.util.concurrent.ConcurrentHashMap;
public class ConcurrentMapDemo {
public static void main(String[] args) {
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("a", 1);
map.get("a");
}
}
解释
分段锁 / CAS,高并发性能远优于 Hashtable。
2. CopyOnWriteArrayList 线程安全 List
写时复制,读不加锁,适合读多写少场景。
java
运行
import java.util.concurrent.CopyOnWriteArrayList;
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
list.add("test");更多推荐
所有评论(0)