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對象是不是同一個對象,因為我們一般使用中,只關心兩個字符串內容相同與否,而不會關心是不是同一個對象。