==是比较用的是不是同一个地址里的内容并且比较两个内容是否相等
String拼接有两种占内存的形式:
1.常量拼接:
String a = "a";
String b ="bc";
String c ="a"+"bc";
String d="abc";
因为是常量,所以会在java常量池中存放一个a和一个bc,在拼接的时候因为没有abc字符串,但常量池中有a,bc会直接将已有的a和bc拼接起来也放在常量池中。再给d赋值abc时常量池已经有直接用就行。用==比较c和d因为用的都是常量池里的abc所以返回的结果是true。
2.变量拼接
String A=new String("a");
String B=new String("bc");
String c=A+B;
String d=new String("abc")
A是个对象会在栈中开辟一块空间,使用new String会在堆中开辟一块空间。B和c、d都会同样开辟出不同的新的空间,对象实例在栈中开辟空间、new String在堆中开辟空间,但里面的字符串a和bc会存放在常量池中,栈中的A、B、c、d会有堆中new开辟出那块空间的地址指向堆中的数据,而对象A想用a这个字符串就会在它的堆中指向常量池中a的地址,放在常量池的目的是:别的对象想调用a时就不用再开辟新的空间从而造成内存空间的浪费。其他对象也是同样的方法存放字符串。
jvm内存图如下:
c=A+B就是用变量拼接,只要有一个变量就是变量拼接,拼接的原理是StringBuilder,也就是在堆中新开辟出一个一个空间放已经拼接好的abc而不是放常量池中,所以用==比较c和d的值时c的abc是在堆中的而d的abc是在常量池中的所以返回的的结果是false。
String e=c.intern();
如果用了以上方法再比较e==d返回的结果就是true了,因为会吧堆中的内容abc放入常量池中。



