力扣 外传之数据结构java篇
本文为笔者数据结构部分笔记
笔者根据数据结构理论加上最近刷题整理了一套 数据结构理论加常用方法以下为该文章:
力扣外传之数据结构(一篇文章搞定数据结构)
Java 数据结构概述
Java 提供了丰富的数据结构实现,主要通过 java.util
包中的集合框架(Collections Framework)提供。这些数据结构可分为以下几类:
线性数据结构
-
数组(Array)
- 固定大小,通过索引访问元素。
- 示例代码:
int[] arr = new int[5]; arr[0] = 10;
-
ArrayList
- 动态数组,支持自动扩容。
- 示例代码:
ArrayList<String> list = new ArrayList<>(); list.add("Java");
-
LinkedList
- 双向链表实现,适合频繁插入/删除操作。
- 示例代码:
LinkedList<Integer> linkedList = new LinkedList<>(); linkedList.add(1);
-
Stack
- 后进先出(LIFO)结构,继承自
Vector
。 - 示例代码:
Stack<String> stack = new Stack<>(); stack.push("A");
- 后进先出(LIFO)结构,继承自
-
Queue
- 先进先出(FIFO)接口,常用实现类为
LinkedList
或PriorityQueue
。 - 示例代码:
Queue<Integer> queue = new LinkedList<>(); queue.offer(10);
- 先进先出(FIFO)接口,常用实现类为
树形数据结构
-
TreeSet
- 基于红黑树实现的有序集合,元素唯一且自动排序。
- 示例代码:
TreeSet<Integer> treeSet = new TreeSet<>(); treeSet.add(5);
-
TreeMap
- 基于红黑树的键值对结构,按键排序。
- 示例代码:
TreeMap<String, Integer> treeMap = new TreeMap<>(); treeMap.put("Key", 100);
哈希表相关
-
HashSet
- 基于哈希表的无序集合,元素唯一。
- 示例代码:
HashSet<String> hashSet = new HashSet<>(); hashSet.add("Java");
-
HashMap
- 基于哈希表的键值对结构,允许
null
键和值。 - 示例代码:
HashMap<String, Integer> map = new HashMap<>(); map.put("A", 1);
- 基于哈希表的键值对结构,允许
-
LinkedHashMap
- 保留插入顺序的哈希表。
- 示例代码:
LinkedHashMap<String, Integer> linkedMap = new LinkedHashMap<>(); linkedMap.put("B", 2);
堆结构
- PriorityQueue
- 基于优先级的堆实现,默认最小堆。
- 示例代码:
PriorityQueue<Integer> pq = new PriorityQueue<>(); pq.offer(3);
选择数据结构的准则
- 随机访问:优先使用
ArrayList
。 - 频繁插入/删除:选择
LinkedList
。 - 键值存储:
HashMap
(无序)或TreeMap
(有序)。 - 去重需求:
HashSet
或TreeSet
。 - 线程安全:考虑
ConcurrentHashMap
或CopyOnWriteArrayList
。
注意事项
- 使用泛型(如
ArrayList<String>
)避免类型转换错误。 - 注意
HashMap
的负载因子和扩容机制对性能的影响。 - 树形结构的操作时间复杂度通常为 O(log n),而哈希表为 O(1)。
Java 数据结构概述
Java 提供了丰富的数据结构实现,主要通过 java.util
包中的集合框架(Collections Framework)提供。这些数据结构可分为以下几类:
线性数据结构
-
数组(Array)
- 固定大小,通过索引访问元素。
- 示例代码:
int[] arr = new int[5]; arr[0] = 10;
-
ArrayList
- 动态数组,支持自动扩容。
- 示例代码:
ArrayList<String> list = new ArrayList<>(); list.add("Java");
-
LinkedList
- 双向链表实现,适合频繁插入/删除操作。
- 示例代码:
LinkedList<Integer> linkedList = new LinkedList<>(); linkedList.add(1);
-
Stack
- 后进先出(LIFO)结构,继承自
Vector
。 - 示例代码:
Stack<String> stack = new Stack<>(); stack.push("A");
- 后进先出(LIFO)结构,继承自
-
Queue
- 先进先出(FIFO)接口,常用实现类为
LinkedList
或PriorityQueue
。 - 示例代码:
Queue<Integer> queue = new LinkedList<>(); queue.offer(10);
- 先进先出(FIFO)接口,常用实现类为
树形数据结构
-
TreeSet
- 基于红黑树实现的有序集合,元素唯一且自动排序。
- 示例代码:
TreeSet<Integer> treeSet = new TreeSet<>(); treeSet.add(5);
-
TreeMap
- 基于红黑树的键值对结构,按键排序。
- 示例代码:
TreeMap<String, Integer> treeMap = new TreeMap<>(); treeMap.put("Key", 100);
哈希表相关
-
HashSet
- 基于哈希表的无序集合,元素唯一。
- 示例代码:
HashSet<String> hashSet = new HashSet<>(); hashSet.add("Java");
-
HashMap
- 基于哈希表的键值对结构,允许
null
键和值。 - 示例代码:
HashMap<String, Integer> map = new HashMap<>(); map.put("A", 1);
- 基于哈希表的键值对结构,允许
-
LinkedHashMap
- 保留插入顺序的哈希表。
- 示例代码:
LinkedHashMap<String, Integer> linkedMap = new LinkedHashMap<>(); linkedMap.put("B", 2);
堆结构
- PriorityQueue
- 基于优先级的堆实现,默认最小堆。
- 示例代码:
PriorityQueue<Integer> pq = new PriorityQueue<>(); pq.offer(3);
选择数据结构的准则
- 随机访问:优先使用
ArrayList
。 - 频繁插入/删除:选择
LinkedList
。 - 键值存储:
HashMap
(无序)或TreeMap
(有序)。 - 去重需求:
HashSet
或TreeSet
。 - 线程安全:考虑
ConcurrentHashMap
或CopyOnWriteArrayList
。
注意事项
- 使用泛型(如
ArrayList<String>
)避免类型转换错误。 - 注意
HashMap
的负载因子和扩容机制对性能的影响。 - 树形结构的操作时间复杂度通常为 O(log n),而哈希表为 O(1)。