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

当我们使用new运算符时,确切地说什么时候在字符串常量池中创建对象。?

慕容嘉熙
2023-03-14
String s = new String(“hello”); 

这里将创建两个对象,一个在堆内存中,另一个在字符串池中。

那么,internat()方法有什么用呢?执行上述语句后,字符串“hello”将在堆和字符串池中可用

共有1个答案

阚允晨
2023-03-14

首先。String s=new String(“hello”);创建了一个不必要的字符串,不应该使用。接下来,调用s=s.internat()将确保返回添加到SCP中的“hello”,因此在堆中创建的第二个字符串将符合GC的条件。

internat()将字符串添加到SCP中,如果该字符串还不存在的话。当您知道一个字符串被多次使用,但无法使用Literal创建它时,通常会使用它。因此,您可以使用intern并确保只有一个字符串放在SCP中,并且在1000个位置上使用(堆中具有相同值的所有其他字符串都符合GC条件),而不是创建数千个具有相同值的字符串(这些字符串同时存在)

 类似资料:
  • 我知道这可能是非常基本的,也可能是非常直接的,但我无法清楚地理解在这种情况下会发生什么,所以,就这样吧。 在以下代码中: 我知道str1和str2将在字符串常量池中分别创建一个对象“Hello”和“World”。而对于str3,将在字符串常量池外部创建一个新对象,该对象指向在字符串常量池内部创建的“HelloWorld”。 我的问题是,如果我concat 2个或更多字符串(使用“”或concat(

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

  • 据我了解 将创建两个对象- 一个在String常量池中(如果不在常量池中) 堆内存中的一个 虽然对于实际创建多少对象以及在何处创建对象,人们的理解并不多。 不管怎样,我有以下问题- 为什么在String类的java文档中没有提到要创建多少对象以及在哪里创建 编辑 java docs for方法显然谈到了常量池,但在中没有这样说。

  • 问题内容: 我看到过这样创建的对象: 但是我认为创建对象时括号不是可选的: 创建对象的前一种方法在ECMAScript标准中是否有效并定义?前一种创建对象的方式与后一种创建方式之间有什么区别吗?是一个比另一个更好的选择吗? 问题答案: 引用David Flanagan 1: 作为一种特殊情况,仅对于运算符,JavaScript通过在函数调用中没有参数的情况下允许省略括号来简化语法。以下是使用运算符

  • 返回前用调试器运行程序时,指针的值为0x0000000009DFAA90,但的值变为0x0000000009DFAA98。 这种情况只发生在字符串类型中。我试着对我的一个类的“int[10]”、“string*[10]”和对象做同样的操作,但问题只发生在处理string和代码时: 工作非常好。 有没有人能解释一下为什么会发生这种情况,以及如何使它正常工作? PS:我们正在使用Visual Stud

  • 问题内容: 何时使用和何时使用运算符? Java提供了两个选项来检查分配兼容性。什么时候使用? 问题答案: 我认为官方文档为您提供了答案(尽管以一种非常具体的方式): 此方法与Java语言instanceof运算符动态等效。 我认为这主要是指在运行时处理类型反射的代码中使用。特别是,我想说它的存在是为了处理您可能不事先知道要检查其成员资格的类的类型的情况(尽管这些情况可能很少)。 例如,您可以使用