当前位置: 首页 > 知识库问答 >
问题:

新创建的字符串将在哪里?堆内存还是字符串常量池?

郭博涉
2023-03-14

根据Java,

字符串存储在两个地方。字符串字面池和堆内存根据其创建。我需要知道,当字符串赋值到另一个字符串时,新创建的字符串将存储在哪里?

我对堆和字符串池中的字符串类型都进行了赋值操作。我得到了这样的结果。

    String str = new String("foo"); ===> str is created in heap memory
    String strL = "doo"; ===> strL is created in String pool.

但是当,

    String strNew = strL; // strL which is there in String Pool is assigned to strNew.

如果我这么做

    strL = null;
    System.out.println(strNew)// output : "doo".
    System.out.println(strL)// output : null.

同样地,

    String strNewH = str; // str which is there in heap is assigned to strNewH

现在

    str = null;
    System.out.println(strNewH);// output : "foo".
    System.out.println(str); // null

以上是我在IDE上得到的输出。根据该输出,strNew的一个新引用对象在字符串池中创建,strNew的一个新引用对象在堆中创建。对吗?

共有1个答案

齐承运
2023-03-14

你有一些误解。

字符串池也是堆的一部分。您可能想问字符串是在字符串池中还是在堆的其他部分。

你似乎还认为赋值会创建新对象。变量和对象是分开的。在这两行之后:

String str = new String("foo");
String strL = "doo";

变量str指的是字符串池中不存在的字符串对象“foo”。变量strL指的是字符串池中的字符串对象“doo”

(注意“参考”一词)

当你分配String变量时,你只是在改变它们所指的内容。在这里:

String strNew = strL;

您正在使strNew引用与strL引用的对象相同的对象。

类似地,当您将某物设置为null时,您会使其不引用任何内容。它所指的物体不一定被摧毁。

至于你的问题:

根据此输出,在字符串池中为strNew创建一个新的引用对象,并在堆中为strNewH创建一个新的引用对象。是正确的吗?

不,这是不正确的。没有创建新对象。strNew指的是字符串池中的doo,并且与strL所指的对象相同。strNewH指的是>"foo",它不在字符串池中,并且与str所指的对象相同。

 类似资料:
  • 当使用关键字 new 创建字符串时,它使用采用 String 文本的构造函数创建新的 String 对象。我想知道在调用 String 构造函数之前,文本是否存储在常量池中。 我这么问的原因是,在《OCA Java SE 7程序员I认证指南》中,Mala Gupta写道: 她在第一行表示,new创建的String对象不会存储在常量池中。这很好,但不清楚的是,第一行构造函数中的字面“Summer”是

  • 问题内容: 我的长字符串不适合屏幕的宽度。例如。 为了使阅读更容易,我想到了用这种方式编写它- 但是,我意识到第二种方法使用字符串连接,并会在内存中创建5个新字符串,这可能会导致性能下降。是这样吗 还是编译器足够聪明,以至于我只需要一个字符串就可以了?我如何避免这样做? 问题答案: 我意识到第二种方法使用字符串连接,并将在内存中创建5个新字符串,这可能会导致性能下降。 不,不会。由于这些是字符串文

  • 当使用文字创建字符串时,它会存储在池中。但当使用new运算符创建字符串对象时,它会将对象存储在堆中。 但是,堆中的对象只是一个指向存储在池中的文本的指针,还是一个存储在堆中的简单字符串对象,符合GC的条件?

  • 在Java 7或更低版本中,如果使用以下语法创建字符串 根据此链接,每当我们创建一个字符串对象时,都会创建两个对象,即堆区域中的一个和字符串常量池中的一个,并且字符串对象引用始终指向堆区域对象,如下所示。 如果我们创建另一个与 具有相同值的String对象,内存表示将是什么 这会在堆中创建另一个具有相同值的对象吗? 还是只会创建引用字符串常量池到堆中的对象?

  • 问题内容: 假设我有两个陈述。 哪个是堆栈内存,哪个存储在堆中? 两者之间有什么区别? 创建了多少个对象,内存中的引用如何? 最佳做法是什么? 问题答案: 所有对象都存储在堆中(包括其字段的值)。1个 局部变量(包括参数)始终包含原始值或引用,并存储在堆栈中。1个 因此,对于您的两行: 您将在堆上有两个对象(两个包含的String对象)和两个引用(每个对象一个)在堆栈上(提供且是局部变量)。 (实

  • 每个人都知道这一点。Net framework字符串对象直接存储在堆内存中 我只是想弄清楚里面是否有保留的记忆。Net字符串框架。在java中,有一个为字符串保留的内存,称为SCMP(字符串常量内存池),在这里字符串被初始化和垃圾收集,就像堆内存中的其他对象一样。