如何判断一个 List 是否有序?¶
结论¶
List 接口本身并不保证"有序"以外的任何排序语义。这里要区分两个概念:
- 有序(ordered):元素的存取顺序一致,遍历顺序等于插入顺序。这是
List接口的契约。 - 排序(sorted / sorted):元素按某种比较规则(如字典序、数值大小)排列。
判断"是否有序"要看具体实现类,而不是看引用类型是不是 List。
常见实现类的有序性¶
| 实现类 | 有序(插入顺序) | 排序(按比较规则) | 说明 |
|---|---|---|---|
ArrayList |
✅ | ❌ | 按插入顺序 |
LinkedList |
✅ | ❌ | 按插入顺序 |
Vector |
✅ | ❌ | 线程安全的动态数组 |
Stack |
✅ | ❌ | 继承 Vector |
CopyOnWriteArrayList |
✅ | ❌ | 并发场景 |
PriorityQueue |
— | ✅(堆序) | 不是 List,仅作对照 |
如何在运行时判断¶
// 1. 是否支持快速随机访问(内部是数组)
if (list instanceof RandomAccess) {
// 用普通 for + get(i) 遍历,比迭代器更快
} else {
// LinkedList 等,用迭代器或 for-each
}
// 2. 是否按插入顺序:List 接口契约规定所有 List 都满足"存取有序",
// 但如果你拿到的是一个 SortedSet 转过来的 List,需要另行判断。
boolean isInsertionOrdered = list instanceof java.util.List; // 契约层面成立
加分回答
List的"有序"指 position-based access(位置索引访问),不代表内容已排序。- 如果想让 List 按规则排序,用
Collections.sort(list, comparator)或 Java 8 的list.sort(comparator)。 RandomAccess是个标记接口,用于告知遍历算法该用索引还是迭代器,详见 RandomAccess 空接口的作用。