5

使用标准循环,我将子字符串与字符串值进行了比较,如下所示:

if (str.substring(i, i+3) == "dog" ) dogcount++;

它打破了迭代。在第一次增量之后,将不再检测到“狗”实例。

所以我使用了 substring.equals,这很有效:

if (str.substring(i, i+3).equals("dog")) dogcount++;

我的问题是,为什么?只是寻求更好的理解,thx。

4

5 回答 5

10

您应该使用equals()而不是==比较两个字符串。

s1 == s2如果两个字符串都指向内存中的同一个对象,则返回 true 。这是初学者常见的错误,通常不是您想要的。

s1.equals(s2)如果两个字符串在物理上相等(即它们包含相同的字符),则返回 true。

于 2012-05-25T18:17:25.840 回答
8

==比较参考。您想使用来比较值equals()

于 2012-05-25T18:16:40.813 回答
4

==比较字符串的引用(字符串的存储位置)

.equals()比较字符串的值

于 2012-05-25T18:17:12.297 回答
4

为了String比较,总是使用equals()方法。因为比较在==比较参考。

这是进一步知识的链接

您可能还想阅读本文==以更好地理解和equals()方法之间的区别以及代码示例。

于 2012-05-25T18:17:48.623 回答
3

“String”是 Java 中的一个对象,因此“==”会比较引用,如前所述。但是,像这样的代码

String str1 = "dog";
String str2 = "dog";
if(str1==str2)
    System.out.println("Equal!");

实际上会打印出“Equal!”,这可能会让你感到困惑。原因是当你将文字直接分配给对象时,JVM 会稍微优化你的代码String,以便 str1 和 str2 实际上引用同一个对象,该对象存储在 JVM 的内部池中。另一方面,代码

String str1 = new String("dog");
String str2 = new String("dog");
if(str1==str2)
    System.out.println("Equal!");

不会打印任何内容,因为您明确声明您需要两个新对象。
如果您想避免复杂化和意外错误,请不要将“==”与字符串一起使用。

于 2012-05-25T18:24:40.987 回答