核心方法:String.compareTo() 和 String.compareToIgnoreCase()
这是最直接、最常用的方法,用于比较两个字符串的字典序。

compareTo(String anotherString)
-
返回值:
- 负整数:如果调用此方法的字符串小于参数字符串。
- 零 (0):如果两个字符串相等。
- 正整数:如果调用此方法的字符串大于参数字符串。
-
比较规则:
- 从左到右,逐个比较两个字符串中对应字符的 Unicode 值。
- 如果在某个位置发现了不同的字符,这两个字符的 Unicode 值的差值就是
compareTo方法的返回值。 - 如果所有对应的字符都相同,但一个字符串比另一个长,那么较长的字符串更大,返回值为它们长度的差值。
示例代码:
public class StringComparison {
public static void main(String[] args) {
String str1 = "apple";
String str2 = "banana";
String str3 = "apple";
String str4 = "Apple"; // 注意 'A' 和 'a' 的 Unicode 不同
String str5 = "apples";
// str1 < str2, 因为 'a' < 'b'
System.out.println(str1.compareTo(str2)); // 输出: 负数 (具体是 -1)
// str1 == str3
System.out.println(str1.compareTo(str3)); // 输出: 0
// str1 > str4, 因为 'a' (Unicode 97) > 'A' (Unicode 65)
System.out.println(str1.compareTo(str4)); // 输出: 正数 (具体是 32)
// str1 < str5, 因为 "apple" 是 "apples" 的前缀
System.out.println(str1.compareTo(str5)); // 输出: 负数 (具体是 -1)
}
}
compareToIgnoreCase(String anotherString)
这个方法与 compareTo 非常相似,但它在比较时会忽略大小写,它只比较字符的“字母”形式,不关心其大小写。

- 返回值:与
compareTo相同(负、零、正)。 - 比较规则:在比较字符之前,会将它们都转换为大写或小写形式(通常是使用
Character.toUpperCase或Character.toLowerCase的内部逻辑),然后再比较其 Unicode 值。
示例代码:
public class StringComparisonIgnoreCase {
public static void main(String[] args) {
String str1 = "apple";
String str2 = "Apple";
String str3 = "BANANA";
// 忽略大小写后,"apple" == "Apple"
System.out.println(str1.compareToIgnoreCase(str2)); // 输出: 0
// 忽略大小写后,"apple" < "BANANA", 因为 'a' < 'b'
System.out.println(str1.compareToIgnoreCase(str3)); // 输出: 负数
}
}
判断大小关系(大于、小于、等于)
虽然 compareTo 返回的是整数,但我们通常更关心的是“大于”、“小于”还是“等于”的关系,我们可以用它的返回值来做判断。
示例代码:
public class CompareLogic {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "world";
if (s1.compareTo(s2) < 0) {
System.out.println(s1 + " 小于 " + s2);
} else if (s1.compareTo(s2) > 0) {
System.out.println(s1 + " 大于 " + s2);
} else {
System.out.println(s1 + " 等于 " + s2);
}
// 输出: hello 小于 world
}
}
String.equals() 与 compareTo() 的区别
这是一个非常重要的区别,初学者很容易混淆。

| 特性 | equals(Object anObject) |
compareTo(String anotherString) |
|---|---|---|
| 目的 | 是否相等 | 判断顺序(字典序) |
| 返回值 | boolean (true/false) |
int (负/零/正) |
| 大小写敏感 | 是 | 是 |
| 空指针安全 | 对 null 调用会抛出 NullPointerException |
对 null 调用会抛出 NullPointerException |
| 核心逻辑 | 逐个字符比较是否完全相同 | 逐个字符比较 Unicode 值 |
简单总结:
- 如果你只想知道两个字符串是否一样,用
equals()。 - 如果你想知道它们谁在前谁在后,用
compareTo()。
其他相关方法
String.compareTo(String anotherString, boolean ignoreCase)
这是 Java 12 引入的一个非常有用的重载方法,它允许你在同一个方法签名中控制是否忽略大小写,而不需要切换到 compareToIgnoreCase。
// Java 12+ String s1 = "Apple"; String s2 = "apple"; // 忽略大小写比较 int result1 = s1.compareTo(s2, true); // 返回 0 // 区分大小写比较 int result2 = s1.compareTo(s2, false); // 返回负数
String.compareTo() 的静态版本:String.compare(CharSequence a, CharSequence b)
这是 Java 11 引入的静态方法,功能与实例方法 compareTo 完全相同,它的主要优点是允许你比较任何 CharSequence 的实现(如 String, StringBuilder, CharBuffer),而不仅仅是 String 对象,并且可以为 null 参数提供更安全的处理(通过 Objects.requireNonNull)。
// Java 11+
StringBuilder sb1 = new StringBuilder("test");
String str1 = "test";
// 可以直接比较 StringBuilder 和 String
int result = String.compare(sb1, str1); // 返回 0
排序字符串数组或列表
compareTo 方法是实现字符串排序的关键,Java 的排序工具(如 Arrays.sort() 和 Collections.sort())会使用对象的 compareTo 方法(如果对象实现了 Comparable 接口,String 已经实现了)来确定顺序。
示例代码:
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class StringSortExample {
public static void main(String[] args) {
// 对字符串数组进行排序 (自然顺序, 即字典序)
String[] fruits = {"banana", "apple", "orange", "grape"};
Arrays.sort(fruits);
System.out.println("Arrays.sort (自然顺序): " + Arrays.toString(fruits));
// 输出: [apple, banana, grape, orange]
// 对字符串列表进行排序
List<String> languages = {"Python", "Java", "C++", "JavaScript"};
Collections.sort(languages);
System.out.println("Collections.sort (自然顺序): " + languages);
// 输出: [C++, Java, JavaScript, Python]
// 降序排序
// 方法1: 使用 Comparator.reverseOrder()
Arrays.sort(fruits, Collections.reverseOrder());
System.out.println("Arrays.sort (降序): " + Arrays.toString(fruits));
// 输出: [orange, grape, banana, apple]
// 方法2: 自己实现比较逻辑 (不推荐,除非有特殊需求)
// Arrays.sort(fruits, (a, b) -> b.compareTo(a));
}
}
总结与最佳实践
- 判断相等:使用
equals()。 - 判断顺序(字典序):
- 首选:使用
compareTo(),它是最核心、最标准的方法。 - 忽略大小写:使用
compareToIgnoreCase()或 Java 12+ 的compareTo(..., true)。
- 首选:使用
- 排序:
compareTo()是String类实现Comparable接口的核心,使得Arrays.sort()和Collections.sort()能够直接对字符串进行排序。 - 注意 Unicode:字典序是基于字符的 Unicode 值的,这可能不完全符合某些语言的特定排序规则(德语的 和
ss),对于复杂的国际化排序,应使用java.text.Collator类,但对于大多数日常应用,compareTo()已经足够。
