今天在看博客时看到这样一段代码:
public class Test {
public static void main(String[] args) {
String a = "hello1";
final String b = "hello";
String c = "hello";
String d = b + 1;
String e = c + 1;
System.out.println(a==d);
System.out.println(a==e);
}
}
以上代码的运行结果为:
true
false
我不知道大家一开始是怎么想的,我一开始认为这段代码的运行结果为false
和false
。
我是这么认为的,b和c都指向常量池中的字符串"hello"
,当它们各加上1的时候,先会把1自动包装为Integer对象,再调用Integer的toString()方法,然后两个字符串相加,所得的字符串肯定是堆内存中的字符串。那么a、d、e这三个字符串的地址都不一样,结果应该为false
和false
。但是根据运行结果来看,实际并不是这样。
最后我看了其他的一些博客,根据自己的理解,认为这个问题可以从以下几个方面来解答,有错误之处还请大家指正:
final关键字
final关键字用于基本类型和String的时候,类似于C里面宏,在变量所在的地方,直接替换为基本类型或String本身,也就是说在上述代码中变量b存在的位置可以直接看成是字符串"hello"
,b+1
也就是"hello"+1
。基本类型与String相加
之前我一直以为基本类型与String相加的时候,是先自动包装在调用toString()转化,但是根据运行结果来看,当基本类型数据和String数据相加的时候,直接把基本数据类型看做String,就是说"hello"+1
就是"hello"+"1"
。String的相加
两个常量String的相加得到的新String还是常量池里的String;两个String中含有一个常规堆内存的String,得到的新String就是常规堆内存的String。