有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用新运算符时有多少字符串对象

当我们使用new操作符创建一个String对象时,我看到创建了两个对象,一个是String常量池,另一个是堆内存

我的问题是,我们使用的是新操作符,因此堆中只应创建一个对象。那么为什么还要在字符串常量池中创建一个对象呢。我知道每当我们不使用新操作符创建字符串时,Java都会存储String对象。例如:

String s = "abc" . 

在这种情况下,它只会在字符串常量池中创建

String s2 = new String("abc") 

只需在堆中创建一个对象,而不必在常量池中创建

请解释我为什么错了


共 (6) 个答案

  1. # 1 楼答案

    java中的字符串是不可变的,一旦创建,它就不能更改。此外,任何字符串文字都将存储在字符串池中,以便以后再次使用相同文字时使用,例如:

    String name = "my name"; // one intern object is created in pool
    String otherName = "my name"; // the old intern object is reused
    System.out.println( name == otherName); // true , the same reference refer to same object
    

    这两个引用引用池中的同一位置

    String name = new String("my name"); // one object is created, no string pool checking
    String otherName = new String("my name"); // other object is created, no string pool checking
    System.out.println( name == otherName); // false, we have 2 different object
    

    这里我们在内存中有两个不同的字符串对象,每个对象都有自己的值

    有关更多信息,请参阅本文: http://www.javaranch.com/journal/200409/Journal200409.jsp#a1

  2. # 3 楼答案

    下面这行代码将在JVM中创建3个对象

    String s2 = new String("abc")
    
    1. 用于String池内存中的"abc"
    2. 对于新操作符,堆中有一个对象
    3. 再给s2一个
  3. # 4 楼答案

    String s2 = new String("abc")
    

    它将在堆内存中只创建一个对象。我们需要使用java的intern()方法。lang.String显式地在字符串池中创建条目

    String s = "def".
    

    这里将创建两个对象。当您使用Java的字符串文字表示法创建时,它会自动调用intern()方法将该对象放入字符串池,前提是该对象尚未出现在该池中

  4. # 5 楼答案

    We are using new operator hence only one object should be created in Heap.

    当然new操作只创建一个对象。但是它的参数是一个字符串文本,它已经代表了一个对象。无论何时使用字符串文字,都会在类加载期间为此创建一个对象(除非在其他地方已经使用了相同的文字)。这并不是因为您将对象用作new String()操作的参数而跳过的

    正因为如此,new String()操作在大多数情况下是不必要的,很少使用

  5. # 6 楼答案

    它将被创建为两个对象,一个对象进入池区域,另一个对象进入非池区域,因为您正在使用new and以及string literal作为参数

    String s = new String("abs");