集合框架整体架构图
面试官翻到简历上"熟悉 Java 集合框架",开口问道:
"Java 集合框架的整体架构是什么样的?Iterable 和 Collection 是什么关系?Map 和 Collection 又是并列的吗?"
候选人小杨支支吾吾:"呃... Collection 是集合的根接口... Map 应该也算一种集合吧?"
面试官没说话,继续问:"那你说说,ArrayList、LinkedList、Vector 的区别是什么?HashMap 和 Hashtable 呢?"
小杨开始语无伦次地背诵...
【面试官心理】
这道题看似简单,实际上是在测试候选人对 Java 集合框架的整体认知。能画出一张完整的架构图,说清楚各接口和实现类的关系,才是真正理解了 Java 集合的设计思想。
一、整体架构图
graph TD
subgraph 根接口
A["Iterable<T><br/>🔑 可迭代接口"]
end
subgraph Collection 根接口
A --> B["Collection<E>"]
B --> C["List<E>"]
B --> D["Set<E>"]
B --> E["Queue<E>"]
end
subgraph Map 根接口
F["Map<K, V>"]
F --> G["SortedMap<K, V>"]
G --> H["NavigableMap<K, V>"]
end
subgraph List 实现
C --> I["AbstractList"]
C --> J["AbstractSequentialList"]
I --> K["ArrayList"]
I --> L["Vector"]
L --> M["Stack"]
J --> N["LinkedList"]
end
subgraph Set 实现
D --> O["AbstractSet"]
O --> P["HashSet"]
O --> Q["TreeSet"]
O --> R["LinkedHashSet"]
end
subgraph Queue 实现
E --> S["AbstractQueue"]
E --> T["Deque<E>"]
T --> N
S --> U["ArrayDeque"]
S --> V["PriorityQueue"]
end
subgraph Map 实现
F --> W["AbstractMap"]
W --> X["HashMap"]
W --> Y["TreeMap"]
W --> Z["LinkedHashMap"]
X --> AA["Hashtable"]
end
二、核心接口详解
2.1 Iterable —— 可迭代的根 🔴
public interface Iterable<T> {
Iterator<T> iterator();
default void forEach(Consumer<? super T> action);
default Spliterator<T> spliterator();
}
所有实现了 Iterable 的对象都可以用 for-each 循环遍历。
for (String s : list) {
System.out.println(s);
}
Collection 继承了 Iterable:
public interface Collection<E> extends Iterable<E> {
boolean add(E e);
boolean remove(Object o);
boolean contains(Object o);
int size();
boolean isEmpty();
void clear();
Iterator<E> iterator();
}
2.2 List —— 有序可重复 🔴
public interface List<E> extends Collection<E> {
E get(int index);
E set(int index, E element);
void add(int index, E element);
E remove(int index);
int indexOf(Object o);
int lastIndexOf(Object o);
List<E> subList(int from, int to);
}
List 的三大实现对比:
2.3 Set —— 无序不重复 🔴
public interface Set<E> extends Collection<E> {
// Set 不允许重复元素
// 其他方法与 Collection 相同
}
Set 的三大实现对比:
2.4 Map —— 键值对映射 🔴
public interface Map<K, V> {
V put(K key, V value);
V get(Object key);
V remove(Object key);
boolean containsKey(Object key);
boolean containsValue(Object value);
int size();
Set<K> keySet();
Collection<V> values();
Set<Map.Entry<K, V>> entrySet();
}
Map 和 Collection 是并列关系!这不是继承关系,而是两个独立的根接口。
三、集合的继承关系速查表
Iterable
└── Collection
├── List
│ ├── AbstractList
│ │ ├── ArrayList
│ │ └── Vector
│ │ └── Stack
│ └── AbstractSequentialList
│ └── LinkedList
├── Set
│ ├── AbstractSet
│ │ ├── HashSet
│ │ │ └── LinkedHashSet
│ │ └── TreeSet
│ └── CopyOnWriteArraySet
└── Queue
├── AbstractQueue
│ ├── PriorityQueue
│ └── ArrayDeque
└── Deque
└── LinkedList
Map(独立体系)
├── AbstractMap
│ ├── HashMap
│ │ └── LinkedHashMap
│ ├── TreeMap
│ └── Hashtable
└── ConcurrentMap
└── ConcurrentHashMap
四、集合选择决策树
graph TD
A["需要存什么?"] --> B{"需要键值对映射?"}
B -->|是| C["Map"]
B -->|否| D["需要保持顺序?"]
D -->|是| E{"需要排序?"}
E -->|是| F["TreeSet / TreeMap"]
E -->|否| G["LinkedHashSet / LinkedHashMap"]
D -->|否| H["需要去重?"]
H -->|是| I["HashSet / HashMap"]
H -->|否| J["List"]
J --> K{"频繁插入删除?"}
K -->|是| L["LinkedList"]
K -->|否| M["ArrayList"]
五、常见误区 ⚠️
❌ 误区一:Map 继承了 Collection
错误:认为 Map extends Collection
正确:Map 和 Collection 是 Java 集合框架的两大分支,互相独立。
❌ 误区二:Vector 是 ArrayList 的线程安全版本
不完全正确:虽然 Vector 是线程安全的,但现在已经不推荐使用。如果需要线程安全,应该用 CopyOnWriteArrayList。
❌ 误区三:HashSet 可以存放重复元素
错误:HashSet 的 add() 方法底层调用 HashMap.put(),而 HashMap 的 key 是不允许重复的。
六、面试官心理
面试官问这道题,通常是想看你对 Java 集合框架有没有全局认知。能画出架构图、讲清楚继承关系的候选人,说明:
- 看过源码至少一遍
- 理解 Java 的设计模式(接口抽象、抽象类实现)
- 能在实际开发中正确选型