这两种说法到底有什么区别
String s1="abc";
String s2=new String("abc");
Run Code Online (Sandbox Code Playgroud)
据我所知,第一个语句将在字符串池中创建一个对象,即 s1 将冷藏它。在第二个语句中,它将创建两个对象,因为我使用了 new 关键字,而 s2 将引用字符串池中的对象
现在,如果我一个接一个地执行这两个语句。因为第一个语句对象“abc”将在字符串池中,并且执行第二个语句 s2 将引用字符串池中已经存在的对象,如果我执行 s1= =s2 它应该返回 true 但是它返回 false。
你能解释一下为什么吗?
事实是String s1="abc"在字符串池中分配字符串,这是一个特殊的地方,其中保存不可变的字符串。您将无法直接修改"abc",只能修改s1指向它的引用 ( )。
在第二种情况下,String s2=new String("abc")您将分配一个真正的字符串对象,该对象内部具有char[]存储字符串数据的缓冲区。它和第一个一样是不可变的,但它是堆上的一个对象。
当您比较时s1 == s2,由于您正在比较引用,它们是不同的,因为一个指向字符串池中的字符串(我实际上不确定是否创建了包装对象或使用了对池中对象的直接引用),而第二个指向您显式创建的对象(它包装了一个char[]存储数据的缓冲区)。