论坛首页 入门技术论坛

JVM对String对象的处理

浏览 10698 次
该帖已经被评为新手帖
作者 正文
   发表时间:2006-12-22  
get
0 请登录后投票
   发表时间: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,所以他不会被拘留,而是创建 一个新的对象。

---------
越说越绕,希望能理解......


0 请登录后投票
   发表时间: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.
0 请登录后投票
   发表时间: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.
楼上的正解
0 请登录后投票
   发表时间:2007-04-16  
skydream 写道
对这个的解释,我有不同的想法
"Hel"+"lo"这个表达式,编译器是有优化的,因为string是不可变的,因此"Hel","lo"都是常量,"Hel"+"lo"是常量表达式。java语言规范中常量表达式是在编译时进行求值的。因此对于"Hel"+"lo"被编译器直接处理为"Hello"。

总之,先是编译器先进行特殊处理,然后才是jvm处理,依据楼主说明的处理方式,最后得出一个true.

正解
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics