首页 > 试题广场 >

String str1 = “abc”,“abc”分配在内存

[单选题]
String str1 = “abc”,“abc”分配在内存哪个区域?
  • 字符串常量区
  • 寄存器
推荐
答案:C
用new创建的对象在堆区
函数中的临时变量在栈去
java中的字符串在字符串常量区
编辑于 2015-01-10 21:03:57 回复(14)
1,寄存器:存取数据最快的地方,不能直接控制 2,堆栈(又叫栈stack)位于RAM(随机访问存储器)中,通过堆栈指针上下移动来实现存取数据,堆栈指针向下移动,则分配新的内存,堆栈指针向上移动,则释放内存,堆栈的优势是,存取速度要比堆块,仅次于位于CPU中的寄存器,但是java系统必须知道存储在堆栈内所有项目的确切生命周期,以便上下移动指针。 <1>Java的基本数据类型共有8种,即int, short, long, byte, float, double, boolean, char(注意,string类型不是基本类型)。基本类型的定义是通过诸如int a = 3; long b = 255L;的形式来定义的,称为自动变量。出于追求速度的原因,它们存在于堆栈中。 <2>Java中对象的引用 堆栈有一个很重要的特殊性,就是存在于堆栈中的数据可以共享。 3,堆: 一个通用的内存池(也位于RAM中),用来存放所有的java对象,通过new关键字实现在堆中分配内存。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。 4,常量存储: 常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。有时,在嵌入式系统中,常量本身会和其它部分隔离开,所以在这种情况下,可以选择将其存放在 ROM(read-only memory,只读存储器)中。(本题中的字符串就是存储在字符串常量区中的) 5,非RAM存储: 如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。其中两个基本的例子是“流对象(streamed object)”和“持久化对(persistent object)”。在“流对象”中,对象转化成字节流,通常被发送给另一台机器。在“持久化对象”中,对象被存放于磁盘上,因此,即使程序终止,它们仍可以保持自己的状态。这种存储方式的技巧在于:把对象转化成可以存放在其它媒介上的事物,在需要时,可恢复成常规的、基于 RAM 的对象
发表于 2016-07-20 22:57:01 回复(2)

发表于 2020-03-01 14:05:14 回复(0)
堆:存放对象
栈:存放基本数据和对象引用(引用不是对象本身)
静态域:对象中的静态成员变量
常量池:存放常量
发表于 2018-09-11 10:49:55 回复(0)
用new创建的对象在堆区,
函数中的临时变量在栈里,
字符串在字符串常量区里
发表于 2017-08-24 13:30:40 回复(0)
【2021-06-02更新】
时隔5年,还经常受到“您的答案又被xxx赞同了,感慨万千
在此打个小广告,字节跳动TikTok广告正在招募算法工程师,基础架构工程师,校招、实习、社招均可,base北京中关村,感兴趣可以找我私聊

此题极为不严谨,答案与具体的JVM类型和具体的JVM版本都有关系。以下分析基于广泛使用的Oracle HotSpot虚拟机:
首先,String str1 = “abc” 编译为字节码后,实际上相当于:String str1 = “abc”.intern()

对于JDK 1.6,intern()方法是这样的:如果“abc”是首次遇到,则字符串“abc”本身会被复制到字符串常量池中,且以后如果再遇到“abc”,直接返回常量池的引用。注意,JDK 1.6的常量池存在于JVM的永久代中,而对于Hotspot虚拟机的实现,永久代事实上对应java虚拟机规范中的方法区

对于JDK 1.7,intern()方法不会对字符串实例进行复制,而只是在字符串常量池中记录首次出现的实例引用。当然,最关键的是,JDK 1.7中的字符串常量池是在堆中的!
具体请参考 “深入理解JAVA虚拟机”一书中 第 42页 和 第57页 的讨论
编辑于 2021-06-02 16:48:37 回复(10)
C :
栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中

堆:存放用new产生的数据

静态域:存放在对象中用static定义的静态成员

常量池:存放常量

非RAM存储:硬盘等永久存储空间

发表于 2015-04-24 15:01:26 回复(3)
java堆区和栈区的区别
堆区(Heap):堆区中存放的是对象以及每个对象对应的class的信息,其中存放class的信息主要是为了获取类的操作指令
jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身.
栈区(Stack):
每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象),对象都存放在堆区中
每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。
由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.

静态区 / 方法区:
1 .方法区又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2 .方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
3 .全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 (参考网络)
String str1 = “abc”,“abc”分配在内存哪个区域? "abc" 为String类的常量,选C
编辑于 2016-06-27 17:17:04 回复(0)
对于字符串来说,其对象的引用都是存储在栈中的,如果是编译期已经创建好(即指用双引号定义的)的就存储在常量池中,如果是运行期(new出来的对象)则存储在堆中。
发表于 2016-08-25 08:39:56 回复(0)
此题极为不严谨

发表于 2016-10-10 20:10:07 回复(0)
C++题库哪来那么多Java的题
发表于 2020-08-25 17:24:25 回复(0)
JDK1.7之后,字符串常量区被移到了堆中
发表于 2020-07-26 18:14:39 回复(0)
此题应该加限制。java8将常量和类变量移到了堆空间!java8以前是选c,记住就行!
发表于 2020-05-27 16:40:20 回复(1)
在JDK 8 中,字符串常量 "abc" 会被分配到方法区(Metaspace)的运行时常量池中。这意味着在内存中只会有一个 "abc" 的实例,在不同的地方使用该字符串时都会指向相同的内存地址,以节省内存空间。
发表于 2023-11-30 08:12:01 回复(0)
new创建的是堆方法中的是栈直接赋值的是字符串常用区
发表于 2021-04-06 08:23:07 回复(0)

栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中堆:存放用new产生的数据。
静态域:存放在对象中用static定义的静态成员
常量池:存放常量
非RAM存储:硬盘等永久存储空间

编辑于 2021-03-05 12:27:53 回复(0)
我选的C++练习然后来了个大写String,我就知道有问题了。
C++里面这里的operator=()其实是调用的拷贝构造函数来初始化str1对象
发表于 2020-09-11 16:20:40 回复(0)
答案:C 用new创建的对象在堆区 函数中的临时变量在栈去 java中的字符串在字符串常量区
发表于 2020-09-04 19:27:37 回复(0)
堆存放new出来的数据
栈存放变量
发表于 2020-08-28 21:09:32 回复(0)
<p>首先说明自己的观点,选择A。</p><p>该语句在运行时涉及到一个对象,即字面量“123”在堆中创建的对象,并将其引用驻留在字符串常量池中。</p><p><br></p>
发表于 2020-08-20 09:05:33 回复(0)
用new和malloc创建的变量在堆区。 栈区存放局部变量。 而字符串在字符常量区。
发表于 2020-08-18 12:13:43 回复(0)