在講 == 和 equals原理之前,我們需要了解
- 整 型 byte 、short 、int 、long
- 浮點型 float 、double
- 字符型 char
- 布爾型 boolean
數據類型 | 佔用字節 | 佔用位數 | 默認值 | 封裝器類(引用數據類型) | 取值範圍 |
byte (位) | 1 | 8 | 0 |
public final class Byte extends Number implements Comparable<Byte> |
-2^7 至 2^7-1 |
short (短整數) | 2 | 16 | 0 |
public final class Short extends Number implements Comparable<Short> |
-2^15 至 2^15-1 |
int (整數) | 4 | 32 | 0 | public final class Integer extends Number implements Comparable<Integer> |
-2^31 至 2^31-1 |
long(長整數) | 8 | 64 | 0 |
public final class Long extends Number implements Comparable<Long> |
-2^63 至 2^63-1 |
float (單精度) | 4 | 32 | 0.0 |
public final class Float extends Number implements Comparable<Float> |
-2^31 至 2^31-1 |
double(雙精度) | 8 | 64 | 0.0 |
public final class Double extends Number implements Comparable<Double> |
-2^63 至 2^63-1 |
char(字符) | 2 | 16 | 空格 |
public final class Character extends Object implements Serializable, Comparable<Character> |
0 至 2^16-1 |
boolean(布爾值) | 1 | 8 | false |
public final class Boolean extends Object implements Serializable, Comparable<Boolean> |
true 或 false |
從Java5.0版本以後加入了autoboxing功能,自動拆箱和裝箱是依靠JDK的編譯器在編譯期的預處理工作。
簡單一點說,裝箱就是自動將基本數據類型轉換爲包裝器類型;拆箱就是自動將包裝器類型轉換爲基本數據類型。
Integer temp = 88;
//以上的聲明就是用到了自動的裝箱
//解析爲:
Integer temp = new Integer(88);
//========================================================================================
//以下自動拆箱:將對象重新轉化爲基本數據類型。
//裝箱
Integer tempA = 99;
//拆箱
int tempA = 99;
注:因爲對象不能直接進行運算,需要轉化爲基本數據類型後才能進行加減乘除。
接下來我們進入主題:
在JVM中,內存分爲堆內存跟棧內存。
他們二者的區別是: 當我們創建一個對象時,將對象數據存儲到堆內存中,同時在棧內存中生成對應的引用,後續代碼中調用的時候通過棧內存引用招到真正的對象。
注:基本數據類型存在棧內存中(這裏需要注意,如要看具體的聲明位置,如果是成員變量則存放在堆中,如果是局部變量則存在棧幀中的局部變量表中)
== 進行比較的情況:
1.基本數據類型比較:比較的是基本數據類型的值
2.複合數據類型比較(類):比較的是對象在內存中的存放地址
equals 進行比較的情況:
private final int value;
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
從equals方法源碼可以看出,這個方法的初始行爲是比較對象的內存地 址,但在一些類庫當中這個方法被覆蓋掉了,如String,Integer,Date在這些類當中對equals方法進行了重寫,這種情況下就不在比較內存地址了。
對於複合數據類型之間進行equals比較,在沒有覆寫equals方法的情況下,他們之間的比較還是基於他們在內存中的存放位置的地址值的,因爲Object的equals方法也是用雙等號(==)進行比較的,所以比較後的結果跟雙等號(==)的結果相同。
對於Integer和int的數值範圍比較疑問
爲什麼數值在 -128 與 127之間時,兩個Integer 對象是否相等用 ==來判斷返回true,但是這個範圍之外的就爲false"?
這是java爲了加大對簡單數字的重複利用,Java定義:在自動裝箱時對於值從–128到127之間的值,它們被裝箱爲Integer對象後,會緩存在內存中,可以重複利用,如果超過這個範圍就會new一個新的對象。