我们在学习Java的包装类Integer、Long的时候可能会遇到这个问题:


Integer a = 500;
// Integer a = Integer.valueOf(500); 等价于上面的
Integer b = 500;
System.out.println(a == b); // false


Integer c = 100;
Integer d = 100;
System.out.println(c == d); // true

 

① 这种情况其实很好理解,因为 Integer是个类,所以创建a对象的时候会在堆中开辟一块空间,创建b对象的时候也会开辟一块空间,所以很显然他们的内存地址是不相等的,所以a != b。

② 那么很多人就会觉得很奇怪,既然都说了他们的内存地址不同,那么第二种情况为什么会相等呢,其实是Java在程序启动的时候就已经缓存了[-128,127]之间的整数。

我们可以看一下valueOf的源码

其中IntegerCache.low = -128,IntegerCache.high = 127。

至于Cache数组是什么呢,它其实是在程序启动的时候就创建好的一个范围在[-128, 127]之间的数组。

所以当我们调用valueOf的时候,首先会检查是否在[-128, 127]之间,如果在这个区间内就直接从缓存数组中拿出已经缓存好的对象,如果不在这个区间内,那么就创建新的类型。

Java关于整型类缓存[-128,127]之间的数字的更多相关文章

  1. 深入理解Java的整型类型:如何实现2+2=5?

    先看下这段神奇的Java代码: public static void main(String[] args) throws Exception { doSomethingMagic(); System ...

  2. JAVA 长整型转换为IP地址的方法

    JAVA 长整型转换为IP地址的方法 代码例如以下: /** * 整型解析为IP地址 * @param num * @return */ public static String int2iP(Lon ...

  3. (转)JAVA的整型与字符串相互转换

    JAVA的整型与字符串相互转换1如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或         ...

  4. JAVA中整型的存储和左右移位运算

    byte,1个字节8位, -128 ~ 127之间,首位表示正负,0为正,1为负,0111,1111表示127,-127为127取反1000,0000,再加1,即1000,0001为-127,-127 ...

  5. 【java】线程安全的整型类AtomicInteger

    一.遇见AtomicInteger 在看项目代码的时候看到这个类,发现其功能很简单,就是一个整型变量的类型,出于好奇看了其类定义. 该类位于java.util.concurrent.atomic下,在 ...

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

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

  7. java中大整型BigInteger及setBit和testBit方法

    最近在修改公司之前的项目,在项目中遇到了权限校验的问题,代码中出现了BigInteger的setBit()testBit()方法,之前未接触过,所以了解了下BigInteger. 在Java中,由CP ...

  8. 整型数组与vector对象之间的相互初始化

    #include<iostream> #include<vector> #include<string> using namespace std; int main ...

  9. JAVA的整型与字符串相互转换

    1如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([S ...

随机推荐

  1. HDU 4866 Shooting(主席树)题解

    题意:在一个射击游戏里面,游戏者可以选择地面上[1,X]的一个点射击,并且可以在这个点垂直向上射击最近的K个目标,每个目标有一个价值,价值等于它到地面的距离.游戏中有N个目标,每个目标从L覆盖到R,距 ...

  2. JavaScript中的对象引用和复制

    在JavaScript分为两种原始值和引用值类型,原始值之间的复制是值对值得复制,而引用类型则是引用对引用的复制: // 原始值的复制: let num1 = 1; let num2 = num1; ...

  3. 设置chromium的默认搜索引擎为Bing

    设置 -> 搜索 -> 管理搜索引擎 第三项中添加: http://cn.bing.com/search?q=%s 即可.

  4. div & drop

    div & drop uplaod file & prevent dropleave https://www.runoob.com/jsref/event-ondrop.html ht ...

  5. Dart 编写Api弃用警告

    例如body2在以后的版本将被bodyText1代替 @Deprecated( 'This is the term used in the 2014 version of material desig ...

  6. docker+tomcat+jenkin实现立即构建Springboot项目

    一.创建一个Springboot项目 1.编写pom.xml <groupId>com.zwhxpp</groupId> <artifactId>springboo ...

  7. SpringBoot常见的异常问题

    1. org.mybatis.logging.LoggerFactory Springboot启动报错 Caused by: java.lang.ClassNotFoundException: org ...

  8. Linux-两种磁盘分区方式

    Linux文件设备 要理解Linux,首先要理解Linux文件结构 在Linux操作系统中,几乎所有的设备都位于/dev目录中 名称 作用 位置 SATA接口 电脑硬盘接口 /dev/sd[a-p] ...

  9. 1.3.1 apache的配置(上)

    Apache是比较常用的web服务器软件,用来解析HTTP网页.这里需注意,apache本身并不能解析php页面,它是用来配置解析http页面的.当然,作为一款最流行的web服务器软件,apache支 ...

  10. Portainer中文汉化

    一.概述 Portainer是Docker的图形化管理工具,提供状态显示面板.应用模板快速部署.容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作).事件日志显示.容器控制台操作.Swar ...