如下代码(《深入理解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字符串为什么再次特殊?还有什么字符是特殊的?
字符串“java”在常量池中,==比较的时候,比较的是所指向的引用而不是值,str2.intern()的引用地址和str2是不同的,但如果使用equals比较,它们的值都是相同的。str2.intern()其实是将“java”放进常量池中,str2则是new出来的一个占用独立内存空间的“java”字符串。
谢谢您的解释。是我的失误,我没有描述清楚问题,这个问题主要想知道为什么“java”会已经在常量池中,我并没有定义如此一个字符串,而且常量池初始应该是空的。原程序运行结果true false,但是换成其他字符,不用java,像这样:
String str2 = new StringBuilder("jaa").append("va").toString();
运行结果又是true true
@nonefly: 怀疑"java"是个常量池初始值,常量池并不一定是空,这玩意只能查看常量池实现的源代码了
@JeffWong:
api上说的初始时空的的
不了解intern()是什么。我理解只要有字符串池,那么只要相同的字符串 引用都应该相等才有意议。
所以这种比较应该全部为true才对。
应该都为false才对,不了解java.
C#的到是很清楚,只要是直接字 "Hello"这种都在字符串常量池中,而其它出来的都是新的空间。