**
关于java String ==
先直接看如下的例子,你可以先分别思考一下下面的结果是什么。
首先我们要知道 == 比较的是两个对象的引用是否相同 ,或者说这两个对象是否是占用同一块内存堆区的。
有了上面的了解我们就可以开始思考这些输出是什么了。
s1s2 按照上面的理解 创建了两个对象 那么他们的肯定是不相等的。这样的理解是没有问题,但是jvm有一块分区叫做String缓冲池,他用来存放String的值,当我们 String s1=“nihao”的时候,它会先去缓冲池中寻找有没有“nihao”,那根据上图 答案是没有,那么此时就会创建一个“nihao”,然后让s1去指向它。当String s2="nihao"时,由于已经存在了nihao对象,s2直接指向它,所以s1和s2地址相同,因此 s1s2输出True;
s2s3 继续根据上面说的 ,去缓冲池寻找"nihao" 找到有,OK,不用在缓冲池创建新对象,但是 s3这个语句 创建了一个对象在jvm堆区,因此s3的意思是 在缓冲区创建“nihao”,然后把这个值赋值给在堆区的s3,因此其实s3和s2的地址不同,s2s3返回False;
s3s4 同上理,因为他们的语句之前就先创建好了不同的对象,要做的后面只是赋值,因此s3s4返回False
s1s5 其实s5的创建方式对于系统来说就相当于S1的方式,因此s1s5 返回True
s5s6 s6 也同样的先创建了一个对象在堆区,赋值“hao”,然后进行字符串拼接,因此两者的内存地址不同,返回Flase
s3s5 同 s2s3 不多说了
s7s1 有人可能会疑惑,这s7和s5的创建方式不是很像吗,实则不是。原来两个字符串a, b的拼接首先会调用 String.valueOf(obj),这个Obj为a,而String.valueOf(Obj)中的实现是return obj == null ? “null” : obj.toString(), 然后产生StringBuilder, 调用的StringBuilder(str1)构造方法,这个StringBuilder是在堆区创建的,因此,s7==s1也返回 False。
结果图如下。