Understanding String and equals



使用String s1="java";String s2= new String("java");时这两者都创建不同的String对象吗?我知道如果我使用String s3="java",它使用s1的相同对象,但在s2的情况下,它也使用相同对象吗?如果是,那么StringBuffer sb = new StringBuffer("java");为什么使用不同的对象。因为如果我执行System.out.println(sb.equals( s1 ));,它将返回false;

我对equals方法的理解是,如果两个引用都引用同一个对象,它会进行比较,除非我们重写了equals方法,如果我的理解是错误的,请告诉我。

这两者都创建不同的字符串对象吗

这里有两个方面。第一个是字符串文字的实习。在这两种声明中:

String s1 = "Hello";
String s2 = new String("Hello");

第一个将使用常量池中已经存在的文字字符串"Hello"。如果它不存在,它将在"Hello"的常量池中创建一个条目(在这种情况下,可以说,创建了一个对象)

在第二种情况下,您有两个字符串对象-第一个是字符串文本"Hello",它将从常量池中插入,然后第二个对象的创建是由于使用了new关键字-new String(...)肯定会创建一个新对象。因此:

s1 == s2;  // This will return `false`

因为s1和s2引用了两个不同的String对象。


现在是您的第二个案例:

String s1 = "Hello";
StringBuffer sb = new StringBuffer("Hello");

在第二个语句中,您正在创建一个新的StringBuffer对象。首先,StringBuffer不是String。其次,由于StringBuffer类不会覆盖equals()方法,所以当您像这样调用equals方法时:

sb.equals(s1);

它将调用基于引用值进行比较的Object#equals()方法。因此,它将返回false,因为sbs1指向两个不同的实例。

然而,如果你这样比较它们:

sb.toString().equals(s1);

那么现在您将得到true。由于String类已经重写了equals()方法,该方法根据内容进行比较。


另请参阅:

  • Java中的String和StringBuffer有什么区别
  • 如何在Java中比较字符串

您对equals方法的理解是错误的。您所描述的是==运算符。

equal方法实现了这一点(引用自String类文档):

"如果且仅当参数不为null,并且是一个字符串对象,表示与此对象相同的字符序列,则结果为true。"

String s1="java";

此时,s1指向一个String对象。

String s2 = new String("java");

根据文档,String已经重写了equals方法,以检查对象的内容。

SO s1.equals(s2)将评估为true,因为它们具有相同的内容。

Object.equals()将检查这两个对象是否相同。

字符串s1="java";字符串s2=新字符串("java");两者都做这些创建了不同的字符串对象

new始终创建一个新对象。也就是说,他们所指的内部字符串是相同的。在这种情况下,==将返回false,但equals将返回true。

如果是,那么为什么StringBuffer sb=new StringBuffer("java");使用不同对象

CCD_ 32不是CCD_ 33。他们是两个完全不同的阶层。与CCD_ 34和CCD_。也许你的意思是System.out.println(sb.toString().equals( s1 ));

我对equals方法的理解是,如果引用引用相同的对象,除非我们重写了equals方法

您是对的,但在这种情况下,String覆盖equals()(以及hashcode()),因此行为与Object#equals()不同。

好的,用一个类比。

如果我在两张纸上写同样的单词,比如"你好"。

然后我召集了一个专家小组,问他们一些问题。

Q。专家一。这两件事是一样的吗?A.是的,他们是一样的,上面写着HELLO。

Q。专家二,用一张纸给我做一架纸飞机。A.好的,当然。

Q。专家三,这两样东西是一样的吗?A.当然不是,一架是纸飞机。

Q。第四专家,再拿一张纸,在上面写上"你好"。现在这些东西都一样了吗?

A。当然,他们都说"你好"

所以,这取决于你所说的平等是什么意思。

计算机语言有一些非直观的定义平等的方法。

有时等于意味着我们关心纸上的单词,有时我们担心这是完全相同的一张纸,这在很多时候都无关紧要,只要他们都说"你好"

s1和s3引用同一个对象,但s2是内存中另一个不同的对象。退房http://www.journaldev.com/797/what-is-java-string-pool这个链接上的图片和解释将比文字更能说明问题。

最新更新