java问题:堆内存中的是否存在相同内容的存储区域?

举个例子,定义两个字符串类型:Stringstr1=“hello”;Stringstr2="hello";这两个字符串引用类型所指的内容相同,那么在堆内存中是不是分配了两... 举个例子,定义两个字符串类型:

String str1 = “hello”;
String str2 = "hello";
这两个字符串引用类型所指的内容相同,那么在堆内存中是不是分配了两块内容相同的内存区域?还是两个字符串引用类型都指向了内容为“hello”的同一个内存区域?
求解答
展开
 我来答
heptnaol
推荐于2016-02-24 · TA获得超过7259个赞
知道大有可为答主
回答量:7120
采纳率:78%
帮助的人:1742万
展开全部
对于常量字符串,java把相同内容的只分配一块内存,有个叫字符串池的东东,对于重复的用引号的字符串,只保留一份。
不过如果你写 str1 = new String("abc"),这个abc不会放在池中,而是放在堆中。
追问
那放在堆中也是只保留一份吗?
另外常量池又是分配在内存的什么地方?
追答
堆中不是,有多个。
池有String类的native方法intern()维护
以下是摘抄的注释:
/**
* Returns an interned string equal to this string. The VM maintains an internal set of
* unique strings. All string literals found in loaded classes'
* constant pools are automatically interned. Manually-interned strings are only weakly
* referenced, so calling {@code intern} won't lead to unwanted retention.
*
* Interning is typically used because it guarantees that for interned strings
* {@code a} and {@code b}, {@code a.equals(b)} can be simplified to
* {@code a == b}. (This is not true of non-interned strings.)
*
* Many applications find it simpler and more convenient to use an explicit
* {@link java.util.HashMap} to implement their own pools.
*/
public native String intern();
具体实现有VM决定,可能也在java堆中,也可能在VM进程的堆中。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
goodczs
2014-09-12 · TA获得超过2118个赞
知道小有建树答主
回答量:2251
采纳率:0%
帮助的人:929万
展开全部
一般来说是独立的,但不排除编译器优化后是同一区域的可能性,因为这属于常量字符串,编译器可能优化成一个。
java可能不太好测试,如果是C的话,可以用指针修改其中一个常量的值再输出。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
清水栞
2014-09-12 · TA获得超过1547个赞
知道小有建树答主
回答量:1538
采纳率:50%
帮助的人:970万
展开全部
内存中分配了一个区域放着hello,然后str1和str2都指向这个地方
追问
意思是只要指向的内容相同,则认为只分配了相同的一块内存空间,不会分配第二份?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式