字符串比较的相等

时间:2014-11-08 16:58:22

标签: java string methods equals

我有这段代码,

class  Test{

public static void main(String args[])
{
Boolean a;
Boolean b;
char [] c={'S','t','r','i','n','g'};

a=("String".replace('g','G')=="String".replace('g', 'G')); 
b=("String".replace('g','g')=="String".replace('g', 'g'));

System.out.println("---"+a);
System.out.println("---"+b);
System.out.println(c.toString()=="String");
}

Out out是 - -假 - -真正 假

我确实通过oracle访问了JLS文档。 替换方法: 返回一个新字符串,该字符串是使用newChar替换此字符串中所有出现的oldChar。 如果字符oldChar未出现在此String对象表示的字符序列中,则返回对此String对象的引用。否则,将创建一个新的String对象,该对象表示与此String对象表示的字符序列相同的字符序列,但每次出现的oldChar都被newChar的出现替换。

当O / p为假时为什么O / p秒为真?

JLS文档说的关于toString方法: 这个对象(已经是一个字符串!)本身就返回了。 那么为什么O / p第三是真的呢?

任何人都可以向我解释

提前致谢 GPAR

3 个答案:

答案 0 :(得分:5)

"String".replace('g','g')不做任何更改并返回原始字符串。字符串文字都作为单个对象在字符串池中。所以

 "String".replace('g','g')=="String"

这就是你的b布尔值为真的原因。

对于c,您在toString()数组上调用charchar数组不是String ..没有理由在代码中返回与另一个String相同的实例。

答案 1 :(得分:2)

a=("String".replace('g','G')=="String".replace('g', 'G'));

这将返回false,因为replace方法返回一个全新的String实例。检查==会返回false,因为这两个部分都会引用不同的String个实例。

b=("String".replace('g','g')=="String".replace('g', 'g'));

这会返回true,因为如果replaceString相同,oldChar方法会返回调用它的newChar实例({1}} {3}})。由于"String"是一个实习字符串,因此两个部分都指的是同一个实例。

c.toString()=="String";

再次返回false,因为toString()返回包含数组表示的新String实例。此表示可能如下所示[C@50206be6。这意味着即使c.toString().equals("String")来电也不会返回true

答案 2 :(得分:0)

Afaik ==运算符检查对象是否实际相同。 如果要比较对象的内容,则应使用.equals()

为什么第一次检查返回false而不是第二次检查可能有点令人困惑。 我认为这可能是由于.replace(a,b),其中a == b实际上并没有修改字符串和 所以实例是相同的,而当改变字符串时,实例是不同的。

简而言之:使用a.equals(b);而不是== b;