java基礎——深入理解 ==和equals

在講 == 和 equals原理之前,我們需要了解

java的基本數據類型四類八種

  • 整    型  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一個新的對象。

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章