校招刷题群
高效刷题 迎战校招
校招精选试题
近年面笔经面经群内分享
Java刷题群 前端刷题群 产品运营群
首页 > java语言 > jvm内存结构
题目

String str = new String(“abc”),“abc”在内存中是怎么分配的?(多选)

A.

B.

C.字符串常量区

D.寄存器

解答

正确答案是 AC

什么是字符串常量池
JVM为了减少字符串对象的重复创建,其维护了一个特殊的内存,这段内存被成为字符串常量池或者字符串字面量池

工作原理
当代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量进行检查,如果字符串常量池中存在相同内容的字符串对象的引用,则将这个引用返回,否则新的字符串对象被创建,然后将这个引用放入字符串常量池,并返回该引用。

实现前提
字符串常量池实现的前提条件就是Java中String对象是不可变的,这样可以安全保证多个变量共享同一个对象。如果Java中的String对象可变的话,一个引用操作改变了对象的值,那么其他的变量也会受到影响,显然这样是不合理的。

关于堆和栈
Java中所有由类实例化的对象和数组都存放在堆内存中,无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。而栈内存用来存储局部变量和方法调用。

关于寄存器
Java中运行时数据区有一个程序寄存器(又称程序计数器),该寄存器为线程私有。Java中的程序计数器用来记录当前线程中正在执行的指令。如果当前正在执行的方法是本地方法,那么此刻程序计数器的值为undefined


关于本题目中,"abc"为字面量对象,其存储在堆内存中。而字符串常量池则存储的是字符串对象的一个引用。

C 5条回复 评论
肖白刃

大佬的文章让我受益匪浅,如痴如醉,以后的日子还希望能够得到大佬的谆谆指点

发表于 2023-07-19 22:00:00
0 0
每天烦躁专家

这么久了终于弄明白这个问题

发表于 2021-09-11 23:20:00
0 0
落地成盒

简单的说:对象存在于堆中,字符常量池中存在"abc",java7中又将这个放到堆中

发表于 2018-10-23 11:24:33
0 0
途安米

应该是AC,即是堆和字符串常量池中,当你new String("abc")时,其实会先在字符串常量区生成一个abc的对象,然后new String()时会在堆中分配空间,然后此时会把字符串常量区中abc复制一个给堆中的String,故abc应该在堆中和字符串常量区

发表于 2018-10-23 11:24:17
0 0
企鹅哥哥

“abc”保存在常量池,str引用的对象保存在堆里,而java7中又把常量池移到了堆中,所以这题题目就不够严谨

发表于 2018-10-23 11:24:09
0 0