两个字符串语句的区别

时间:2013-02-19 18:08:38

标签: java

两个陈述之间究竟有什么区别

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

据我所知,第一个语句将在字符串池中创建一个对象,即s1将依赖它。 在第二个语句中,它将创建两个对象,因为我使用了new关键字,而s2将引用String池中的对象

现在如果我一个接一个地执行这两个语句。因为第一个语句对象“abc”将在字符串池中并且执行第二个语句s2将引用对象哪个是字符串池中的alreday就是我do s1 == s2它应该返回true但是它返回false。

你可以解释一下原因吗?

2 个答案:

答案 0 :(得分:4)

事实是String s1="abc"在字符串池中分配字符串,这是一个保存不可变字符串的特殊位置。您将无法直接修改"abc",只能修改指向它的引用(s1)。

在第二种情况String s2=new String("abc")中,您正在分配一个内部具有char[]缓冲区的实际字符串对象,其中存储了字符串数据。它像第一个一样是不可变的,但它是堆上的一个对象。

当您比较s1 == s2时,由于您正在比较引用,它们是不同的,因为一个指向字符串池中的字符串(我实际上不确定是否创建了包装器对象或对该对象的直接引用在池中使用),而第二个指向您显式创建的对象(包装存储数据的char[]缓冲区)。

答案 1 :(得分:1)

您正在创建两个不同的对象。 s1有自己的内存来保存其引用地址。与s2相同。虽然这两个对象都指向字符串池中的相同字符串,但对象本身是不同的。因此,s1 == s2将失败。

然而,

s1.equals(s2)将起作用,因为您正在比较字符串内容