理解字符串和等号

时间:2013-08-23 14:42:52

标签: java string

使用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方法,如果我的理解是错误的,请告诉我。

6 个答案:

答案 0 :(得分:8)

  

这两个都创建了不同的String对象

这里有两个方面。第一个是String文字的实习。在这两个陈述中:

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

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

在第二种情况下,你有2个字符串对象 - 第一个是字符串文字"Hello",它将从常量池中插入,然后第二个对象创建是由于{{1}的使用} keyword - new肯定会创建一个新对象。所以:

new String(...)

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


现在是你的第二个案例:

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

在第二个语句中,您正在创建一个新的StringBuffer对象。好吧,首先String s1 = "Hello"; StringBuffer sb = new StringBuffer("Hello"); 不是StringBuffer。其次,由于String类不会覆盖StringBuffer方法,因此当您调用此类equals()方法时:

equals

它将调用sb.equals(s1); 方法,该方法根据引用值进行比较。因此,它将返回 false ,因为Object#equals()sb指向2个不同的实例。

但是,如果你这样比较它们:

s1

然后你会得到 true 。由于sb.toString().equals(s1); 类已覆盖String方法,因此根据内容进行比较。


另见:

答案 1 :(得分:2)

您对equals方法的理解是错误的。正是==运算符执行您所描述的内容。

实现了相等的方法来执行此操作(引自String类文档):

  

“当且仅当参数不为null并且是一个String对象,表示与此对象相同的字符序列时,结果才为真。”

答案 2 :(得分:2)

String s1="java";

此时,s1指向String个对象。

String s2 = new String("java");
根据文档,

String已经覆盖了equals方法,以检查对象的内容。

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

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

答案 3 :(得分:2)

  

String s1 =“java”;和String s2 = new String(“java”);做两件事   这些创建不同的String对象

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

  

若是,那么为什么StringBuffer sb = new StringBuffer(“java”);使用   不同的对象

StringBuffer不是String。他们是2个完全不同的班级。这与将StringInteger进行比较相同。也许你的意思是System.out.println(sb.toString().equals( s1 ));

  

我对equals方法的理解是,如果两者都是等式的   引用引用相同的对象,除非我们已经重写了equals方法

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

答案 4 :(得分:0)

好的,让我们用一个类比。

如果我在两张纸上写出像'HELLO'这样的词。

然后我带来一个专家小组并问他们一些问题。

Q值。专家一。这两件事情是一样的吗? 答:是的,它们是相同的,它说HELLO。

Q值。专家二,用一张纸让我成为一架纸飞机。 答:好的,确定。

Q值。专家三,这两件事情是一样的吗? 答:当然不是,一个是纸飞机。

Q值。专家四,得到另一张表并在上面写上“HELLO”。现在所有这些都一样吗?

一个。当然,他们都说'HELLO'

所以,这取决于你的意思是等于。

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

有时平等意味着我们关心纸上的文字,有时候我们担心它是完全相同的纸',这在很多时候并不重要,只要它们两人都说'你好'

答案 5 :(得分:-1)

s1和s3引用相同的对象,但s2是内存中的另一个不同对象。查看http://www.journaldev.com/797/what-is-java-string-pool图片和该链接的解释将比单词更清楚地说明。