【问题标题】:understanding the difference between java.lang.String s = new String("hello") and String hold = "hello" [duplicate]了解 java.lang.String s = new String("hello") 和 String hold = "hello" [重复]
【发布时间】:2013-11-25 03:37:46
【问题描述】:

我遇到了这段代码,有点困惑

java.lang.String s = new String("hello");

我不确定什么变量 s 被初始化为 java.lang.String ,以及这个 vs String hold = "hello" 的目的是什么。我试图浏览一些文档,但找不到任何东西。

【问题讨论】:

  • 当您调用 new 时,您是字符串一个新对象,因此您正在创建字符串文字的副本。

标签: java android


【解决方案1】:

这真是糟糕的编程风格

java.lang.String s = new String("hello");

请记住,java.lang 中的所有类都是自动导入的。如果在同一个包中有一个名为String 的类,它也会被导入,但会影响java.lang.String 类。这可能是完全限定类型的原因

java.lang.String s;

但在这种情况下,您只能为其分配 java.lang.String 引用,因为该类是 final,因此无法扩展。传统的做法是

java.lang.String s = new java.lang.String("hello");

如果你问的是

java.lang.String s = new String("hello");

java.lang.String s = "hello";

然后查看其他答案或副本。

【讨论】:

    【解决方案2】:

    这样做:

    String s = "hello";
    

    比这样做更好:

    String s = new String("hello");
    

    第二种方法在您执行"hello" 时创建一个字符串对象,将其传递给String 构造函数,然后创建另一个 相同的String 对象。第一种方法只创建一个对象。

    【讨论】:

    • 2 个对象?这有点令人困惑......你能解释一下吗
    • 文字创建第一个“hello”字符串,然后 String 构造函数复制该字符串(Java 字符串是不可变的),原始字符串被丢弃。有可能所有这些都被优化掉了,但它仍然是很糟糕的风格。
    • @user2980837 String 构造函数public String(String original) 被称为copy constructor,因为它创建了传递给它的字符串的副本。请参阅 dkatzel 在对您的原始问题的评论中发布的链接。
    【解决方案3】:

    好的,你需要了解常量池(字符串字面量池)

    当你这样做时

    String s = "hello";
    

    你实际上是在常量池中设置变量

    何时何地

    String s = new String("hello");
    

    它在常量池中创建一个单独的对象。

    在此处了解更多信息

    http://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/garbage_collect.html

    【讨论】:

    • 请注意,无论您做什么,"hello" 仍将被放入常量池中。
    • 是的,更新了我的答案
    【解决方案4】:

    首先要了解的是Java 中String 的不可变特性。 http://javarevisited.blogspot.in/2013/03/how-to-create-immutable-class-object-java-example-tutorial.html

    String hold = "hello" 使用字符串的不可变特性。所以当你这样做时,

        String hold2 = "hello"
    

    hold 和 hold2 都引用字符串池中“hello”字符串的同一个实例。这意味着两者都引用相同的内存位置。 但是随着

       String hold2 = new String("hello");
    

    在一个新位置有一个新字符串“hello”,而持有和持有2个对象引用不同的内存位置。

    【讨论】:

      【解决方案5】:

      你应该知道的第一件事是java中的字符串是不可变的读取THIS。接下来,当您在幕后执行String s = "hello" 时,编译器会查看String Pool(Java 中保存字符串的地方)并检查是否已经存在hello 字符串。如果是,它将引用s 指向相同的字符串对象并返回(读取THIS)。现在,如果您执行String hold2 = new String("hello");,上述任何事情都不会发生。即使您在字符串池中有hello 字符串,它仍然会创建一个新字符串hello 并将引用hold2 指向它。

      【讨论】:

        猜你喜欢
        • 2014-07-24
        • 1970-01-01
        • 2017-10-27
        • 2013-12-03
        • 2012-06-05
        • 1970-01-01
        • 2021-09-08
        • 2015-11-21
        相关资源
        最近更新 更多