1. 概述
在本文中,我们将讨论在 Java 中比较字符串的不同方法。
由于字符串是 Java 中最常用的数据类型之一,因此这自然是一种非常常用的操作。
2. 使用字符串类进行字符串比较
2.1. 使用“==”比较运算符
使用“==”运算符比较文本值是 Java 初学者常犯的错误之一。 这是不正确的,因为 “==” 仅检查两个字符串的引用相等性,这意味着它们是否引用同一个对象。
让我们看一个这个行为的例子
String string1 = "using comparison operator";
String string2 = "using comparison operator";
String string3 = new String("using comparison operator");
assertThat(string1 == string2).isTrue();
assertThat(string1 == string3).isFalse();
在上面的例子中,第一个断言为真,因为两个变量指向相同的字符串字面量。
另一方面,第二个断言为假,因为 string1 是使用字面量创建的,而 string3 是使用 new 运算符创建的——因此它们引用不同的对象。
2.2. 使用 equals()
字符串类覆盖了从 Object 继承的 equals()。 此方法逐字符比较两个字符串,忽略它们的地址。
如果它们长度相同并且字符顺序相同,则认为它们相等
String string1 = "using equals method";
String string2 = "using equals method";
String string3 = "using EQUALS method";
String string4 = new String("using equals method");
assertThat(string1.equals(string2)).isTrue();
assertThat(string1.equals(string4)).isTrue();
assertThat(string1.equals(null)).isFalse();
assertThat(string1.equals(string3)).isFalse();
在这个例子中,string1、string2 和 string4 变量相等,因为它们具有相同的区分大小写和值,而与它们的地址无关。
对于 string3,该方法返回 false,因为它区分大小写。
此外,如果两个字符串中的任何一个为 null,则该方法返回 false。
2.3. 使用 equalsIgnoreCase()
equalsIgnoreCase() 方法返回一个布尔值。 如其名所示,此方法 在比较字符串时忽略字符的大小写:
String string1 = "using equals ignore case";
String string2 = "USING EQUALS IGNORE CASE";
assertThat(string1.equalsIgnoreCase(string2)).isTrue();
2.4. 使用 compareTo()
compareTo() 方法返回一个 int 类型的值,并根据字典顺序或自然顺序逐字符比较两个字符串。
如果两个字符串相等,则此方法返回 0,如果第一个字符串在参数之前,则返回一个负数,如果第一个字符串在参数字符串之后,则返回一个大于零的数。
让我们看一个例子
String author = "author";
String book = "book";
String duplicateBook = "book";
assertThat(author.compareTo(book))
.isEqualTo(-1);
assertThat(book.compareTo(author))
.isEqualTo(1);
assertThat(duplicateBook.compareTo(book))
.isEqualTo(0);
2.5. 使用 compareToIgnoreCase()
compareToIgnoreCase() 与前一个方法类似,除了它忽略大小写
String author = "Author";
String book = "book";
String duplicateBook = "BOOK";
assertThat(author.compareToIgnoreCase(book))
.isEqualTo(-1);
assertThat(book.compareToIgnoreCase(author))
.isEqualTo(1);
assertThat(duplicateBook.compareToIgnoreCase(book))
.isEqualTo(0);
3. 使用 Objects 类进行字符串比较
Objects 是一个实用工具类,它包含一个静态 equals() 方法,在这种情况下很有用——比较两个字符串。
该方法返回 true,如果首先使用其地址(即“==”)比较两个字符串,则两个字符串相等。 因此,如果两个参数都为 null,则返回 true,如果只有一个参数为 null,则返回 false。
否则,它只是调用传递参数类型类的 equals() 方法——在我们的例子中,是字符串类的 equals() 方法。 此方法区分大小写,因为它内部调用字符串类的 equals() 方法。
让我们测试一下
String string1 = "using objects equals";
String string2 = "using objects equals";
String string3 = new String("using objects equals");
assertThat(Objects.equals(string1, string2)).isTrue();
assertThat(Objects.equals(string1, string3)).isTrue();
assertThat(Objects.equals(null, null)).isTrue();
assertThat(Objects.equals(null, string1)).isFalse();
4. 使用 Apache Commons 进行字符串比较
Apache Commons库包含一个名为StringUtils的实用程序类,用于String相关的操作;它也包含一些非常有益的String比较方法。
4.1. 使用equals()和equalsIgnoreCase()
StringUtils类的equals()方法是String类equals()方法的增强版本,它也能处理空值。
assertThat(StringUtils.equals(null, null))
.isTrue();
assertThat(StringUtils.equals(null, "equals method"))
.isFalse();
assertThat(StringUtils.equals("equals method", "equals method"))
.isTrue();
assertThat(StringUtils.equals("equals method", "EQUALS METHOD"))
.isFalse();
StringUtils类的equalsIgnoreCase()方法返回一个boolean值。它的工作方式类似于equals(),除了它忽略String中字符的大小写:
assertThat(StringUtils.equalsIgnoreCase("equals method", "equals method"))
.isTrue();
assertThat(StringUtils.equalsIgnoreCase("equals method", "EQUALS METHOD"))
.isTrue();
4.2. 使用equalsAny()和equalsAnyIgnoreCase()
equalsAny()方法的第一个参数是一个String,第二个参数是多参数类型的CharSequence。如果其他给定的String中的任何一个与第一个String大小写敏感地匹配,该方法返回true。
否则,返回false
assertThat(StringUtils.equalsAny(null, null, null))
.isTrue();
assertThat(StringUtils.equalsAny("equals any", "equals any", "any"))
.isTrue();
assertThat(StringUtils.equalsAny("equals any", null, "equals any"))
.isTrue();
assertThat(StringUtils.equalsAny(null, "equals", "any"))
.isFalse();
assertThat(StringUtils.equalsAny("equals any", "EQUALS ANY", "ANY"))
.isFalse();
equalsAnyIgnoreCase()方法的工作方式类似于equalsAny()方法,但它也忽略大小写。
assertThat(StringUtils.equalsAnyIgnoreCase("ignore case", "IGNORE CASE", "any")).isTrue();
4.3. 使用compare()和compareIgnoreCase()
StringUtils类中的compare()方法是String类compareTo()方法的空值安全版本,并且通过将空值视为小于非空值来处理null值。 两个null值被认为是相等的。
此外,此方法可用于对包含null条目的String列表进行排序
assertThat(StringUtils.compare(null, null))
.isEqualTo(0);
assertThat(StringUtils.compare(null, "abc"))
.isEqualTo(-1);
assertThat(StringUtils.compare("abc", "bbc"))
.isEqualTo(-1);
assertThat(StringUtils.compare("bbc", "abc"))
.isEqualTo(1);
compareIgnoreCase()方法行为类似,除了它忽略大小写。
assertThat(StringUtils.compareIgnoreCase("Abc", "bbc"))
.isEqualTo(-1);
assertThat(StringUtils.compareIgnoreCase("bbc", "ABC"))
.isEqualTo(1);
assertThat(StringUtils.compareIgnoreCase("abc", "ABC"))
.isEqualTo(0);
这两个方法也可以与nullIsLess选项一起使用。这是一个第三个boolean参数,用于决定是否应将空值视为小于其他值。
如果nullIsLess为true,则null值低于另一个String;如果nullIsLess为false,则null值高于另一个String。
让我们尝试一下
assertThat(StringUtils.compare(null, "abc", true))
.isEqualTo(-1);
assertThat(StringUtils.compare(null, "abc", false))
.isEqualTo(1);
compareIgnoreCase()方法带有第三个boolean参数,工作方式类似,只是忽略大小写。
5. 结论
在本快速教程中,我们讨论了比较String的不同方法。
支持本文的代码可在 GitHub 上获取。 一旦你以 Baeldung Pro 会员 身份登录,就开始学习并在项目上进行编码。















