Java常用数据结构操作方法全面总结
目录
- 一、List接口及其实现类
- 二、Set接口及其实现类
- 三、Map接口及其实现类
- 四、Queue/Deque队列
- 五、Stack栈
- 六、树形结构
- 七、注意事项与最佳实践
- 总结
一、List接口及其实现类
核心实现类
- ArrayList:基于动态数组
- LinkedList:基于双向链表
常用操作方法
List<String> list = new ArrayList<>();
// 增
list.add("元素"); // 末尾添加
list.add(0, "首位插入"); // 指定位置插入
// 删
list.remove(0); // 按索引删除
list.remove("元素"); // 按对象删除
// 查
String element = list.get(0); // 按索引获取
int index = list.indexOf("元素"); // 获取元素索引
// 改
list.set(0, "新值"); // 修改指定位置
// 遍历
for (String s : list) { /*...*/ }
list.forEach(System.out::println);
特点对比
- ArrayList:随机访问O(1),插入删除O(n)
- LinkedList:随机访问O(n),头尾操作O(1)
二、Set接口及其实现类
主要实现类
- HashSet:无序存储
- LinkedHashSet:保持插入顺序
- TreeSet:自动排序
常用操作
Set<Integer> set = new HashSet<>();
// 增
set.add(10); // 成功返回true
// 删
set.remove(10); // 成功返回true
// 查
boolean exists = set.contains(10);
// 遍历
Iterator<Integer> it = set.iterator();
set.forEach(e -> System.out.println(e));
特殊方法
// TreeSet专属方法
TreeSet<Integer> sortedSet = new TreeSet<>();
sortedSet.first(); // 获取最小元素
sortedSet.tailSet(50); // 获取≥50的子集
三、Map接口及其实现类
主要实现类
- HashMap:快速查找
- LinkedHashMap:保持插入顺序
- TreeMap:键值排序
基础操作
Map<String, Integer> map = new HashMap<>();
// 增/改
map.put("key", 100); // 返回旧值或null
// 删
map.remove("key"); // 返回被删值
// 查
int value = map.get("key"); // 不存在返回null
// 遍历
for (Map.Entry<String, Integer> entry : map.entrySet()) {
entry.getKey();
entry.getValue();
}
Java8+增强方法
map.getOrDefault("key", 0); // 安全获取
map.putIfAbsent("key", 100); // 不存在时插入
map.compute("key", (k,v) -> v+1); // 计算新值
四、Queue/Deque队列
常用实现类
- LinkedList:双端队列
- PriorityQueue:优先级队列
队列操作
Queue<String> queue = new LinkedList<>();
// 入队
queue.offer("元素"); // 推荐使用
queue.add("元素"); // 可能抛异常
// 出队
String head = queue.poll(); // 返回并移除头元素
String peek = queue.peek(); // 仅查看不移除
双端队列操作
Deque<String> deque = new ArrayDeque<>();
deque.offerFirst("头插");
deque.offerLast("尾插");
deque.pollFirst();
deque.pollLast();
五、Stack栈
推荐实现方式
Deque<Integer> stack = new ArrayDeque<>();
// 入栈
stack.push(1); // 等效addFirst()
// 出栈
int top = stack.pop(); // 等效removeFirst()
六、树形结构
TreeMap特殊方法
TreeMap<Integer, String> treeMap = new TreeMap<>();
// 范围查询
Map.Entry<Integer, String> lower = treeMap.lowerEntry(50); // 最大key<50的条目
SortedMap<Integer, String> subMap = treeMap.subMap(20, 80); // [20,80)区间
七、注意事项与最佳实践
-
线程安全
- 多线程环境使用
ConcurrentHashMap
、CopyOnWriteArrayList
Collections.synchronizedList()
包装非线程安全集合
- 多线程环境使用
-
性能考量
- 随机访问:优先ArrayList
- 频繁插入删除:考虑LinkedList
- 大数据量去重:使用HashSet
-
遍历删除陷阱
// 错误方式:会抛ConcurrentModificationException for (String s : list) { if(s.equals("del")) list.remove(s); } // 正确方式:使用迭代器 Iterator<String> it = list.iterator(); while(it.hasNext()){ if(it.next().equals("del")) it.remove(); }
-
空值处理
- HashMap允许null键/值
- TreeMap不允许null键
- ConcurrentHashMap完全禁止null