2

I have written the code to check whether the given string is palindrome or not. But here I didn't create any String object explicitly. When we don't create explicitly, "==" also should work to compare the strings. But here I am not getting correct output if I use ==. For the clarity in my question, I have given another code also below

Code 1:Here. "==" is not working.

class Palindrome 
{
    public static void main(String[] args) 
    {

        StringBuffer sb1=new StringBuffer();
        sb1.append("anna");
        String s1=sb1.toString();
        StringBuffer sb2=new StringBuffer();
        sb2=sb1.reverse();
        String s2=sb2.toString();
        if(s1.equals(s2))
        {
            System.out.println("The given String is a Palindrome");
        }
        else

            System.out.println("Not a Palindrome");

    }
}

Code 2: Here == works

class Stringdemo 
{
    public static void main(String[] args) 
    {
        String str1="hello";
        String str2="hello";
        if(str1==str2)
        {
            System.out.println("both strings are same");
        }
        else
        {
            System.out.println("both strings are not Same");
        }
    }
}
4

5 回答 5

6

使用 StringBuilder/Buffer.toString() 将创建一个新实例,因此为什么 equals() 有效,但 == 无效。在使用字符串文字的情况下,任何作为字符串文字的字符串都将被添加到类的常量池中,因此 string1 和 string2 将仅指向常量池中“hello”的相同引用,ergo ==说真的,因为它们是相同的参考。

于 2012-06-07T16:42:23.830 回答
3

"==" 比较对象引用值,其中 "equals()" 比较对象内容。"==" 仅对比较原语非常有用。

当您调用“sb2.toString()”时,它会创建一个具有新参考值的新对象。

于 2012-06-07T16:41:55.920 回答
2

sb2.toString();创建一个新的字符串。== 在这里不起作用

sb2.toString().intern()但是,如果您改用它,它将起作用

于 2012-06-07T16:41:44.193 回答
1

== 检查对象身份是否相等(即,相同的内存地址)。

.equals() 检查值是否相等。

当您创建一个新的字符串文字时:

 String str1="hello";
 String str2="hello";

Java 调用 String.intern() 方法来实习新的 String,但首先会检查相同的 String 值是否已经存在,如果存在,它将返回该值(即,不会创建新实例)。有关详细信息,请参阅 String.intern() 上的 Javadoc 注释:

当调用 intern 方法时,如果池中已经包含一个等于该 String 对象的字符串,由 equals(Object) 方法确定,则返回池中的字符串。否则,将此 String 对象添加到池中并返回对该 String 对象的引用。

这就是第二个示例有效的原因,但 StringBuilder 示例却没有,因为调用 sb2.toString 创建了一个新实例,绕过了 intern()。

为了安全起见,最好对任何非原始对象使用 .equals() 。

于 2012-06-07T16:56:02.917 回答
0

==运算符仅检查object's引用,同时分别equals()比较strings其字符。

由于String不可变对象,因此如果它已在内存中创建,则它共享对象的引用。

所以,

String str1 = "hello"; //and
String str2 = "hello"; //are equal

因为两者str1str2共享相同的引用"hello"

于 2012-06-07T16:42:38.233 回答