我有这段代码,
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
答案 0 :(得分:5)
"String".replace('g','g')
不做任何更改并返回原始字符串。字符串文字都作为单个对象在字符串池中。所以
"String".replace('g','g')=="String"
这就是你的b
布尔值为真的原因。
对于c
,您在toString()
数组上调用char
。 char
数组不是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
,因为如果replace
和String
相同,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;