==與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方法