关于Integer直接复制小于128的小坑及缓存机制详解

最近闲来无事 和同事们一起讨论面试题的时候我们老大说了一个Integer在128以下直接初始两个值比较为TRUE还是FALSE 

其实我老早就知道 在127以下比较都为true 但是具体为什么还真没了解过 那么接下来咱们一起探讨探讨。

很简单的一段代码 结果是为true  具体为什么呢 咱们先来看下被编译的class文件是什么样

import com.ahhuage.dddriver.operate.core.kits.SmsKit;
import java.io.PrintStream;
import javax.annotation.Resource;
import org.junit.Ignore;
import org.junit.Test;

@Ignore
public class orderTest
  public static void main(String[] args)
    throws Exception
  {
    Integer a = Integer.valueOf(127);
    Integer b = Integer.valueOf(127);
    System.out.println("a==b\t" + (a == b));
  
  }

可以看到 Integer a = 127 被编译后被改成了 Integer a = Integer.valueOf(127); 那么我们再来看看Integer.valueOf的源码


 红色框里的注释经过翻译后大致意思为 (*此方法将始终缓存-128到127范围内的值,包含,并且可能缓存此范围之外的其他值) 并且看到如果接收到的值是大于等于最小值小于等于最大值  那么就直接存入缓存  否则的话是直接new 一个出来 

 

再来看下其最小值是固定死的 static final int low = -128 但是最大值是可以设置的 源码里有这么一段注释 (被我用红色框住的 ) 可以更改参数   -XX:AutoBoxCacheMax=<Size> 来设置缓存最大值 好 既然这么说了那咱么接下来就试一试

现在idea中更改设置最大值为1000  继续执行接下来的代码 

  public static void main(String[] args) throws Exception {
        Integer a = 127;
        Integer b = 127;
        System.out.println("a==b\t"+(a == b));

        Integer c = 128;
        Integer d = 128;
        System.out.println("c==d\t"+(c == d));
        
        Integer g = 1000;
        Integer h = 1000;
        System.out.println("g==h\t"+(g == h));

        Integer i = 1001;
        Integer j = 1001;
        System.out.println("i==j\t"+(i == j));

    }

结果发现 果然生效了 证明缓存最大值是可以修改且生效的  

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值