【问题标题】:How does java recognizes anything in inverted commas as a string object?java如何将引号中的任何内容识别为字符串对象?
【发布时间】:2013-07-23 11:00:01
【问题描述】:

如果我写:

String s = new String("abc");

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

String s = "abc";

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

如果我写的话:

s.append("def");

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

a. "abcdef"  
b. "def"

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

【问题讨论】:

标签: java string


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    参考JLS 3.10.5:

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

    推荐阅读:

    1. Difference between string object and string literal
    2. Java String Pool

    另外,请阅读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
    

    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  
    

    【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2010-09-18
        • 1970-01-01
        • 2018-08-31
        • 1970-01-01
        • 1970-01-01
        • 2011-11-18
        • 2021-01-21
        • 2020-03-23
        • 1970-01-01
        相关资源
        最近更新 更多