“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");
。如果说都是在堆中分配这个意思的话,那就是等效的。
时间: 2024-11-12 19:44:09