使用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,因为sb
和s1
指向两个不同的实例。
然而,如果你这样比较它们:
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这个链接上的图片和解释将比文字更能说明问题。