==與equals比較

提到==與equals的區別,這就必須先回顧一下jvm記憶體的分配機制

==和equals無非比較兩個基本數據類型或者對象類型

八種基本類型:

基本類型 大小 默認值 封裝類
byte 1 0 Byte
short 2 0 Short
int 4 0 Integer
long 8 0L Long
float 4 0.0f Float
double 8 0.0d Double
boolean   false

Boolean

char 2 \u0000(null) Character

基本數據型比較:==

       這八種數據類型存儲在棧中,他們是作為常量在方法區中的常量池裡面以HashSet策略存儲起來的,值一樣的常量只有一個地址。我們用==比較是沒問題的,String是一個比較特殊的對象類型,他不用new就可以創建一個對象因此他也類似於基本數據類型儲存起來,可以用==比較,當然如果通過new的方式創建的對象就必須通過下面對象類型方式的比較。 

   int a=1;
   int b=1;
   System.out.println(a==b); //結果為ture
   Integer c=128;
   Integer d=128;
   System.out.println(c==d);//結果為false
String str="123";
String str2="123";
System.out.println(str == str2);//結果為ture

      是不是覺得很奇怪,上面明明說基本數據類型只要值一樣存放的地址也一樣為什麼到Integer變了呢。 其實是這樣的Integer的範圍區間在 -128~+127之間,那麼我們讓他等於128超出了它的範圍他就無法在常量池中(常量池會初始化-128~+127的所有Integer對象)獲取到該值得地址,就會去new一個Integer類型的對象,因此地址不同比較結果返回了false就不難理解了。(這裡涉及到了java自動裝箱和拆箱)

對象數據類型比較:equals

       對象數據類型存儲在堆中,棧中生成對應的引用,當我們創建一個對象後,在後續得使用中都是使用引用來操作對象,所以對象即便所有的屬性都相等,但在棧中存放的地址不同使用==比較也會返回false

其實我們點進equals方法內部可以看到他用的還是==比較,那麼他怎麼解決對象之間的比較呢? 重寫,我們可以一個class中重寫equals方法以此來達到比較對象的屬性是否相等。其中String 自己已經重寫好了equals方法

Tags: