2013-03-21 93 views
1

我有一个追加String的情况。而且我很困惑..在Java中添加字符串困惑

public static void foo() { 
     String s = "str4"; 
     String s1 = "str" + s.length(); 
     System.out.println("(s==s1) = " + (s1 == s)); 
    } 

public static void bar() { 
     String s = "str4"; 
     String s1 = "str" + "4"; 
     System.out.println("(s==s1) = " + (s1 == s)); 
    } 

在第一种情况下,正如我在这两种情况下“STR4”对象了解正在被它的返回“假”,但在第二种情况“真正的” 在堆上创建。所以它在两种情况下都应该返回true。但事实并非如此。 请别人帮我解释为什么这样。 ?谢谢。!

+0

检查... http://stackoverflow.com/questions/3801343/what-is-string-pool-in-java – 2013-03-21 06:49:54

回答

3

使用

s1.equals(s) 

比较字符串,否则你比较引用。

在第二种情况下,它返回true因为String s1 = "str" + "4";将被优化以String s1 = "str4";ss1将引用相同的字符串。

+0

其实我并不需要将对象的内容进行比较,但我想知道如何在堆内存上更改'引用'。如果equals()返回true,则表示内容相同。但在这里,我的关注只是参考。谢谢。 – Aatif 2013-03-21 06:58:42

+0

@Aatif,所以我的答案已经涵盖了引用部分./ – 2013-03-21 07:01:09

+0

我还是不清楚Case 1。引用是如何不同的? – Aatif 2013-03-21 07:11:16

0

你需要使用.equals()这个

.equals() // if you dont want to ignore case 

.equalsIgnoreCase() // if you want to ignore case 

==比较引用。

在第二种情况下,两个字符串是相等的。所以引用也是相等的。

String s = "str4"; 
    String s1 = "str" + "4"; .//finally str4 

这里s1和s2的内容是相等的。所以它们有相同的参考。

+0

第二种情况对我来说非常明显,因为“str4”已经存在并且由's'引用,并且它不是再次在堆上创建的,而是指向到变量's1'。但是它与案例1有什么不同。 – Aatif 2013-03-21 07:04:31

+0

我还不清楚案例1.引用是如何不同的? – Aatif 2013-03-21 07:09:31

+0

@Aatif抱歉,我无法找到问题 – PSR 2013-03-21 07:12:40

0

Java中的==运算符仅在两个引用引用同一对象时才返回true。如果您试图比较两个字符串的等效内容,则必须使用equals()方法。

+0

我想检查参考只。但我没有得到如何在两种情况下引用是不同的。 ?是因为s.length()? – Aatif 2013-03-21 07:05:50

0

以我自己的理解:

“STR”=>字符串

“4”=>字符串

然而,

s.length() => int

使用==,比较内存位置。

使用的第一个例子,Java的创建另一字符串,它是不是“S”的位置之外的其他存储位置,因为你正在试图做的字符串+ INT =字符串。

第二个示例返回true,因为它只是与您的's'相同的内存位置,只是值被更改。字符串+字符串=连接字符串

既然你想比较,如果两个字符串具有内但不相同的字符必须是同一位置,然后s.equals(S1)是最好的解决方案。

但是,你应该要测试如果两个变量都指向同一个对象,然后==必须因其浅层比较使用。

+0

谢谢。但是在将'int'附加到String之前,如果您使用的是Java 1.5或更高版本,那么它会被自动绑定到对象。我认为int 4也是第一次在这里被自动装箱...... – Aatif 2013-03-21 07:22:45