String内部维护的是一个Char数组,所以所有的String对象都是一个数组,String 在比较值是否相等的时候也是通过遍历这个数组进行对比
如果有一个char字符是不等的,则返回 false, 但是比较值的方法 java 中有两种方式 == 和 equals:
用==比较的时候,如果两个都是对象,则比较的是地址,如果是基本数据类型则比较的就是本身的值
所以凡是出现 new关键字的话 其地址一定不相等,因为是要在堆内存中开辟地址保存数据的
用==如果是对象和基本数据类型相比的话,比如Integer会自动拆箱成int再和int值比较,所以本质上还是int和int的值比较
String 的话用==比较的首先是地址,但是String会有一个缓存机制,也就是常量池,1.7以后的常量池是在堆内存中
String 对象进入常量池有两种方法,一种是 显示声明,就是双引号,一种是intern方法
上面就是显示声明,就是双引号直接赋值一个字符串给变量,编译器看到这种就会直接放入常量池中,下次有变量再显示声明
就会直接取常量池里的对象,所以是同一个对象,地址也相等
如果是new的话,肯定不等,因为是在内存中两个不同的地方,地址肯定不等,但如果用intern这个方法,这个方法会从常量池里
找到字符串的值然后返回,如果常量池里没有,就会新加入这个字符串“abc”然后再返回回来,所以无论如何都会返回这个字符串,而常量池里也一定会因为这个动作而存在这个字符串“abc”,注意:
new String("abc")
这种也是会显示声明字符串“abc”的,所以这个时候常量池中已经有了“abc”