String.compareTo() 按 Unicode 码点字典序比较:从左到右逐字符比对码点值,遇不等则返回差值;等长前缀时短串优先;数字<大写字母<小写字母<汉字。

Java 中 String.compareTo() 方法默认就是按字典序排序的,核心依据是字符的 Unicode 码点值,从左到右逐字符比较,不是按拼音、数字大小或语言习惯排序。
字典序比较的实际规则
比较过程严格遵循以下逻辑:
- 从索引 0 开始,依次比对两个字符串对应位置的字符码点值;
- 一旦遇到第一个不相等的字符(比如
'b'vs'c'),立即返回它们的码点差值('b' - 'c' = -1),后续字符不再检查; - 如果所有已比字符都相同,但一个字符串更短(如
"abc"vs"abcd"),则短串排在前面,返回值为长度差(3 - 4 = -1); - 完全相等时返回 0。
常见字符的 Unicode 权重顺序
排序结果由码点大小决定,典型顺序(从小到大)如下:
- 数字:
'0'(48)到'9'(57) - 大写字母:
'A'(65)到'Z'(90) - 小写字母:
'a'(97)到'z'(122) - 中文汉字:基本在
\u4e00(“一”)到\u9fff(“龿”)之间,远高于英文字母
因此 "1.txt" "A.txt" "a.txt" "你好.txt" 是纯码点结果,与读音或常识无关。
立即学习“Java免费学习笔记(深入)”;
实际排序写法示例
对文件名列表做默认字典序排序,直接使用:
Collections.sort(list); 或 list.sort(String::compareTo);
这等价于 list.sort(Comparator.naturalOrder()),区分大小写且按原始码点执行。
想获得更符合直觉的排序?需自定义 Comparator
默认行为常不符合预期(如 "file10.txt" 排在 "file2.txt" 前),这时要替换比较逻辑:
- 忽略大小写:
list.sort(String::compareToIgnoreCase)或String.CASE_INSENSITIVE_ORDER - 自然排序(数字当整数比):需提取并转换数字段,可用 Apache Commons 的
NaturalOrderComparator,或手写正则分段逻辑 - 中文按拼音排序:用
Collator.getInstance(Locale.CHINA),再传入sort() - 只比文件名主体(不含扩展名):先用
lastIndexOf('.')切分,再对 name 部分调用compareTo


















