String比较为什么要用equals?用==的问题

来源:互联网 发布:js 弹出输入框 编辑:程序博客网 时间:2024/06/15 22:39

很简单的问题,记录一下

下面的程序很简单吧?你能保证你说的结论都是正确的吗?运行验证下你的猜测。

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的情况就不同了}}



0 0
原创粉丝点击