-3

这两种说法究竟有什么区别

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

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

现在,如果我一个接一个地执行这两个语句。由于第一个语句,对象“abc”将在字符串池中,并且随着第二个语句的执行,s2 将引用在字符串池中已经存在的对象,如果我执行 s1= =s2 它应该返回 true,但是它返回 false。

你能解释一下为什么吗?

4

2 回答 2

5

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

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

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

于 2013-02-19T18:13:59.630 回答
1

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

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

于 2013-02-19T18:12:48.190 回答