平等

2014-11-08 56 views
1

我有这样的代码串进行比较,平等

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"); 
} 

外出时的卖出期权 ---假 ---真 假

我没有被Oracle访问JLS文件的地方说。 替换方法: 返回一个新字符串,它是用newChar替换此字符串中出现的所有oldChar。 如果字符oldChar不出现在由此String对象表示的字符序列中,则返回对此String对象的引用。否则,将创建一个新的String对象,该对象表示与由此String对象表示的字符序列相同的字符序列,除了每次出现的oldChar被newChar的出现替换。

当O/P一个是错误的为什么O/P秒是真实的?

JLS文件说到toString方法: 该对象(它已经是一个字符串!)本身返回。 那么为什么不O/P第三是真实的?

任何一个可以请解释一下

在此先感谢 GPAR

+2

使用等于insted的== – Uhla 2014-11-08 17:01:10

+0

我猜这是因为内部使用的字符串池,其中相同的字符串将不会创建两次。在旁注:格式化您的代码。 – keyser 2014-11-08 17:06:29

+1

@乌拉不,这不是说这个问题。 'ToYonos'不,这不是重复的。 – Tom 2014-11-08 17:19:19

回答

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例如在它被调用,如果oldCharnewChar是相同的(source)。由于"String"是一个interned字符串,这两个部分都指向同一个实例。

c.toString()=="String"; 

这返回false再次,因为toString()返回包含数组表示一个新String实例。这种表示形式可以像这样[[email protected]。这意味着即使拨打c.toString().equals("String")电话也不会返回true

+0

@SotiriosDelimanolis是的,那是对的,谢谢。我用'System.out.println(c);'测试了它,但这与System.out.println(c.toString());'不一样。 – Tom 2014-11-08 17:31:22

+1

现在你已经有了一个完整的答案。 +1 – 2014-11-08 17:31:43

+0

然后我们不能有字符数组的字符串?对不起,这是从我原来的问题转移。即在我的代码字符串[] C到字符串? – Gpar 2014-11-08 18:00:46

0

AFAIK ==操作符检查的对象实际上是一样的。 如果你想比较对象的内容,你应该使用.equals()

它可能有点混淆为什么第一个检查返回false而不是第二个。 我认为这可能是由于.replace(a,b)其中a == b实际上并没有修改字符串,因此实例是相同的,而当字符串被修改时,实例是不同的。

所以简而言之:使用a.equals(b);代替a == b;

+0

谢谢我知道等于方法和==运算符之间的区别。我只是想弄清楚哪个方法的字符串创建新的字符串,哪一个返回相同的引用? – Gpar 2014-11-08 17:48:46

5

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

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

这就是为什么你的b布尔值为true。

至于c,你打电话给toString()char阵列。 A char array不是String ..没有理由在你的代码中返回与另一个String相同的实例。