Java 容器常用操作与实现详解
ArrayList 排序实践
利用 Collections.sort() 可对实现了 Comparable 接口的元素进行升序排列。若需自定义规则,可传入 Comparator 参数。
public static void main(String[] args) {
List<Integer> nums = new ArrayList<>();
nums.add(20);
nums.add(10);
nums.add(16);
nums.add(14);
Collections.sort(nums);
System.out.println("升序: " + nums); // [10, 14, 16, 20]
nums.sort(Comparator.comparingInt(Integer::intValue).reversed());
System.out.println("降序: " + nums); // [20, 16, 14, 10]
}
针对自定义实体,通过属性指定排序字段:
public static void main(String[] args) {
List<Employee> staff = new ArrayList<>();
staff.add(new Employee("Alice", 28));
staff.add(new Employee("Bob", 22));
staff.add(new Employee("Carol", 25));
staff.sort(Comparator.comparing(Employee::getAge));
System.out.println("按年龄升序: " + staff);
staff.sort(Comparator.comparing(Employee::getAge).reversed());
System.out.println("按年龄降序: " + staff);
}
极值获取
Stream API 提供了简洁的极值计算方式,也可通过排序后取边界值:
public static void main(String[] args) {
List<Integer> values = Arrays.asList(1, 2, 3);
int smallest = values.stream().min(Integer::compare).orElseThrow();
int largest = values.stream().max(Integer::compare).orElseThrow();
System.out.println(smallest + ", " + largest);
values.sort(Integer::compare);
System.out.println(values.get(0) + ", " + values.get(values.size() - 1));
}
TreeSet 有序去重
TreeSet 基于 TreeMap 实现,可自动维持元素有序性。元素要么实现 Comparable,要么在构造时传入 Comparator,否则抛出异常。注意:元素不可为 null。
private static void demoTreeSet() {
Set<Integer> reversed = new TreeSet<>(Comparator.reverseOrder());
reversed.add(20);
reversed.add(10);
reversed.add(16);
reversed.add(14);
System.out.println(reversed); // [20, 16, 14, 10]
}
LinkedHashSet 与 LinkedHashMap
两者均保留插入顺序,前者用于去重集合场景,后者用于需要按插入顺序遍历键值对的场景。
Queue 接口核心方法
队列遵循 FIFO 原则,标准库定义了两套语义的方法:
| 操作 | 抛出异常 | 返回特殊值 |
|---|---|---|
| 入队 | add(E) | offer(E) → false |
| 出队 | remove() | poll() → null |
| 查看队首 | element() | peek() → null |
Deque 双端队列
支持两端高效插入与移除,推荐显式使用 First/Last 后缀方法增强可读性。
public static void main(String[] args) {
Deque<Integer> deque = new ArrayDeque<>();
deque.offerLast(1);
deque.offerFirst(2);
deque.offerLast(3);
System.out.println(deque); // [2, 1, 3]
System.out.println(deque.peekFirst()); // 2
System.out.println(deque.pollLast()); // 3
System.out.println(deque); // [2, 1]
}
ArrayDeque vs LinkedList
ArrayDeque不允许 null 元素,LinkedList允许LinkedList节点额外存储前后指针,内存开销更大- 作为队列/双端队列时,
ArrayDeque通常性能更优
Deque 实现栈结构
优先选用 Deque 替代遗留的 Stack 类,后者继承自 Vector,方法均带同步开销。
public static void main(String[] args) {
Deque<String> stack = new ArrayDeque<>();
stack.push("First");
stack.push("Second");
stack.push("Third");
System.out.println(stack); // [Third, Second, First]
System.out.println(stack.peek()); // Third
System.out.println(stack.pop()); // Third
}
PriorityQueue 优先级调度
内部基于堆实现,poll() 按优先级出队。iterator() 不保证有序,需出队或转数组后查看。
public static void main(String[] args) {
PriorityQueue<Integer> pq = new PriorityQueue<>();
pq.add(12);
pq.add(2);
pq.add(14);
pq.add(10);
while (!pq.isEmpty()) {
System.out.print(pq.poll() + " "); // 2 10 12 14
}
}
EnumSet 枚举专用集合
专为枚举类型优化的高性能集合,内部以位向量实现,空间与时间效率均优于 HashSet。配合 EnumMap 使用,适用于枚举值作为关键字的场景。