java如何将引号中的任何内容识别为字符串对象?

如果我写:

String s = new String("abc"); 

它创建一个String类型的对象,其值为“abc”。 如果我写:

 String s = "abc"; 

这也会创建一个值为“abc”的对象。 如何在不遇到新关键字的情况下创建对象。

如果我写:

 s.append("def"); 

它创建了另外两个字符串对象:

 a. "abcdef" b. "def" 

因此,在遇到双重引号内的任何内容时,请创建一个新的String对象。 这是怎么发生的?

它被称为String literal ,在JLS 3.10.5中指定:

字符串文字由用双引号括起来的零个或多个字符组成。 字符可以用转义序列(§3.10.6)表示 – 一个转义序列用于U + 0000到U + FFFF范围内的字符,两个转义序列用于UTF-16代理代码单元格,范围为U + 010000到U + 10FFFF。

"abc"是一个字符串文字,由语言规范定义。

参考JLS 3.10.5 :

字符串文字由用双引号括起来的零个或多个字符组成。 字符可以用转义序列(§3.10.6)表示 – 一个转义序列用于U + 0000到U + FFFF范围内的字符,两个转义序列用于UTF-16代理代码单元格,范围为U + 010000到U + 10FFFF。

推荐阅读:

  1. 字符串对象和字符串文字之间的区别 。
  2. Java字符串池

另外,读取字符串真的很特别 :

字符串文字存储在公共池中。 这有助于共享具有相同内容的字符串的存储空间以节省存储空间。 通过new运算符分配的字符串对象存储在堆中,并且不存在相同内容的存储共享。

 String s1 = "Hello"; // String literal String s2 = "Hello"; // String literal String s3 = s1; // same reference String s4 = new String("Hello"); // String object String s5 = new String("Hello"); // String object 

在此处输入图像描述

 s1 == s1; // true, same pointer s1 == s2; // true, s1 and s1 share storage in common pool s1 == s3; // true, s3 is assigned same pointer as s1 s1.equals(s3); // true, same contents s1 == s4; // false, different pointers s1.equals(s4); // true, same contents s4 == s5; // false, different pointers in heap s4.equals(s5); // true, same contents 

在Java中,当你执行“hello”时,java编译器会创建一个类似于new String("hello")的String对象。 该对象在String Pool (String #intern())中维护。

所以做String i = "hello" 。 它通过检查String#intern()来检查池中是否存在。 如果是,它会重用它,否则它会创建一个新的并放入池中。 有关详细信息,请参阅此

因为所有人都回答“abc”是一个字符串文字。 对于你的第二部分问题,即为什么在执行语句s.append("def")会创建两个对象,因为在Java中,String是不可变的。