==和equel

==:

1、比較的是操作符兩端的操作數是否是同一個對象
2、兩邊的操作數必須是同一類型的(可以是父子類之間)才能編譯通過。
3、比較的是地址,如果是具體的阿拉伯數字的比較,值相等則爲TRUE,如:
int a=10 與 long b=10L 與 double c=10.0都是相同的(爲true),因爲他們都指向地址爲10的堆

equals:
1、比較的是兩個對象的內容是否一樣

String s="abce"是一種非常特殊的形式,和new 有本質的區別。它是java中唯一不需要new 就可以產生對象的途徑。以String s="abce";形式賦值在java中叫直接量,它是在常量池中而不是象new一樣放在壓縮堆中。這種形式的字符串,在JVM內部發生字符串拘留,即當聲明這樣的一個字符串後,JVM會在常量池中先查找有有沒有一個值爲"abcd"的對象,如果有,就會把它賦給當前引用.即原來那個引用和現在這個引用指點向了同一對象,如果沒有,則在常量池中新創建一個"abcd",下一次如果有String s1 = "abcd";又會將s1指向"abcd"這個對象,即以這形式聲明的字符串,只要值相等,任何多個引用都指向同一對象.
而String s = new String("abcd");和其它任何對象一樣.每調用一次就產生一個對象,只要它們調用。

也可以這麼理解: String str = "hello"; 先在內存中找是不是有"hello"這個對象,如果有,就讓str指向那個"hello".如果內存裏沒有"hello",就創建一個新的對象保存"hello". String str=new String ("hello") 就是不管內存裏是不是已經有"hello"這個對象,都新建一個對象保存"hello"

具體可以看下面的代碼:

複製代碼
public class test1 {
    public static void main(String[] args) {
        String a = new String("ab"); // a 爲一個引用
        String b = new String("ab"); // b爲另一個引用,對象的內容一樣
        String aa = "ab"; // 放在常量池中
        String bb = "ab"; // 從常量池中查找
        if (aa == bb) // true
            System.out.println("aa==bb");
        if (a == b) // false,非同一對象
            System.out.println("a==b");
        if (a.equals(b)) // true
            System.out.println("aEQb");
        if (42 == 42.0) { // true
            System.out.println("true");
        }
    }
}
發佈了21 篇原創文章 · 獲贊 4 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章