导航
首页 教程 派聪明
  • 首页
  • 教程
  • 派聪明
  • 登录
登录技术派畅享更多权益

用户名密码登录

其他登录:
绑定星球,畅享VIP服务

微信扫码/长按识别登录

扫码关注登录
有效期五分钟 👉 手动刷新

登录即同意 用户协议 和 隐私政策

绑定知识星球,畅享 VIP 尊享服务!

戳我了解如何获取星球编号,新窗口打开

添加二哥微信 qing_gee 加速审核

记得备注 星球编号
账号迁移
请输入您之前账号的用户名和密码
通过知识星球授权进行账号绑定和迁移
去绑定
1
教程简介
更新时间: 2023年02月22日
限免
2
Java简介,什么是 Java?
更新时间: 2023年02月22日
限免
3
安装Java开发工具包JDK
更新时间: 2023年02月22日
限免
4
安装集成开发环境Intellij IDEA
更新时间: 2023年02月22日
限免
5
编写第一个Java程序:Hello World
更新时间: 2023年02月22日
限免
6
关键字和保留字
更新时间: 2023年04月23日
限免
7
Java 注释
更新时间: 2023年04月23日
限免
8
Java 数据类型
更新时间: 2023年04月24日
限免
9
Java 数据类型转换
更新时间: 2023年04月24日
限免
10
Java 基本数据类型缓存池
更新时间: 2023年04月24日
限免
11
Java 运算符
更新时间: 2023年04月24日
限免
12
Java 流程控制语句
更新时间: 2023年04月24日
限免
13
掌握 Java 数组
更新时间: 2023年04月25日
限免
14
掌握 Java 二维数组
更新时间: 2023年04月25日
限免
15
打印 Java 数组
更新时间: 2023年04月25日
限免
16
解读 String 源码
更新时间: 2023年04月25日
限免
17
String 为什么不可变
更新时间: 2023年04月25日
限免
18
深入理解 Java 字符串常量池
更新时间: 2023年04月25日
限免
19
详解 String.intern 方法
更新时间: 2023年04月25日
限免
20
StringBuilder 和 StringBuffer
更新时间: 2023年04月25日
限免
21
判断字符串相等
更新时间: 2023年04月25日
限免
22
字符串拼接
更新时间: 2023年04月25日
限免
23
字符串拆分
更新时间: 2023年04月25日
限免
关注公众号
原创
Java基本数据类型缓存池剖析(IntegerCache)

3.5 基本数据类型缓存池

“三妹,今天我们来补一个小的知识点:Java 基本数据类型缓存池。”我喝了一口枸杞泡的茶后对三妹说,“考你一个问题哈:new Integer(18) 与 Integer.valueOf(18) 的区别是什么?”

“难道不一样吗?”三妹有点诧异。

“不一样的。”我笑着说。

  • new Integer(18) 每次都会新建一个对象;
  • Integer.valueOf(18) 会使⽤用缓存池中的对象,多次调用只会取同⼀一个对象的引用。

来看下面这段代码:

Integer x = new Integer(18);
Integer y = new Integer(18);
System.out.println(x == y);

Integer z = Integer.valueOf(18);
Integer k = Integer.valueOf(18);
System.out.println(z == k);

Integer m = Integer.valueOf(300);
Integer p = Integer.valueOf(300);
System.out.println(m == p);

来看一下输出结果吧:

false
true
false

“第一个 false,我知道原因,因为 new 出来的是不同的对象,地址不同。”三妹解释道,“第二个和第三个我认为都应该是 true 啊,为什么第三个会输出 false 呢?这个我理解不了。”

“其实原因也很简单。”我胸有成竹地说。

基本数据类型的包装类除了 Float 和 Double 之外,其他六个包装器类(Byte、Short、Integer、Long、Character、Boolean)都有常量缓存池。

  • Byte:-128~127,也就是所有的 byte 值
  • Short:-128~127
  • Long:-128~127
  • Character:\u0000 - \u007F
  • Boolean:true 和 false

拿 Integer 来举例子,Integer 类内部中内置了 256 个 Integer 类型的缓存数据,当使用的数据范围在 -128~127 之间时,会直接返回常量池中数据的引用,而不是创建对象,超过这个范围时会创建新的对象。

18 在 -128~127 之间,300 不在。

来看一下 valueOf 方法的源码吧。

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

“哦,原来是因为 Integer.IntegerCache 这个内部类的原因啊!”三妹好像发现了新大陆。

“是滴。来看一下 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 property
        int h = 127;
        String integerCacheHighPropValue =
                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
        if (integerCacheHighPropValue != null) {
            try {
                int i = parseInt
登录之后即可阅读全文
该文档仅「二哥编程星球」的VIP用户可见

二哥编程星球的内容包括:

1. 实战项目: 派聪明RAG、校招派Agent、PmHub、技术派、MYDB 等

2. 面试指南: 40 万+字面试求职攻略+面渣逆袭

3. 专属问答: 向二哥 1v1 发起提问,内容不限于 offer 选择、学习路线、职业规划等

4. 简历修改: 提供简历修改服务,附赠星球 5000+优质简历模板可供参考


二哥的星球

》步骤①:微信扫描上方二维码,点击「加入知识星球」按钮

》步骤②:访问星球置顶帖球友必看: https://t.zsxq.com/11rEo9Pdu,获取项目的源码权限和教程地址

已加入星球,绑定星球编号
删除提醒

确定删除《Java基本数据类型缓存池剖析(IntegerCache)》吗

真诚点赞 诚不我欺

回复

目录

分享文章
分享二维码