java问题:堆内存中的是否存在相同内容的存储区域?
举个例子,定义两个字符串类型:Stringstr1=“hello”;Stringstr2="hello";这两个字符串引用类型所指的内容相同,那么在堆内存中是不是分配了两...
举个例子,定义两个字符串类型:
String str1 = “hello”;
String str2 = "hello";
这两个字符串引用类型所指的内容相同,那么在堆内存中是不是分配了两块内容相同的内存区域?还是两个字符串引用类型都指向了内容为“hello”的同一个内存区域?
求解答 展开
String str1 = “hello”;
String str2 = "hello";
这两个字符串引用类型所指的内容相同,那么在堆内存中是不是分配了两块内容相同的内存区域?还是两个字符串引用类型都指向了内容为“hello”的同一个内存区域?
求解答 展开
3个回答
展开全部
对于常量字符串,java把相同内容的只分配一块内存,有个叫字符串池的东东,对于重复的用引号的字符串,只保留一份。
不过如果你写 str1 = new String("abc"),这个abc不会放在池中,而是放在堆中。
不过如果你写 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进程的堆中。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一般来说是独立的,但不排除编译器优化后是同一区域的可能性,因为这属于常量字符串,编译器可能优化成一个。
java可能不太好测试,如果是C的话,可以用指针修改其中一个常量的值再输出。
java可能不太好测试,如果是C的话,可以用指针修改其中一个常量的值再输出。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
内存中分配了一个区域放着hello,然后str1和str2都指向这个地方
追问
意思是只要指向的内容相同,则认为只分配了相同的一块内存空间,不会分配第二份?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询