天天看點

Integer 類型與 int 的==比較

困惑的地方

先貼上代碼,顯示讓我一開始很困惑的地方

package com.lizi.basic;

public class IntegerDemo {

    public static void main(String[] args) {
        Integer a = new Integer(3);
        Integer b = 3;
        int c = 3;

        System.out.println(a == b);
        System.out.println(a == c);

        Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
        System.out.println(f1 == f2);
        System.out.println(f3 == f4);
    }

}      

你們覺得應該是什麼?水很深的哦

false
true
true
false      

分析思路

先分析 Integer a = 數值 之間如何比較;

再分析 Integer 與 int 如何比較

Java 資料兩種類型 – 基本類型的應用類型

  • 基本類型
  • 基本資料類類型存的是數值本身
  • 引用類型
  • 引用類型變量在記憶體放的是資料的引用

基本類型通過 == 比較的是他們的值大小,而引用類型比較的是他們的引用位址

Integer 用 == 比較的時候往往非常容易出錯

100, f2 = 100, f3 = 150, f4 = 150;
        System.out.println(f1 == f2);
        System.out.println(f3 == f4);      

當我們給一個Integer賦予一個int類型的時候會調用Integer的靜态方法valueOf。

Integer f1 = Integer.valueOf(100); 
Integer f2 = Integer.valueOf(100); 
Integer f3 = Integer.valueOf(150); 
Integer f4 = Integer.valueOf(150);       

思考:那麼​

​Integer.valueOf()​

​​傳回的​

​Integer​

​​是不是是重新​

​new Integer(num);​

​來建立的呢?如果是這樣的話,那麼== 比較傳回都是false,因為他們引用的堆位址不一樣

具體來看看​

​Integer.valueOf​

​的源碼

public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new      

在IntegerCache中cache數組初始化如下,存入了-128 - 127的值

new Integer[(high - low) + 1];
        int j = low;
        for(int k = 0; k < cache.length; k++)
            cache[k] = new      

從上面我們可以知道給Interger 賦予的int數值在-128 - 127的時候,直接從cache中擷取,這些cache引用對Integer對象位址是不變的,但是不在這個範圍内的數字,則new Integer(i) 這個位址是新的位址,不可能一樣的

Integer 與 int

Integer a = new Integer(3);
Integer b = 3;
int c = 3;

System.out.println(a == b);
System.out.println(a == c);      

a == b分析

​Integer b = 3;​

​​ 自動調用​

​Integer.valueOf(3)​

​​ 傳回一個​

​Integer​

​​的對象。 這個對象存放到​

​cache​

​中的

而 ​

​Integer a = new Integer(3);​

​​這裡建立了一個新的對象​

​Integer​

​​ 是以 a == b 傳回的是​

​false​

a == c 分析

一個Integer 與 int比較,先将Integer轉換成int類型,再做值比較,是以傳回的是true

習題 ^-^

Integer 類型與 int 的==比較
上一篇: winsock 規範
下一篇: BSD Socket