差异

2013-02-19 76 views
-3
之间的两个字符串声明

究竟什么是据我所知这两个声明差异

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

之间的区别在于,第一条语句将创建字符串池即一个对象,S1将冷藏它。 在第二份声明中,将创建两个对象,因为我用新的关键字和S2将参考对象在字符串池现在

如果我另一个。自后,执行这两个声明一会的第一个语句对象“ABC”将是在字符串池和第二个语句的执行s2将引用该对象,这是在字符串池alreday是如果我做s1 == s2它应该返回true,但它返回false。

你能解释一下为什么吗?

+0

和这个:http://stackoverflow.com/questions/6191086/whats-the-difference-between-string-and-new-string?rq=1 – 2013-02-19 18:12:27

+0

该链接不包含我在找什么。 。 – user728907 2013-02-19 18:14:10

+1

@ user728907链接正确地回答你的问题 – cIph3r 2013-02-19 18:15:54

回答

1

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

s1.equals(S2),但是,将工作,因为你是比较字符串的内容

+0

纠正我,如果我错了,但如果我们不重写equals方法,它的默认行为是==,所以它为什么会返回true。(不知道这是否是一个逻辑问题) – user728907 2013-02-19 18:18:14

+1

equals的字符串实现覆盖Object.equals。它检查字符串的内容,而不是对象本身 – 75inchpianist 2013-02-19 18:19:18

4

事实是String s1="abc"分配串池,这是一个特殊的地方,其中不变的字符串里面保存的字符串。您将无法直接修改​​,而只能修改指向它的参考(s1)。

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

当你比较s1 == s2,因为你是比较引用,它们是不同的,因为指向字符串池中的字符串(我实际上不确定是否创建包装对象或直接引用池中的对象),而第二个指向您明确创建的对象(包含存储数据的char[]缓冲区)。

+0

第二条语句将在真正的堆中创建两个对象,并在字符串常量池中创建另一个对象....如果我错了,请纠正我,因为abc已经在那里了(因为String s1 =“abc”)s2将引用已经是...的字符串...所以基本上s1和s2都会引用两个相同的字符串... plaese纠正我在哪里ia m缺少点 – user728907 2013-02-19 18:26:47

+1

no,'s2'指向指向字符串池中的字符串的对象。不要直接输入字符串。 – Jack 2013-02-19 18:29:50

+0

所以我得到它是否意味着s1指的是字符串池中的abc 而s2指向一个字符串中的字符串池中的对象....可以吗? – user728907 2013-02-19 18:34:56