String字符串相加对比介绍(详细)
String 字符串相加 对比
public static void main(String[] args) { String a = "helloword"; final String b = "hello"; String d = "hello"; String c = b + "word"; String e = d + "word"; String f ="hello"+"word"; System.out.println(a == c); System.out.println(a == e); System.out.println(a == f); }
输出: true false true
首先要明确的是 引用数据类型 == 比较的是地址值,equal 没重写比较的是地址值,重写之后比较的是内容.String重写了,StringBuffer没有重写
其次:
a==c 为true是因为 b为final类型,当final变量是基本数据类型以及String类型时,如果在编译期间能知道它的确切值,则编译器会把它当做编译期常量使用。也就是说在用到该final变量的地方,相当于直接访问的这个常量,不需要在运行时确定。因此在上面的一段代码中,由于变量b被final修饰,因此会被当做编译器常量,所以在使用到b的地方会直接将变量b 替换为它的 值。所以 c = b+"word" 等于 c = “hello”+“word” 同--->有final时是直接比较内容而不是地址。
a ==e 为false是因为e = d+"word" 其实是创建了一个StringBuffer对象,然后用StringBuffer对象执行append方法来创建出字符串对象“ab”,然后再转换成为String。但是这个转换后的String对象,也就是上面的s3是放在堆里面的。而s4则是字符串常量,放在常量池里面。所以返回的是false。 ----->地址值不同
a ==f 为true 是因为: 常量相加的时候,其实是在编译的时候就直接相加为“helloword”,这是JVM的优化,所以运行的时候,a和f的字节码是一样的。因为在常量池中有了一个“helloword”,所以两个引用指向的是一个字符串“helloword”,所以返回结果也是true。----->指向同一个地址
【相关推荐:Java教程】
以上就是String字符串相加对比介绍(详细)的详细内容,更多请关注其它相关文章!
上一篇: Java循环队列的介绍(代码示例)
下一篇: Spring中获取泛型信息的技巧方法
推荐阅读
-
java string类的常用方法详细介绍
-
Javascript中String类型详细介绍
-
pptv和pps哪个更流畅?pptv和pps区别对比详细介绍
-
阿波罗套餐怎么样?中国移动阿波罗套餐和中国联通冰激凌套餐资费区别对比详细介绍
-
有对比才有进步 新手婚礼摄影跟拍学习记详细介绍
-
i5-8250U和R5-2500U哪个好 i5-8250U对比R5-2500U详细介绍
-
骁龙670和骁龙636有什么区别 骁龙636和骁龙670对比详细介绍
-
R5-2500U和i7-8550U哪个好 i7-8550U对比R5-2500U详细介绍
-
RT-2950X和1950X哪个好 AMD-2950X对比AMD-1950X区别详细介绍
-
R5-2500X和R5-2400G哪个好 锐龙5-2500X对比锐龙5-2400G详细介绍