package com.study.DataType;import org.junit.Test;/*** @Description 常量缓冲池* @Classname IntegerDemo* @Date 2021/9/5 10:56* @Created by 折腾的小飞*/
/*
基本数据类型的包装类除了 Float 和 Double 之外,其他六个包装器类(Byte、Short、Integer、Long、Character、Boolean)都有常量缓存池。Byte:-128~127,也就是所有的 byte 值
Short:-128~127
Long:-128~127
Character:\u0000 - \u007F
Boolean:true 和 false*/
public class IntegerDemo {@Testpublic void test() {Integer i1 = new Integer(200);Integer i2 = new Integer(200);System.out.println(i1 == i2); // new 出来的是不同的对象,地址不同Integer integer3 = Integer.valueOf(127);Integer integer4 = Integer.valueOf(127);System.out.println(integer3 == integer4); // -128~127 都会引用常量池的地址,超过这个范围时会创建新的对象。Integer i5 = Integer.valueOf(128);Integer i6 = Integer.valueOf(128);System.out.println(i5 == i6);}
}

输出结果:

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 propertyint h = 127;String integerCacheHighPropValue =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() {}}

在静态代码块中,low 为 -128,也就是缓存池的最小值;high 默认为 127,也就是缓存池的最大值,共计 256 个。

可以在 JVM 启动的时候,通过 -XX:AutoBoxCacheMax=NNN 来设置缓存池的大小,当然了,不能无限大,最大到 Integer.MAX_VALUE -129

之后,初始化 cache 数组的大小,然后遍历填充,下标从 0 开始。

assert Integer.IntegerCache.high >= 127;
assert 是 Java 中的一个关键字,寓意是断言,为了方便调试程序,并不是发布程序的组成部分。

public class AssertTest {public static void main(String[] args) {int high = 126;assert high >= 127;}
}

假设手动设置的缓存池大小为 126,显然不太符合缓存池的预期值 127,结果会输出什么呢?

报错

Exception in thread "main" java.lang.AssertionErrorat com.itwanger.s51.AssertTest.main(AssertTest.java:9)

Java 数据类型缓存池相关推荐

  1. Java数据类型缓存池

    常量缓存池 package com.study.DataType;import org.junit.Test;/*** @Description 常量缓冲池* @Date 2021/9/5 10:56 ...

  2. java清除缓存池_Java 缓存池(使用Map实现)

    之前只是听说过缓存池,也没有具体的接触到,今天做项目忽然想到了用缓存池,就花了一上午的时间研究了下缓存池的原理,并实现了基本的缓存池功能. /** * 缓存池 * @author xiaoquan * ...

  3. java map 缓存池_map端合并(分布式缓存)

    [TOC] # 分析 适用于关联表中有小表的情形 可以将小表分发到所有的map节点,这样,map节点就可以在本地对自己所读到的大表数据进行合并并输出最终结果,可以大大提高合并操作的并发速度 **Dis ...

  4. Java 中 Integer 源码学习之缓存池了解

    Java 中 Integer 源码学习之缓存池了解 面试题 new Integer(123) 与 Integer.valueOf(123) 的区别? new Integer(123) 每次都会新建一个 ...

  5. JAVA包装类型缓存池详解

    前言:我们知道,缓存一些常用的数据能提高程序的运行效率,而在Java中,Java给一些基本类型提供了一个缓存池,缓存池中已经提前存进去了一些元素,提高数据的读取速度.在此之前,先了解一下Java的自动 ...

  6. java中数据池有哪些_什么是数据库的 “缓存池” ?(万字干货)

    1.Buffer Pool 概述 Buffer Pool 是什么?从字面上看是缓存池的意思,没错,它其实也就是缓存池的意思.它是 MySQL 当中至关重要的一个组件,可以这么说,MySQL的所有的增删 ...

  7. Java String 常量池理解

    Java String 常量池理解 String:字符串常量池 作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么,我们带着以 ...

  8. java数据类型单位_java的数据类型

    基本概念 bit(位) 位是计算机中存储数据的最小单位,指二进制数中的一个位数,其值为"0"或"1". byte(字节) 字节是计算机存储容量的基本单位,一个字 ...

  9. Java--Integer的常量缓存池(默认-128~127数值范围)

    JDK1.5之后,新增了自动拆.装箱功能,如以前创建一个Integer对象,需要 使用 "new"关键字 而现在Java中可以直接赋值如下: Integer不是new出Intege ...

最新文章

  1. 深度学习新星:GANs的基本原理、应用和走向
  2. 备忘录:CISCO router ENABLE crack
  3. netty worker线程数量_Dubbo线程模型
  4. fpga arm 通讯_科学网-[转载]【电子技术】【2014】FPGA增强的数据处理系统
  5. Windows 8虚拟机不能全屏的解决方法
  6. 在iMac上建立一个git仓库
  7. NBA 投篮数据可视化,4行代码就能实现!
  8. android 发送显示广播,如何查看Android系统当前发送了什么广播
  9. python装b代码_教你装逼了:怎么样发布你的 Python 代码给别人 “pip install”
  10. 计算机页面排版的笔记,爱记笔记却懒得排版?这款笔记 App 为你准备了最实用的经典模板:格子笔记...
  11. 《30天自制操作系统》学习笔记--第12天
  12. 金丝雀测试实践_金丝雀测试
  13. 【python】math函数库介绍及其例题
  14. 信息学奥赛一本通 1278:【例9.22】复制书稿(book) | 洛谷 P1281 书的复制
  15. 苏州公安第一次用计算机,苏州破获首起非法控制计算机信息系统程序案
  16. 关于CPU序列号的问题,以及如何获取×64下CPU的ProcessorID
  17. 伪原创视频需要改什么 改视频md5的软件
  18. 数字音频编辑器GoldWavev6.54免费版
  19. 美拍直播首屏耗时减少50%以上的优化实践
  20. 模拟退火算法团簇matlab,基于模拟退火优化算法的二元团簇结构优化方法与流程...

热门文章

  1. 移动端图形化报表界面设计_B端移动设计 | 客户RFM分析
  2. 神经网络(Neural Network)
  3. C++ 继承过程中使用访问说明符和虚函数
  4. windows10下postgreSQL 下载、安装、启动、关闭
  5. 网页转变成app,隐藏浏览器地址栏
  6. 【tensorboard】从tensorboard上看出模型是否存在过拟合
  7. 计算机中的机器码就是二进制数,高电单片机习题(答案)
  8. 各类木材强度_层状磷酸锆/ 聚磷酸铵复合阻燃剂对木材的阻燃抑烟性能研究
  9. mysql事务的4大特性
  10. 基于阿里云用C/C++做了一个http协议与TCP协议的web聊天室的服务器——《干饭聊天室》