Long类型有趣的现象

前言

今天碰到个有趣的问题,简而言之就是Long类型能不能用==来进行比较的问题。

先说结论,不是完全不行,但是不推荐。

原理

我们先明确一个观点,==比较的是地址值,Long==Long比较的是两个对象的地址值是否相同。

我们看下jdk获取Long类型值的源码:

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);
}


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);
  }
}

可以看到,当值在-128~127之间的时候,用==比较,实际取的缓存地址值,那么地址值当然一样,或者说值一样;但是,当值不在这个范围内,那么就是新建的Long对象,值就不相等了。

验证

public static void main(String[] args) {
  Long a= 1L;
  Long b = 1L;
  System.out.println(a== b);
  Long c=128L;
  Long d=128L;
  System.out.println(c==d);
  System.out.println(c.compareTo(d));
}

//结果
true
false
0

总结,当值在-128-127之间,用==也可以,超出就不行。

不过,避免出错还是推荐compare方法来比较大小。