Java substring.equals与==的区别

7

使用标准的循环,我比较了一个子字符串和字符串值,代码如下:

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

然后这个迭代被打破了。在第一次增量后,不会再检测到任何“dog”的实例。

所以我使用了substring.equals,它起作用了:

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

我的问题是为什么?只是想更好地理解,谢谢。

(该文涉及IT技术)

3
这个问题已经被问/回答了很多次。https://dev59.com/NnRA5IYBdhLWcg3w9izq - Nikita Ignatov
2
不同意那些给出负评的人。@Cshift3i像这样的基础问题很容易让人难以找到答案。 - MK.
3
似乎有一些成员在和回答者开玩笑,为什么要给别人的回答不必要的负评呢?这太愚蠢了! - Kazekage Gaara
5个回答

10

在比较两个字符串时,应该使用 equals() 而非 ==

s1 == s2 只有当两个字符串在内存中指向同一个对象时才返回 true。这是初学者常犯的错误,通常不是您想要的结果。

s1.equals(s2) 只有当两个字符串内容相同(即包含相同字符)时才返回 true。


非常感谢。但是为什么使用“==”会中断迭代?即使计数变量没有增加,我也希望迭代继续进行。 - Jacob Stevens
你在问题中从未提到“循环”的具体内容,所以我无法确定。这个循环可能是 while(true) { },但我并不确定。 - Alex Lockwood
这是来自http://codingbat.com/prob/p111624的代码:public boolean catDog(String str) { int dogcount = 0; int catcount = 0; for (int i=0; i但我相信我误解了我的结果。抱歉。 - Jacob Stevens

8

== 比较的是引用。你应该使用 equals() 来比较值。


4

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

.equals()用于比较字符串的值。


@downvoter,能否说一下为什么要点踩?是因为回答的不对吗? - Samir Mangroliya
有些白痴正在对所有答案进行负面评价。也许他们认为你通过回答这样的问题是在鼓励提出低质量的问题? - erickson
没错!我觉得应该报告这件事。 - Kazekage Gaara

4

对于String的比较,始终使用equals()方法。因为使用==比较引用。

这里是链接以获取更多知识。

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


3

"String"是Java中的一个对象,因此"=="比较的是引用,正如所述。 然而,像下面这样的代码

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

实际上会输出“Equal!”,这可能会让你感到困惑。原因是当你直接将字面量赋值给String对象时,JVM会对你的代码进行一些优化,以便str1和str2实际上引用了JVM内部池中存储的相同对象。另一方面,代码

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

不会打印任何内容,因为您明确声明了要使用两个新对象。
如果想避免复杂性和意外错误,请永远不要在字符串中使用"=="。


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