java中equals和==詳解

        首先需要了解,java中的數據類型分爲基本數據類型和引用數據類型,基本數據類型有byte,short,int,long,float,double,char,boolean,除了這8中基本數據類型剩下的都是引用數據類型.

       基本數據類型的存儲原理:所有的基本數據類型不存在「引用」的概念,基本數據類型都是直接存儲在內存中的內存棧上的,數據本身的值就是存儲在棧空間裏面.引用數據類型的存儲原理:引用數據類型繼承於Object類(也是引用類型)都是按照Java裏面存儲對象的內存模型來進行數據存儲的,使用Java內存堆和內存棧來進行這種類型的數據存儲,簡單地講,「引用」是存儲在有序的內存棧上的,而對象本身的值存儲在內存堆上的.

       當我們使用"=="來比較基本數據類型的數據時,我們比較的是基本數據的值,它沒有引用的概念,而當我們使用"=="來比較引用數據類型時,它比較的是引用數據類型是否指向內存堆上的同一個對象,即內存地址值是否相同.

       通常情況下,當我們比較兩個字符串是否相同的時候,我們希望比較的是它們的內容是否相同,此時我們用"=="比較的卻是它們的引用

       例如:   String  s1  =  "abc" ;

                   String  s2  =  new  String("abc");

                   System.out.println(s1 == s2);//false

       該引出equals方法了,因爲Objec類是所有類的父類,而Object類中的equals方法源碼如下:

      

       依然是在比較對象引用的是否是同一內存堆上的值,即引用地址值是否相同,但當我們調用字符串的equals方法時:

       System.out.println(s1.equals(s2));//true

       原來String類複寫了Object類的equals方法,源碼如下:

      

       閱讀源碼可以知道,我們會先判斷兩個字符串是否是同一個引用地址,如果是,返回true(引用地址相同,那麼值一定相同);接着,判斷被equals的對象是否是String類型,如果不是,返回false;接着往下,如果長度相同並且每個字符相同,則返回true,

       總結,多看源碼身體好!