0

当使用它们时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 方法,如果我的理解有误,请告诉我。

4

6 回答 6

8

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

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

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

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

在第二种情况下,您有 2 个字符串对象 - 第一个是字符串文字"Hello",它将从常量池中实习,然后第二个对象创建是由于使用new关键字 -new String(...)肯定会创建一个新对象。所以:

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

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


现在是你的第二个案例:

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

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

sb.equals(s1);

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

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

sb.toString().equals(s1);

那么你现在就会变得真实。由于String类已经覆盖了equals()方法,它根据内容进行比较。


也可以看看:

于 2013-08-23T14:51:34.717 回答
2

字符串 s1="java"; 和字符串 s2= new String("java"); 这两个都创建不同的字符串对象吗

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

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

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

我对equals方法的理解是,如果两个引用都引用同一个对象,除非我们重写了equals方法,否则它会比较

你是对的,但在这种情况下,String覆盖equals()hashcode()以及)所以行为不是Object#equals().

于 2013-08-23T14:57:17.923 回答
2
String s1="java";

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

String s2 = new String("java");

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

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

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

于 2013-08-23T14:51:07.523 回答
2

你对equals方法的理解是错误的。是 == 运算符执行您所描述的操作。

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

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

于 2013-08-23T14:48:57.077 回答
0

好吧,让我们打个比方。

如果我在两张纸上写下“HELLO”之类的同一个词。

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

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

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

问:专家三,这两件事是一样的吗?A. 当然不是,一个是纸飞机。

Q. 专家四,再拿一张纸,在上面写上“HELLO”。现在所有这些事情都一样吗?

A. 当然,他们都说'HELLO'

所以,这取决于你所说的平等。

并且计算机语言有一些定义等于的非直观方式。

有时等于意味着我们关心纸上的文字,有时我们担心它是完全相同的一张纸'这在很多时候并不重要,只要他们都说'HELLO'

于 2013-08-23T15:27:22.647 回答
-1

s1 和 s3 指的是同一个对象,但 s2 是内存中的另一个不同对象。查看http://www.journaldev.com/797/what-is-java-string-pool该链接上的图像和解释将比文字更清楚。

于 2013-08-23T14:47:34.357 回答