区别:
String s1 = new String(“hello”)会创建2个对象,首先是new String(“hello”)会创建一个字面量对象保存到字符串常量池中,然后在堆内存中申请内存存储String类型的对象,地址值赋给引用 s1;s1会去方法区的常量池中找有没有“hello”,如果有的话会将s1的引用地址指向常量池的“hello”
String s = “hello”由于上述过程,常量池中已经存储了一个hello,此时只需要将hello所在空间的地址值赋给引用 s;
因为 == 比较的是内存地址是否相同,s1和s是在堆内存中的两个不同地址的引用,所以结果是false
此后又新建s2对象并赋值s,相当于把s复制一份取名s2;因为s2指向的也是常量池中的“hello”,所以s2的引用地址和s的地址一样
因为.equals是比较两个字符串内容是否相同,所以s.equals(s1)为true
回顾:
==,比较运算符,可以比较基本类型,也可以比较引用类型。
- 比较基本类型时,比较的是值是否相同
- 比较引用类型时,比较的是地址值是否相同
equals方法,是Object类中的方法,只能比较引用类型
- 没有重写时,比较的是地址值
- 重写后,一般比较的是引用所指的对象的内容