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

时间:2013-07-23 11:00:01

标签: java string

如果我写:

String s = new String("abc");

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

String s = "abc";

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

如果我写:

s.append("def");

它再创建两个字符串对象:

a. "abcdef"  
b. "def"

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

4 个答案:

答案 0 :(得分:8)

它被称为String literal,并在JLS 3.10.5

中指定
  

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

答案 1 :(得分:6)

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

参考JLS 3.10.5

  

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

建议阅读:

  1. Difference between string object and string literal
  2. Java String Pool
  3. 另请阅读String is Really Special

      

    字符串文字存储在公共池中。这有助于共享具有相同内容的字符串的存储空间以节省存储空间。通过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
    

    enter image description here

    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  
    

答案 2 :(得分:0)

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

这样做String i = "hello"。它通过从i进行检查来检查池中是否存在String#intern()。如果是,它会重用它,否则它会创建一个新的并放入池中。请参阅此内容以获取更多info

答案 3 :(得分:0)

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