使用标准循环,我将子字符串与字符串值进行了比较,如下所示:
if (str.substring(i, i+3) == "dog" ) dogcount++;
它打破了迭代。在第一次增量之后,将不再检测到“狗”实例。
所以我使用了 substring.equals,这很有效:
if (str.substring(i, i+3).equals("dog")) dogcount++;
我的问题是,为什么?只是寻求更好的理解,thx。
您应该使用equals()
而不是==
比较两个字符串。
s1 == s2
如果两个字符串都指向内存中的同一个对象,则返回 true 。这是初学者常见的错误,通常不是您想要的。
s1.equals(s2)
如果两个字符串在物理上相等(即它们包含相同的字符),则返回 true。
==
比较参考。您想使用来比较值equals()
。
==
比较字符串的引用(字符串的存储位置)
和
.equals()
比较字符串的值
“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!");
不会打印任何内容,因为您明确声明您需要两个新对象。
如果您想避免复杂化和意外错误,请不要将“==”与字符串一起使用。