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

0 java string

如果我写:

String s = new String("abc");
Run Code Online (Sandbox Code Playgroud)

它创建一个类型String为"abc"的对象.如果我写:

String s = "abc";
Run Code Online (Sandbox Code Playgroud)

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

如果我写:

s.append("def");
Run Code Online (Sandbox Code Playgroud)

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

a. "abcdef"  
b. "def"
Run Code Online (Sandbox Code Playgroud)

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

Kep*_*pil 8

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

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


NIN*_*OOP 6

"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
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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  
Run Code Online (Sandbox Code Playgroud)