码迷,mamicode.com
首页 > 其他好文 > 详细

String+变量”的操作是在运行时进行

时间:2016-07-01 11:41:07      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:

“String+变量”因为编译时无法进行优化(为什么无法进行优化),所以这一条语句的操作是在运行时进行的,且会产生新的对象,而不是直接从jvm的string池中获取。 那么新的对象是保存在哪里呢?是堆中吗?
如下代码:
1. String a = "ab"; 
 
2. String bb = "b"; 
 
3. String b = "a" + bb; 
 
System.out.println((a == b));
java中String的+运算符编译后其实是转换成了这样的代码:
3. String b = new StringBuilder().append("a").append(bb).toString();
看下StringBuilder的toString方法,使用new String(...);来构造一个String对象。

String有两种构造方法,一种是new String,在jvm堆中分配,一种是String a="ab"这种方式,这种特殊的方式过程是这样的:JVM会先在string pool中去查找是否存在"ab"这样的字符串,如果存在就把引用地址返回,如果不存在,则构造一个并把它放到string pool中。

很明显3的构造方法是使用了new来构造的,因此在jvm中的引用地址跟a肯定是不一样,你使用==来比较,比较的是它们的引用地址,它们肯定不相等,当然是false了。
“+”这个连接符在编译后是String b = new StringBuilder().append("a").append(bb).toString();不能说
String b = "a" + bb;
在运行中等效于
String b = new String("ab");
。如果说都是在堆中分配这个意思的话,那就是等效的。

String+变量”的操作是在运行时进行

标签:

原文地址:http://www.cnblogs.com/chenlong-50954265/p/5632275.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!