JAVA當中所有的類都是繼承於Object這個基類的,在Object中的基類中定義了一個equals的方法,這個方法的初始行爲是比較對象的內存地 址,但在一些類庫當中這個方法被覆蓋掉了,如String,Integer,Date在這些類當中equals有其自身的實現,而不再是比較類在堆內存中的存放地址了。
public class TestString {
public static void main(String[] args) {
String s1 = "Monday";
String s2 = new String("Monday");
if (s1 == s2)
{System.out.println("s1 == s2");}
else
{System.out.println("s1 != s2");}
if (s1.equals(s2)) {System.out.println("s1 equals s2");}
else{
System.out.println("s1 not equals s2");}
}
}
原來,程序在運行的時候會創建一個字符串緩衝池當使用 s2 = "Monday" 這樣的表達是創建字符串的時候,程序首先會在這個String緩衝池中尋找相同值的對象,在第一個程序中,s1先被放到了池中,所以在s2被創建的時候,程序找到了具有相同值的 s1
將s2引用s1所引用的對象"Monday"
第二段程序中,使用了 new 操作符,他明白的告訴程序:"我要一個新的!不要舊的!"於是一個新的"Monday"Sting對象被創建在內存中。他們的值相同,但是位置不同,一個在池中游泳一個在岸邊休息。哎呀,真是資源浪費,明明是一樣的非要分開做什麼呢?
以上是我做的一個小實驗,由於StringBuffer沒有重寫equals()方法,所以比的還是地址,所以a==b爲false,其他同理