首页 新闻 搜索 专区 学院

关于常量池内存分配

0
[已解决问题] 解决于 2015-08-31 15:24

如下代码(《深入理解Java虚拟机》周志明 p57),还是不理解为什么两个值一个true一个false(jdk 1.7实验)

public static void main(String[] args) {
        String str1 = new StringBuilder("你好").append("世界").toString();
        System.out.println(str1.intern() == str1);
        
        String str2 = new StringBuilder("ja").append("va").toString();
        System.out.println(str2.intern() == str2);

}
问题补充:

程序运行结果为true  false

如果改为

String str2 = new StringBuilder("jaa").append("va").toString();

仅仅不用java字符串,结果又是true true了,java字符串为什么再次特殊?还有什么字符是特殊的?

nonefly的主页 nonefly | 菜鸟二级 | 园豆:202
提问于:2015-07-23 14:13
< >
分享
最佳答案
0

字符串“java”在常量池中,==比较的时候,比较的是所指向的引用而不是值,str2.intern()的引用地址和str2是不同的,但如果使用equals比较,它们的值都是相同的。str2.intern()其实是将“java”放进常量池中,str2则是new出来的一个占用独立内存空间的“java”字符串。

奖励园豆:5
JeffWong | 老鸟四级 |园豆:2021 | 2015-07-23 16:03

谢谢您的解释。是我的失误,我没有描述清楚问题,这个问题主要想知道为什么“java”会已经在常量池中,我并没有定义如此一个字符串,而且常量池初始应该是空的。原程序运行结果true false,但是换成其他字符,不用java,像这样:

String str2 = new StringBuilder("jaa").append("va").toString();

运行结果又是true true

nonefly | 园豆:202 (菜鸟二级) | 2015-07-23 16:45

@nonefly: 怀疑"java"是个常量池初始值,常量池并不一定是空,这玩意只能查看常量池实现的源代码了

JeffWong | 园豆:2021 (老鸟四级) | 2015-07-23 18:04

@JeffWong: 

api上说的初始时空的的

nonefly | 园豆:202 (菜鸟二级) | 2015-07-23 22:56
其他回答(1)
0

不了解intern()是什么。我理解只要有字符串池,那么只要相同的字符串 引用都应该相等才有意议。

所以这种比较应该全部为true才对。

应该都为false才对,不了解java.

C#的到是很清楚,只要是直接字 "Hello"这种都在字符串常量池中,而其它出来的都是新的空间。

gw2010 | 园豆:1399 (小虾三级) | 2015-07-29 17:43
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册