Java Collections Framework: List, Set, Map & Generics

ArrayList vs LinkedList, HashSet and TreeSet, HashMap internals, iteration, Comparable and Comparator, and how generics keep collections type-safe.

BeginnerUpdated 2026-10-2976K views

Collection Hierarchy

The Collections Framework sits in java.util. Collection has three main branches: List (ordered, allows duplicates), Set (no duplicates) and Queue; Map is a separate top-level interface for key-value pairs.

List<String> list = new ArrayList<>();     // 数组实现
Set<Integer> set = new HashSet<>();          // 哈希实现
Map<String, Integer> map = new HashMap<>(); // 哈希表实现
Queue<String> q = new LinkedList<>();       // 队列

// 工具类:不可变集合
List<String> fixed = List.of("a", "b");
Map<String, Integer> m2 = Map.of("x", 1, "y", 2);

List: ArrayList vs LinkedList

FeatureArrayListLinkedList
Backing storageDynamic arrayDoubly linked list
Random access get(i)O(1)O(n)
Insert/remove at headO(n)O(1)
Memory overheadLowHigh (node pointers)
Typical useRead-mostly lists, 90% of casesFrequent head/tail ops, deque
List<String> names = new ArrayList<>();
names.add("Java");
names.add(0, "Go");            // 指定位置插入
names.set(1, "Python");
names.remove("Go");
names.get(0);
names.size();
names.contains("Java");

Set and Map

HashSet gives O(1) add/contains but unordered; TreeSet keeps elements sorted (needs Comparable or Comparator). HashMap is the king of Map:桶数组 + 链表/红黑树 (a bucket array with a linked list that converts to a red-black tree at 8 entries).

Set<String> set = new HashSet<>();
set.add("mysql");
set.add("redis");
set.add("mysql");            // 重复元素被忽略
set.size();                    // 2

Map<String, Integer> map = new HashMap<>();
map.put("java", 1);
map.put("go", 2);
map.get("java");               // 1
map.getOrDefault("rust", 0);   // 0
map.containsKey("go");
map.forEach((k, v) -> System.out.println(k + "=" + v));

// 遍历 Map
for (var e : map.entrySet()) {
    System.out.println(e.getKey() + ": " + e.getValue());
}

Sorting and Generics

// 泛型保证类型安全
List<Integer> nums = new ArrayList<>();
nums.add(3); nums.add(1); nums.add(2);
Collections.sort(nums);                 // 自然序
nums.sort(Comparator.reverseOrder());   // 降序

// 按字段排序(Comparator 链)
List<User> users = new ArrayList<>();
users.sort(Comparator.comparing(User::getName)
                     .thenComparing(User::getId));

// Comparable:类自带排序规则
class User implements Comparable<User> {
    Long id; String name;
    public int compareTo(User o) { return id.compareTo(o.id); }
}
Use the diamond operator <> to avoid repeating type arguments, and never use raw types (List without generics) in new code — you lose compile-time type safety.

Friends & Partners