String+变量”的操作是在运行时进行
Posted 安谧世界
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了String+变量”的操作是在运行时进行相关的知识,希望对你有一定的参考价值。
“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+变量”的操作是在运行时进行的主要内容,如果未能解决你的问题,请参考以下文章
java中如何把一个String类型的变量转换成double型的?