class StringDemo { public static void main(String[] args) { char[] msg = {'h','e','l','l','o'}; String t1 = "hello"; String t2 = new String("hello"); String t3 = new String(msg); String t4 = t3; String t5 = "hello"; System.out.println(t1==t2);//false System.out.println(t2==t3);//false System.out.println(t3==t4);//true System.out.println(t5==t1);//true System.out.println(t1.equals(t1));//true System.out.println(t1.equals(t2));//true System.out.println(t1.equals(t3));//true System.out.println(t1.equals(t4));//true System.out.println(t1.equals(t5));//true } }
new 出来的String类型和t1这种“常亮型”声明不同,在内存上也放在的不同的地方,在Java中String里面的=判断,是在内存地址上是不同的,不是同一个对象,=比较的就是不是同一个对象。任何new出来的类型变量都不会“相等”。
Java中存在一个串池,
s和s1引用的是同一个字符串对象.
String s = "hello";
String s1 = "hello";
这两句只会创建一个"hello"字符串放入串池里面,s和s1只是这个字符串的两个引用而已.

用oop来解释的话:
java中的==是用来判断对象所使用的内存地址是不是同一个,进而判断是不是同一个对象。例如 objA == objB
注意这里是同一个对象才会是true,如果不是同一个对象,哪怕两个对象所有属性都相同也会返回false。
而equals则是一个方法,你可以为自己的类编写equals方法来判断是不是相等。这里String类就提供了equals方法来判断两个String对象是不是相同,而不是去判断两个String对象是不是同一个对象,因为我们一般使用中,只关心两个字符串内容相同与否,而不会关心是不是同一个对象。