Long、Integer类型比较是否相等

本文详细解析了Java中Long和Integer类型的缓存机制,包括它们如何在-128至127范围内缓存对象引用以提高性能,以及超出此范围时的行为差异。此外,还介绍了如何通过修改系统属性来调整Integer的最大缓存值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值