跳转至

如何判断一个 List 是否有序?

结论

List 接口本身并不保证"有序"以外的任何排序语义。这里要区分两个概念:

  1. 有序(ordered):元素的存取顺序一致,遍历顺序等于插入顺序。这是 List 接口的契约。
  2. 排序(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 空接口的作用