Java字符串大小比较主要通过compareTo()和Comparator.compare()实现,二者均按Unicode值逐位比较并返回负数、0或正数;区别在于compareTo()是String实例方法,适合简单比较,而Comparator.compare()用于函数式场景,如排序;两者均区分大小写,但支持忽略大小写的变体,并需注意空指针安全处理。

Java 中字符串的大小比较,主要通过 compareTo()(实例方法)和 Comparator.compare()(函数式接口方法)实现,二者底层逻辑一致,都是按字符 Unicode 值逐位比较,返回负数、0 或正数表示“小于、等于、大于”。关键区别在于调用方式和使用场景。
compareTo():String 类自带的实例方法
每个 String 对象都有 compareTo() 方法,直接调用即可,适合两个字符串之间的简单比较。
- 语法:
str1.compareTo(str2) - 返回值:
- 负数 →
str1字典序小于str2(如"apple".compareTo("banana") < 0) - 0 → 两个字符串内容完全相同(区分大小写)
- 正数 →
str1字典序大于str2(如"zebra".compareTo("apple") > 0)
- 负数 →
- 注意:区分大小写,因为大写字母(A–Z)Unicode 值(65–90)小于小写字母(a–z,97–122),所以
"Z".compareTo("a")返回负数(90 - 若需忽略大小写,用
compareToIgnoreCase()
Comparator.compare():用于排序或自定义比较逻辑
当需要将比较行为传递给集合排序(如 Arrays.sort()、TreeSet)、或封装复用时,使用 Comparator 接口的 compare() 方法。
- 最常用的是
String::compareTo方法引用,等价于(s1, s2) -> s1.compareTo(s2) - 示例:对字符串数组升序排序
Arrays.sort(arr, String::compareTo); // 结果:Apple, banana, cherry(注意大小写)
忽略大小写的比较方式
两种方法都支持忽略大小写,但写法不同:
立即学习“Java免费学习笔记(深入)”;
-
str1.compareToIgnoreCase(str2)—— 直接调用实例方法 -
String.CASE_INSENSITIVE_ORDER.compare(str1, str2)—— 使用内置的静态 Comparator - 也可自定义:
Comparator<string> ciComp = String::compareToIgnoreCase;</string>
安全比较(避免空指针)
compareTo() 调用方不能为 null,否则抛 NullPointerException。安全做法:
- 手动判空:
if (s1 == null && s2 == null) return 0; else if (s1 == null) return -1; ... - 用
Objects.compare(s1, s2, String::compareTo)(推荐),自动处理 null - 或使用
Comparator.nullsFirst(String::compareTo)指定 null 排在前面


















