Java 中 Integer 源码学习之缓存池了解
Java 中 Integer 源码学习之缓存池了解
面试题
new Integer(123) 与 Integer.valueOf(123) 的区别?
- new Integer(123) 每次都会新建一个对象;
- Integer.valueOf(123) 会使用缓存池中的对象,多次调用会取得同一个对象的引用。
Integer a = new Integer(125);Integer b = new Integer(125);// falseSystem.out.println(a == b);Integer c = Integer.valueOf(125);Integer d = Integer.valueOf(125);// trueSystem.out.println(c == d );
这里不讨论包装类型间的相等判断应该用equals,而不是’==’;
源码解读
public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);
}
Integer.valueOf() 方法的实现比较简单,第一步先判断值是否在缓存池中,如果在的话就直接返回缓存池的内容。
那么,在 Java 8 中 Integer 中缓存池默认大小是多少呢?答案是 -128~127;编译器会在缓冲池范围内的基本类型自动装箱过程调用 valueOf() 方法,因此多个 Integer 实例使用自动装箱来创建并且值相同,那么就会引用相同的对象。
Integer a = 125;Integer b = 125;// trueSystem.out.println(a == b);
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() {}}
所以我们在使用 Int 类型对应的包装类型时,就可以直接使用缓冲池中的对象。
结束语
何为目的?人生根本没有目的,何况工作呢。
Java 中 Integer 源码学习之缓存池了解相关推荐
- JAVA小项目实例源码—学习娱乐小助手
代码地址如下: http://www.demodashi.com/demo/11456.html 一.程序实现 项目目录: MyJFrame:实现项目界面样式: AppProcess:实现调用api或 ...
- Java并发包源码学习之AQS框架(三)LockSupport和interrupt
接着上一篇文章今天我们来介绍下LockSupport和Java中线程的中断(interrupt). 其实除了LockSupport,Java之初就有Object对象的wait和notify方法可以实现 ...
- Java并发包源码学习系列:同步组件CountDownLatch源码解析
文章目录 CountDownLatch概述 使用案例与基本思路 类图与基本结构 void await() boolean await(long timeout, TimeUnit unit) void ...
- java Integer 源码学习
转载自http://www.hollischuang.com/archives/1058 Integer 类在对象中包装了一个基本类型 int 的值.Integer 类型的对象包含一个 int 类型的 ...
- Java并发包源码学习系列:AbstractQueuedSynchronizer
文章目录 本篇学习目标 AQS概述 AbstractOwnableSynchronizer 同步队列与Node节点 同步状态state 重要方法分析 独占式获取与释放同步状态 共享式获取与释放同步状态 ...
- java中talent-aio_talent-aio源码阅读小记(一)
近来在oschina上看到一个很火的java 即时通讯项目talent-aio,恰巧想了解一下这方面的东西,就阅读了一下项目的源码,这里对自己阅读源码后的一些心得体会做一下备忘,也希望能够对其他项目中 ...
- Java中ArrayList源码分析
一.简介 ArrayList是一个数组队列,相当于动态数组.每个ArrayList实例都有自己的容量,该容量至少和所存储数据的个数一样大小,在每次添加数据时,它会使用ensureCapacity()保 ...
- Java之Integer源码
1.为什么Java中1000==1000为false而100==100为true? 这是一个挺有意思的讨论话题. 如果你运行下面的代码 Integer a = 1000, b = 1000; Syst ...
- Java IO流源码学习之二(Buffered字节流)
本文记录BufferedInputStream,BufferedOutputStream两个带缓冲的输入输出流. BufferedInputStream继承于FilterInputStream,Buf ...
最新文章
- 超算学院计算机系吧,上海交通大学计算机科学与工程系(CSE)
- Linux负载均衡粘滞会话:IP_HASH Session(nosql mysql 文件共享系统 ) Cookie客户端加密识别用户
- windows上安装mysql
- eBay | 实践Hadoop任务的性能翻倍之路
- 2019.6.16完成classstack任务
- Android Studio 修改项目包名(Xposed)
- python异常如何处理_python异常处理
- 三菱plc可以用c语言编程吗,三菱PLC高手进-c语言编程题库
- dnf远古深渊出传说详解
- 打开虚拟机 电脑自动重启解决办法
- Cocos2d-x-3c 设计之路 CocosBase CocosNet CocosWidget
- 软件工程实践2018第六次作业——现场UML作图
- 炸⾦花棋牌游戏Python
- 【java】【kotlin】判断当前日期是星期几、是否为月底;获取当前季度起始时间
- linux设置spi时钟频率,Linux下S3C2416的SPI设置问题,CLK和MOSI都没有输出,求助
- Mat 的介绍和使用
- 完美越狱iOS 7(jailbreak iOS 7)
- CC36 不同的子序列
- 使用 BigDecimal 进行浮点数运算
- 关闭烦人的自动翻译栏,并在关闭后继续使用该功能
热门文章
- Android大型实战:《亲信,优雅的从入门到进阶》-刘桂林-专题视频课程
- 洛谷_2762 太空飞行计划问题
- 00后南航大二学生自制火箭,成功发射后回收
- c语言实现一致性hash算法,一致性哈希算法(Consistent Hashing)
- 北大青鸟 基于.NET的WEB程序设计 视频教程
- AtCoder Beginner Contest 192
- Freedom of Choice URAL - 1517
- echarts lengend格式化和换行
- Python基础之集合set操作
- python quit()讲解_Python locals.QUIT属性代码示例