String是java中常用的类之一,属于不可变的类。java规范中对String类型也进行了特殊的处理。
JDK8规范官方文档关于String
先从例子开始:
String str = "kanshan";
String str1 = "kan" + "shan"; //1
String prefix= "kan";
String str2 = prefix + "shan"; //2
System.out.println(str == str1);
System.out.println(str == str2);
结果为:
true
false
解析:
jdk1.8下反编译信息
str1可以查看到直接是 kanshan, 编译器直接帮我们优化了,只生成了一个字符串。
str2也是编译器优化的作用,显示是生成了一个StringBuilder类,通过append拼接,toString 生成字符串。但是为什么str2 == str 为false。
查看StringBuilder源码的 toString 方法。
@Override
public String toString() {
// Create a copy, don't share the array
return new String(value, 0, count);
}
通过new String生成一个对象了,导致地址值对比不同。
其它点:
String str = "1" + 2 + 3; //1
String str1 = 1 + 2 + "3"; // 2
System.out.println(str);
System.out.println(str1);
System.out.println(str == str1);
这两个字符串相等吗?
执行结果
123
33
false
操作符 + 的优先级在java中是由左向右的,因此2中先计算 1 + 2 后,将基本类型转化为字符串拼接。