锁定老帖子 主题:JVM对String对象的处理
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2006-12-22
get
|
|
返回顶楼 | |
发表时间:2006-12-29
aone 写道 System.out.print((hello == ("Hel"+lo)) + " "); //false--lo为非literal的
不是太明白这一句,能不能解释一下? 首先解释一下 “那张表”不是HASHTABLE,而是JVM内部维护的常量池; 对于 System.out.print((hello == ("Hel"+lo)) + " "); 这一句 要和 System.out.print((hello == ("Hel"+"lo")) + " "); 来对照解释 : 在以上两句中("Hel"+lo) 创建了新的对象 而 ("Hel"+"lo")没有创建新的对象,而是从JVM字符串常量池中获取之前已经拘留了的"Hello"对象。 actually ,a string-valued constant expression,formed from two string literals。 同样它首先会从JVM字符串常量池中查找相应的 String对象(如“Hello”),如果找到则直接获取引用,如果不存在那么它也会被JVM拘留/intern 。 对于("Hel"+lo)创建了新的对像是因为:lo 是一个变量/引用,它并不是字面上的字符串(string literal),同理这个 表达式 也并不是一个string-valued constant expression,所以他不会被拘留,而是创建 一个新的对象。 --------- 越说越绕,希望能理解...... |
|
返回顶楼 | |
发表时间:2007-01-18
对这个的解释,我有不同的想法
# System.out.print((hello == "Hello") + " "); //true # System.out.print((hello == ("Hel"+"lo")) + " "); //true hello == ("Hel"+"lo")的结果为true,没有疑义。但是为什么是true,我认为这里应该增加一个注释,才能准确的说明问题,即"Hel"+"lo"这个表达式,编译器是有优化的,因为string是不可变的,因此"Hel","lo"都是常量,"Hel"+"lo"是常量表达式。java语言规范中常量表达式是在编译时进行求值的。因此对于"Hel"+"lo"被编译器直接处理为"Hello"。 总之,先是编译器先进行特殊处理,然后才是jvm处理,依据楼主说明的处理方式,最后得出一个true. |
|
返回顶楼 | |
发表时间:2007-04-15
skydream 写道 对这个的解释,我有不同的想法
楼上的正解
# System.out.print((hello == "Hello") + " "); //true # System.out.print((hello == ("Hel"+"lo")) + " "); //true hello == ("Hel"+"lo")的结果为true,没有疑义。但是为什么是true,我认为这里应该增加一个注释,才能准确的说明问题,即"Hel"+"lo"这个表达式,编译器是有优化的,因为string是不可变的,因此"Hel","lo"都是常量,"Hel"+"lo"是常量表达式。java语言规范中常量表达式是在编译时进行求值的。因此对于"Hel"+"lo"被编译器直接处理为"Hello"。 总之,先是编译器先进行特殊处理,然后才是jvm处理,依据楼主说明的处理方式,最后得出一个true. |
|
返回顶楼 | |
发表时间:2007-04-16
skydream 写道 对这个的解释,我有不同的想法
"Hel"+"lo"这个表达式,编译器是有优化的,因为string是不可变的,因此"Hel","lo"都是常量,"Hel"+"lo"是常量表达式。java语言规范中常量表达式是在编译时进行求值的。因此对于"Hel"+"lo"被编译器直接处理为"Hello"。 总之,先是编译器先进行特殊处理,然后才是jvm处理,依据楼主说明的处理方式,最后得出一个true. 正解 |
|
返回顶楼 | |