根据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的一个新引用对象在堆中创建。对吗?
你有一些误解。
字符串池也是堆的一部分。您可能想问字符串是在字符串池中还是在堆的其他部分。
你似乎还认为赋值会创建新对象。变量和对象是分开的。在这两行之后:
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(字符串常量内存池),在这里字符串被初始化和垃圾收集,就像堆内存中的其他对象一样。