很简单的问题,记录一下
下面的程序很简单吧?你能保证你说的结论都是正确的吗?运行验证下你的猜测。
public class T{
public static void main(String[] args){
String s1="a1";
String s2="a1";
String s3 = "a"+"1";
String s4 = "a"+1;
String s5 = "a"+Integer.parseInt("1");
int i = 1;
String s6 = "a"+i;
System.out.println(s1==s2);
System.out.println(s1==s3);
System.out.println(s1==s4);
System.out.println(s1==s5);
System.out.println(s1==s6);
}
}
结果有没有惊到你呢?
都知道String比较要用equals方法来比较其内容,用==比较的是两个对象的地址值,但上面的程序运行结果好像不是那么回事呢?
Java中String有常量池,如果已经存在,就不会再创建同样的字符串常量了(new的不算)
这样s1==s2就很好理解了,都指向常量池中同一个对象,地址当然一样了
s3和s4虽然+了一个不一样的值,但都是常量运算,编译期间就知道结果了,是一个定值,所以结果也指向了同一个常量池中的对象
s5不是也加了一个1吗,不是和s4一样的吗?结果为什么不同呢?加了一个1???真的是吗?确实是呀,没错,你看到的确实是,但我们的程序运行的,paseInt方法只有在运行后才可能知道结果,运行后计算结果,就需要给参与运算的数据分配存储空间,运算结果也要存起来,自然不是指向常量池里的那个对象了(理解的如有错误还请指正)
s6与s5类似,只有在运行时才能确定具体的值
public class T{
public static void main(String[] args){
String s1="a1";
String s2="a1";
String s3 = "a"+"1";
String s4 = "a"+1;
String s5 = "a"+Integer.parseInt("1");
int i = 1;
String s6 = "a"+i;
System.out.println(s1==s2);//true 很好理解,常量池
System.out.println(s1==s3);//true 还能理解,常量运算,值确定
System.out.println(s1==s4);//true 同上
System.out.println(s1==s5);//false 有点难以理解吧,这不跟上面一样吗?
//还真不一样,因为调用方法后的值只有在运行后才能确定
System.out.println(s1==s6);//false 解释上面,这样就好理解了
//不确定的值运算要存储结果吧,
//所以就分配空间了,与最上面true的情况就不同了
}
}