校招刷题群
高效刷题 迎战校招
校招精选试题
近年面笔经面经群内分享
Java刷题群 前端刷题群 产品运营群
首页 > java语言 > string类(后序会删除)
题目

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

A.

B.

C.字符串常量区

D.寄存器

解答

正确答案是 A C

又是研究过的文章,题目考查的为Java中的字符串常量池和JVM运行时数据区的相关概念。

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

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

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


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

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

学到数据库了 感觉有些难度 我太难了

发表于 2021-09-14 12:40:00
0 0
花将离

首先,字符串常量池本质是一个StringTable,保存的是进入常量池的字符串的引用,而字符串常量所指的"abc"对象本身还是在对当中。

所以流程如下:
1. 根据"abc"在堆当中创建一个字符串对象,并在字符串常量池中将这个对象的应用加入表(字符串常量池本身是StringTable)中。
2. 根据new,在堆中又创建一个"abc"对象,并被str引用指向。
因此,虽然一般这道题的答案是堆里面一个字符串,常量池一个字符串,但是更准确的表述是:
1. 堆里面一个字符串实例,被str引用。

2. 堆里面还有个字符串实例,被常量池引用。

发表于 2018-10-13 15:50:57
0 0
咸鱼王

没意思,这题目如果理解成 "abc"这个常量字符串在哪里,那就是C,但是如果出题人是想问,内存里面有几个"abc"分别在哪里,那么选AC
语文不好,不晓得你想问啥子~~~~~

发表于 2018-10-13 15:50:39
0 0
途安米

String str = new String(“abc”),“abc”在内存中的分配是堆,字符串常量区。

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

发表于 2018-10-13 15:50:32
0 0
人生赢家

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

发表于 2018-10-13 15:50:09
0 0
心意

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

发表于 2018-10-13 15:50:00
0 0