1. 程式人生 > >Integer關於equals與==的比較

Integer關於equals與==的比較

java中有兩種資料型別:基本型別和引用型別。

基本型別有8個:

整數型別 byte、short、int、long

浮點數型別 float、double

字元型 char

布林型別 boolean

引用型別包括三種:

類 Class

介面 Interface

陣列 Array

基本型別是通過諸如 int a = 5; long b = 6L;的形式來定義的,稱為自動變數,自動變數存放的是字面值,不是類的例項,它存放在記憶體的堆疊中,資料大小和生存期必須是確定的,存取速度比較快,在堆疊中的字面值可以共享,也就是說我們定義一個int a = 5;然後又定義了一個int b = 5;這時a與b在記憶體中指向的是同一個字面常量。

引用型別一般是通過new關鍵字來建立,比如Integer num = new Integer(3);它存放在記憶體的堆中,可以在執行時動態的分配記憶體大小,生存期也不必事先告訴編譯器,當引用型別變數不被使用時,Java內部的垃圾回收器GC會自動回收走。引用變數中存放的不是變數的內容,而是存放變數內容的地址。

在引數傳遞時,基本型別都是傳值,也就是傳遞的都是原變數的值得拷貝,改變這個值不會改變原變數,而引用型別傳遞的是地址,也就是引數與原變數指向的是同一個地址,所以如果改變引數的值,原變數的值也會改變。這點要注意。

在java中,8種基本型別在java中都有對應的封裝型別,也就是引用型別:

整數型別 Byte、Short、Integer、Long

浮點數型別 Float、Double

字元型 Character

布林型別 Boolean

有時候我們會看到這樣的語句 Integer num = 3;Boolean b = true;這樣定義也能行得通,其實這裡面有一個自動裝箱的問題,即java自動把3這個字面常量封裝成了Integer物件,同理也有自動拆箱。

還有些需要注意的比較特殊的地方:

1.Integer型別

Integer i1 = 3;

Integer i2 = 3;

此時i1 == i2 返回的是true

Integer i1 = 128;

Integer i2 = 128;

此時i1 == i2返回的是false,

這時因為Integer的數值在-128~127之間時,即在int的範圍內,預設是按照基本型別int來存放的,仍舊存在堆疊中,如果超出了int的範圍,就按照物件的方式來存放和比較了。

2、String型別

String型別我們有時候也會直接這樣定義:

String s = "abc";

這裡的"abc"稱為字串常量,也是存在堆疊中的,s中存放的就是指向這個堆疊地址的引用,如果再定義一個

String s1 = "abc";

這時,s與s1存放的是同一個地址的引用,即s與s1指向的是同一個字串常量,

s == s1的值是true,

但是如果有

String s2 = new String("abc");

這時s == s2則為false,因為使用new之後,每次生成的物件都不是同一個,即使儲存的內容相同。

上面的s == s1,s == s2其實比較的都是地址,並不是裡面的內容。如果要比較內容,可以使用equals()方法。