1. 程式人生 > >Long、Integer型別比較是否相等

Long、Integer型別比較是否相等

一、Long型別

1.
Long aLong=(long) 128;
Long bLong=(long) 128;
System.out.println(aLong==bLong);
結果:false
===========================
2.
Long aLong=(long) 127;
Long bLong=(long) 127;
System.out.println(aLong==bLong);
結果:true
===========================
3.
long aLong= 128;
long bLong= 128;
System.out.println(aLong==bLong);
結果:true
===========================
long aLong= 127;
long bLong= 127;
System.out.println(aLong==bLong);
結果:true

==在基本資料型別中比較的是兩個基本資料型別的值是否相等

 ==引用資料型別中比較的是引用的物件是否相等,即是否引用了同一個物件,比較的是地址

所以3,4的結果都為true,相信大家都能明白

那麼1,2,同是Long型,同是==,為什麼結果不一樣呢?

看看原始碼:

private static class LongCache {  
  private LongCache(){}
  static final Long cache[] = new Long[-(-128) + 127 + 1];
  static {
    for(int i = 0; i < cache.length; i++)
      cache[i] = new Long(i - 128);
  }
}

 

public static Long valueOf(long l) {  
  final int offset = 128;
  if (l >= -128 && l <= 127) { // will cache
    return LongCache.cache[(int)l + offset];
  }
  return new Long(l);
}

 

原來是因為Long中有一個靜態的內部類LongCache,專門用於快取-128至127之間的值,一共256個元素。
如果僅僅是快取下來而不去使用那麼就沒有任何意義。valueOf(long l)就是使快取派上用場的方法,它會判斷傳入的引數是否在-128-127之間,如果是則直接從快取中返回對應的引用,否則新建立一個Long的例項。

解決辦法

①先通過.longValue()方法獲取Long物件的基本型別long的值之後再做比較的。

Long aLong=(long) 128;
Long bLong=(long) 128;
System.out.println(aLong.longValue()==bLong.longValue());
結果 :true

②重寫equals方法,方便使用

public boolean equals(Object obj) {  
  if (obj instanceof Long) {
      return value == ((Long)obj).longValue();
  }
  return false;
  }

二、Integer

integer與Long 類似,IntegerCache,不過最後呼叫的是intValue()方法獲取基本型別int的值

最大值127可以通過-XX:AutoBoxCacheMax=size修改。 快取通過一個for迴圈實現。從低到高並建立儘可能多的整數並存儲在一個整數陣列中。這個快取會在Integer類第一次被使用的時候被初始化出來。以後,就可以使用快取中包含的例項物件,而不是建立一個新的例項(在自動裝箱的情況下)。

實際上這個功能在Java 5中引入的時候,範圍是固定的-128 至 +127。後來在Java 6中,可以通過java.lang.Integer.IntegerCache.high設定最大值。這使我們可以根據應用程式的實際情況靈活地調整來提高效能。

除了Integer以外,其他的快取值都不可改變

三、short

shortCache,shortValue()