【问题标题】:how many instances be created in String str1 =new String ("abc")? [duplicate]在 String str1 =new String ("abc") 中创建了多少个实例? [复制]
【发布时间】:2013-07-29 09:29:10
【问题描述】:

有个面试题:

此语句将创建多少个实例:

String str1 = new String ("abc")

答案是 2:str1"abc"

对吗?

【问题讨论】:

  • 我觉得答案是 1,因为“abc”被实习,而唯一被创建的“实例”是堆中的str1

标签: java


【解决方案1】:

在运行时只会创建一个实例。当类被加载时,文字 "abc" 将被保存在字符串池中,虽然从技术上讲,JVM 创建了一个 "abc" 的实例并将其保存在字符串池中。表达式 new String("abc") 创建了一个 String 的实例。

JLS 3.10.5:

字符串字面量是对 String 类实例的引用(第 4.3.1 节、第 4.3.3 节)。

此外,字符串字面量总是引用 String 类的同一个实例。这是因为字符串文字 - 或者更一般地说,作为常量表达式值的字符串(第 15.28 节) - 是“内部的”,以便使用 String.intern 方法共享唯一实例。

另外,请阅读JLS 15.28

使用 String.intern 方法,String 类型的编译时常量表达式始终是“内部”的,以便共享唯一的实例。

推荐阅读:

  1. Java String is Special
  2. what is String pool in java?
  3. Strings, Literally

【讨论】:

  • +1。我认为“实习生”这个词让人们感到困惑。如果已经创建了“abc”并将其放置在 sting 池中,则 jvm 不必创建一个。它可以只参考现有的。如果不存在,则必须创建一个并将其放入池中。然后“new”关键字也增加了混乱,当语句就像“当你用“new”关键字实例化时,一个新的对象被创建”..这听起来像“abc”自从强大以来就不会被创建没有使用“新”。 “abc”神奇地存在。
  • String s1 = new String("hello"); ,在 JVM 级别创建了多少引用?我知道两个对象:1 在为“hello”加载类时,1 在实际执行命令时。 1 引用是 s1,我怀疑还有第二个引用 s2,它是在类加载时传递给“new String()”构造函数的“hello”字符串的结果。在java中,我们无法在函数或构造函数中传递对象本身,我们只能传递引用。另外,应该有第三个引用 s3,它应该是 new String("hello") 的结果,然后被分配给 s1?
【解决方案2】:

否 - 在堆中只创建了一个实例。文字“abc”进入池。编译并执行 javap,您将在字节码中只看到一个 new

考虑这个类-

public class InstanceTest {


    public static void main(String... args){

        String str1 =new String ("abc");

    }

}

如果我们编译并执行-

javap -c InstanceTest

我们得到-

public class InstanceTest {
  public InstanceTest();
    Code:
       0: aload_0       
       1: invokespecial #1     // Method java/lang/Object."<init>":()V
       4: return        

  public static void main(java.lang.String...);
    Code:
       0: new           #2    // class java/lang/String
       3: dup           
       4: ldc           #3    // String abc
       6: invokespecial #4    // Method java/lang/String."<init>":(Ljava/lang/String;)V
       9: astore_1      
      10: return        
}

【讨论】:

  • "abc" 会去字符串池,不是吗?
【解决方案3】:

str1 是变量引用,不是对象,“abc”是字符串字面量,不是对象

我认为,Heap 上只创建了一个实例

【讨论】:

    【解决方案4】:

    new 关键字只创建一个实例,在您的示例中,您将对象的引用放入 str1(注意:否则它将被垃圾收集器删除)。

    【讨论】:

      【解决方案5】:

      将只创建一个字符串实例,因为 java 编译器具有避免不必要地创建 String 对象的智能。它将文件编译为类文件,在该文件中尝试尽可能优化代码。

      在此处阅读有关字符串实习的信息http://en.wikipedia.org/wiki/String_interning

      【讨论】:

        【解决方案6】:

        2是正确的,当使用“abc”Java const pool创建一个“abc”实例,使用new(“abc”),它在堆中创建另一个String实例。

        【讨论】:

          【解决方案7】:

          您将创建两个 String 实例。 使用字符串构造函数而不是将它们声明为文字将始终创建不同的实例。

          试试下面的代码:

              String str = "abc";
              String str2 = "abc";
              String newString = new String(str);
              System.out.println("Are " + str + " and " + newString + " the same instance? " + (str == newString));
              System.out.println("Are " + str + " and " + str2 + " the same instance? " + (str == str2));
          

          【讨论】:

            猜你喜欢
            • 2013-10-20
            • 2013-12-03
            • 1970-01-01
            • 1970-01-01
            • 2015-11-21
            • 1970-01-01
            • 2018-04-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多