看到一道面试题,这个面试题是这样的。

public class Foo {public static void main(String[] args) {Integer a = 120,b = 160;Integer c = 120,d = 160;System.out.println(a==c);System.out.println(a.equals(c));System.out.println(b==d);System.out.println(b.equals(d));}
}

运行结果:

那么,会看到为什么 a==c 就是true, 而b==d 就是false了呢?

其实这样的,当我们给一个Integer赋予一个int类型的值的时候它会调用Integer的静态方法ValueOf()方法。

Integer a = Integer.valueOf(120);

Integer c = Integer.valueOf(120);

Integer b = Integer.valueOf(160);

Integer d = Integer.valueOf(160);

那这个valueOf()方法返回的integer是不是一个新的new Integer(120)?那这样的话它们应该为 == 为false,那么下面看下源码

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

这个源码中的方法,他会拿我们赋值的int值去判断是否存在缓存类的low和hign范围之间,如果我们int值在这个范围之间的话,取的是缓存类中的cache缓存数组中取值,否则的话就是new Integer(num);

那么这个缓存类integerCache是什么呢?看源码

   private static class IntegerCache {static final int low = -128;static final int high;static final Integer cache[];static {// high value may be configured by propertyint h = 127;String integerCacheHighPropValue =sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");if (integerCacheHighPropValue != null) {try {int i = parseInt(integerCacheHighPropValue);i = Math.max(i, 127);// Maximum array size is Integer.MAX_VALUEh = Math.min(i, Integer.MAX_VALUE - (-low) -1);} catch( NumberFormatException nfe) {// If the property cannot be parsed into an int, ignore it.}}high = h;cache = new Integer[(high - low) + 1];int j = low;for(int k = 0; k < cache.length; k++)cache[k] = new Integer(j++);// range [-128, 127] must be interned (JLS7 5.1.7)assert IntegerCache.high >= 127;}private IntegerCache() {}}

源码中有一个静态内部类,这个类定义了-128~127的范围,并且放到一个静态缓存数组cache中。在类加载时就将-128 到 127 的Integer对象创建了,并保存在cache数组中。

其实就一句话:

一旦程序调用valueOf 方法,如果i的值是在-128 到 127 之间就直接在cache缓存数组中去取Integer对象。而不在此范围内的数值则要new到堆中了。

延伸:

public class Foo {public static void main(String[] args) {Integer in = new Integer(12);int t = 12;System.out.println(t == in);}
}

结果:

为什么int和integer比较是为true呢?看下反编译后的代码

Integer in = new Integer(12);
int t = 12;
System.out.println(t == in.intValue());

这个反编译后的代码,new Integer的进行了intValue()拆箱,拆箱后为int类型,int类型与int类型比较为true

Integer的值范围-128~127相关推荐

  1. 【java】java Integer 缓存 一定是 -128~127 吗

    1.概述 我们都知道 java Integer是有缓存的,缓存范围是 -128~127.但是这个值是一定的吗? 不一定.看源码.缓存大小居然可以改变 /*** Cache to support the ...

  2. byte的取值范围-128~127原理

    我们都知道byte为8位二进制数据,最高应该是11111111,为255(10进制).但是为什么byte的取值范围为-128~127呢? 因为不管是Int类型还是byte类型,当用二进制定义整数时候, ...

  3. 关于进制补码的八位取值范围为什么是-128~127和补码-128的求取

    我们求补时不能按照平常的求补码方法来求,如果这样求的话,只会把自己碰的头破血流,所以我们不能将自己的思维固定在原码转反码转补码之上,这样最后求出来的是出问题的. 可以这样,我们将在-128~127里面 ...

  4. Java Integer取值范围是多少呢?

    转自: Java Integer取值范围是多少呢? 下文笔者将使用实验的方式,讲述Integer类的取值范围,如下所示: Integer同int类型取值一致其取值范围是从-2147483648 至 2 ...

  5. java bigint范围_Java Integer取值范围

    package com.test; public class Test { public static void main(String []args) { Integer a = 100;//此处若 ...

  6. Java中的AutoBoxing (Integer对-128~127之间数值的特殊处理)

      理解Java中Integer和int的Autoboxing,有助于java新手理解java内存机制.   在Java中的,Integer和int是可以Autoboxing和boxing的,这里要注 ...

  7. java jdk缓存-128~127的Long与Integer

    先推断下以下代码的输出结果 Qa:---------------------------------------------- Long a = Long.valueOf(127);          ...

  8. 为什么byte取值-128~127??

    转载自 为什么byte取值-128~127?? java设计byte类型为1个字节,1个字节占8位,即8bit,这是常识. 另外,计算机系统中是用补码来存储的,首位为0表示正数,首位为1表示负数,所以 ...

  9. 为什么8位有符号数的取值范围是-128~+127

    首先我们知道,计算机以补码的形式存储的,正数的补码是原码不变,负数的补码是原码的取反加1. 我们先来看+127,原码0111 1111对吧,若+128是多少呢,0111 1111 + 1 = 1000 ...

最新文章

  1. IDEA提升研发效能—高效定位篇
  2. 嵌入式系统之温限使用
  3. Deep Learning 教程(斯坦福深度学习研究团队)
  4. oracle ogg常用指令,oracle goldengate日常管理命令
  5. 正确使用AES对称加密
  6. python画条形图-python3使用matplotlib绘制条形图
  7. Centos8 安装 mariadb 最新版 10.5.x
  8. 手把手教你学51单片机_第 一、二章
  9. 2018第九届蓝桥杯国赛C组_java
  10. POC 、EXP 、VUL 、CVE 、0DAY概念
  11. 数模国赛备赛(1)元胞自动机CA 生命游戏 森林火灾 传染病模型 MATLAB版资源整理
  12. 在小百合注册了一个帐号
  13. MySQL:错误1153(08S01):得到的数据包大于“ max_allowed_pa​​cket”字节
  14. Hexo搭建个人博客(十五)| 酒香也怕巷子深,让百度收录你的站点
  15. 你不可不知的《哈利波特》秘密之卑鄙的海尔波
  16. UVA10306 - e-Coins(二维完全背包)
  17. 【自动控制理论(三)】频率特性
  18. PostgreSQL常用修改表结构
  19. Ubuntu下安装截图软件Shutter
  20. 路客网王鑫光:2012是团购移动电商年

热门文章

  1. 研究数字基带信号功率谱的意义
  2. 计算机打印机提示无法打印,打印机无法打印_打印机无法打印怎么办【步骤|图文教程】-太平洋IT百科...
  3. JavaScript语句
  4. 学习笔记:简谈BUCK电路
  5. 使用postman interceptor拦截浏览器和手机请求
  6. 单元测试、注解、枚举、反射(5)JavaSE
  7. 美团单车崛起,摩拜渐成往事
  8. 判断一句话是否中文或者英文
  9. Compilation error 未完待续
  10. SRS(简单实时视频服务) 笔记(5)- 视频录制