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字符串相加对照引见(细致)的细致内容,更多请关注ki4网别的相干文章!