Java中比较字符串的三种不同方式

3
几个月前,我记得在一次面试中被问到Java中比较字符串的三种不同方法。出于好奇心,我想在这里询问一下作为自己的参考。我想到了两种方法:
  1. str1.equals(str2) 或者使用 compareTo,两者总共算一种方法
  2. 逐个比较字符
有什么想法吗?"=="、equalsTo、compareTo及其任何变种都不是它们告诉我的方法。
编辑:稍微修改了问题。

1
只是好奇:为什么.equals()被认为与compareTo()相同? - light
2
听起来面试官在寻找一个“聪明的家伙”解决方案,例如:s1.contains(s2) && s2.contains(s1)s1.matches(s2) && s2.matches(s1)s1.replace(s2, "").isEmpty() && s2.replace(s1, "").isEmpty() 等等。 - Nir Alfasi
@Manbearpig:String.valueOf(str1) == String.valueOf(str2)并不是一种准确比较字符串的方式。它会出现与str1 == str2相同的问题。 - sstan
@sstan:我记得的是面试官使用了一些字符串方法或属性,然后说在这两个对象之间使用==应该返回true,如果它们具有相同的值。他说这种方法不会像str1 == str2那样遇到相同的问题。但是,我再次强调,解决方案不是str1 == str2 - HikeTakerByRequest
1
好的,我有点困惑。面试的目的是为了了解被面试者知道多少,还是为了展示面试官知道多少? - ajb
显示剩余12条评论
6个回答

4

由于使用 == 有很大的反对声音,我忍不住要发布一个使用它的答案(这是完全有效的!):)))

    String s1 = new String("abc"); // create string object 1
    String s2 = new String("abc"); // create a different string object 2
    s1 = s1.intern();
    s2 = s2.intern();
    System.out.println(s1 == s2); // true!

因此,如果我们确保对字符串进行内部处理,我们就可以使用 == 进行计数。

除此之外,正如我在上面的评论中建议的那样:听起来面试官正在寻找一个“聪明”的解决方案,例如:

s1.contains(s2) && s2.contains(s1)

或者

s1.matches(s2) && s2.matches(s1)

或者

s1.replace(s2, "").isEmpty() && s2.replace(s1, "").isEmpty()

等等。


这可能是其中一个。如果没有 intern,str1 == str2 是否总是有效? - HikeTakerByRequest
你也许是对的。如果是这样,公司值得雇佣一个擅长于晦涩技巧和无用知识,但却写不出实用程序的高技能人才。 - ajb
@Manbearpig确实。没有intern,它可能会工作,也可能不会:如果其中一个字符串是使用new关键字创建的,则没有intern将无法工作。 - Nir Alfasi
@ajb 谢谢你的多次赞美 :) 祝你周末愉快! - Nir Alfasi
此外,我应该提到我在Java程序中从未使用过intern(),也没有看到它在我所工作的任何程序中被使用。因此,如果雇主基于候选人是否了解一个几乎没有实际用途的方法来做出招聘决策,我不敢想象他们的软件质量会是什么样子。 - ajb
显示剩余3条评论

2

除了逐个查看每个字符或使用equals()compareTo()外,我可以想到几种方法:

s1.startsWith(s2) && s2.startsWith(s1)
s1.contains(s2) && s2.contains(s1)
s1.indexOf(s2) == 0 && s2.indexOf(s1) == 0
Arrays.equals(s1.toCharArray(), s2.toCharArray())
s1.intern() == s2.intern()

坦率地说,我并不认为这是一个很好的面试问题。如果面试官真的想问这个问题,那么我认为更好的问题是识别在哪些情况下可以安全地使用==来比较字符串的值。

1

如果我排除考虑大小写的方式,仍然有很多方法,我相信我可能会漏掉一些:

s1.equals(s2)
s1.compareTo(s2)
s1.contentEquals(s2)
Objects.equals(s1, s2)
Objects.deepEquals(s1, s2)

编辑

从技术角度来看,这也是一种方法,但我认为这是不好的做法:

s1.intern() == s2.intern()

1
我猜测:
1)使用'=='运算符比较字符串引用。
2)使用String的equals()方法比较确切的字符串内容。
3)忽略大小写地比较字符串内容的equalsIgnoreCase()方法。

2和3是相同的,不要使用==。 - Mightian

0

我被告知“==”和“compareTo”不算额外的内容。 - HikeTakerByRequest
他要求比较字符串而不是它们的引用。因此,使用"=="操作符是错误的,因为它比较的是引用。 - user4164128
我认为 == 完全不算。如果我是面试官,候选人建议使用 == 来比较字符串,那么面试就结束了。(好吧,这有点夸张,但这绝对显示出基本的 Java 知识缺乏。) - ajb

0

其他选项可能包括(在此处查看详情)-

1. 使用equals方法进行字符串比较
2. 使用equalsIgnoreCase方法进行字符串比较
3. 使用compareTo方法进行字符串比较
4. 使用compareToIgnoreCase方法进行字符串比较


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接