使用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方法,如果我的理解是错误的,请告诉我。
答案 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个完全不同的班级。这与将String
与Integer
进行比较相同。也许你的意思是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图片和该链接的解释将比单词更清楚地说明。