9.6 字符串比较

你可能想用运算符 ==!= 来比较两个字符串:

  1. String name1 = "Alan Turing";
  2. String name2 = "Ada Lovelace";
  3. if (name1 == name2) { // 不对!
  4. System.out.println("The names are the same.");
  5. }

这些代码能够通过编译并运行,且在大多数情况下能得到正确的答案。但这并不是正确的,有时得到的答案也不对。这是因为运算符 == 通过比较引用来判断两个变量指向的是否为同一个对象。如果你让它比较两个包含相同字符的字符串,结果将为 false

要比较字符串,正确的做法是像下面这样使用方法 equals

  1. if (name1.equals(name2)) {
  2. System.out.println("The names are the same.");
  3. }

这个示例对 name1 调用 equals,并将实参指定为 name2。如果两个字符串包含相同的字符,方法 equals 将返回 true,否则返回 false

如果两个字符串不同,可用 compareTo 来确定按字母表顺序排列时哪个字符串在前:

  1. int diff = name1.compareTo(name2);
  2. if (diff == 0) {
  3. System.out.println("The names are the same.");
  4. } else if (diff < 0) {
  5. System.out.println("name1 comes before name2.");
  6. } else if (diff > 0) {
  7. System.out.println("name2 comes before name1.");
  8. }

compareTo 的返回值为两个字符串中第一个不同的字符的差。如果两个字符串相等,则差为零;如果按字母表顺序排列时,第一个字符串(对其调用这个方法的字符串)在前,则差值为负,否则为正。

在前面的代码中,compareTo 返回 8,这是因为 "Ada" 的第二个字母比 "Alan" 的第二个字母靠前 8 个位置。

equalscompareTo 都区分大小写。因为大写字母排在小写字母前,所以 "Ada" 排在 "ada" 前。