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 源码学习之缓存池了解相关推荐

  1. JAVA小项目实例源码—学习娱乐小助手

    代码地址如下: http://www.demodashi.com/demo/11456.html 一.程序实现 项目目录: MyJFrame:实现项目界面样式: AppProcess:实现调用api或 ...

  2. Java并发包源码学习之AQS框架(三)LockSupport和interrupt

    接着上一篇文章今天我们来介绍下LockSupport和Java中线程的中断(interrupt). 其实除了LockSupport,Java之初就有Object对象的wait和notify方法可以实现 ...

  3. Java并发包源码学习系列:同步组件CountDownLatch源码解析

    文章目录 CountDownLatch概述 使用案例与基本思路 类图与基本结构 void await() boolean await(long timeout, TimeUnit unit) void ...

  4. java Integer 源码学习

    转载自http://www.hollischuang.com/archives/1058 Integer 类在对象中包装了一个基本类型 int 的值.Integer 类型的对象包含一个 int 类型的 ...

  5. Java并发包源码学习系列:AbstractQueuedSynchronizer

    文章目录 本篇学习目标 AQS概述 AbstractOwnableSynchronizer 同步队列与Node节点 同步状态state 重要方法分析 独占式获取与释放同步状态 共享式获取与释放同步状态 ...

  6. java中talent-aio_talent-aio源码阅读小记(一)

    近来在oschina上看到一个很火的java 即时通讯项目talent-aio,恰巧想了解一下这方面的东西,就阅读了一下项目的源码,这里对自己阅读源码后的一些心得体会做一下备忘,也希望能够对其他项目中 ...

  7. Java中ArrayList源码分析

    一.简介 ArrayList是一个数组队列,相当于动态数组.每个ArrayList实例都有自己的容量,该容量至少和所存储数据的个数一样大小,在每次添加数据时,它会使用ensureCapacity()保 ...

  8. Java之Integer源码

    1.为什么Java中1000==1000为false而100==100为true? 这是一个挺有意思的讨论话题. 如果你运行下面的代码 Integer a = 1000, b = 1000; Syst ...

  9. Java IO流源码学习之二(Buffered字节流)

    本文记录BufferedInputStream,BufferedOutputStream两个带缓冲的输入输出流. BufferedInputStream继承于FilterInputStream,Buf ...

最新文章

  1. 超算学院计算机系吧,上海交通大学计算机科学与工程系(CSE)
  2. Linux负载均衡粘滞会话:IP_HASH Session(nosql mysql 文件共享系统 ) Cookie客户端加密识别用户
  3. windows上安装mysql
  4. eBay | 实践Hadoop任务的性能翻倍之路
  5. 2019.6.16完成classstack任务
  6. Android Studio 修改项目包名(Xposed)
  7. python异常如何处理_python异常处理
  8. 三菱plc可以用c语言编程吗,三菱PLC高手进-c语言编程题库
  9. dnf远古深渊出传说详解
  10. 打开虚拟机 电脑自动重启解决办法
  11. Cocos2d-x-3c 设计之路 CocosBase CocosNet CocosWidget
  12. 软件工程实践2018第六次作业——现场UML作图
  13. 炸⾦花棋牌游戏Python
  14. 【java】【kotlin】判断当前日期是星期几、是否为月底;获取当前季度起始时间
  15. linux设置spi时钟频率,Linux下S3C2416的SPI设置问题,CLK和MOSI都没有输出,求助
  16. Mat 的介绍和使用
  17. 完美越狱iOS 7(jailbreak iOS 7)
  18. CC36 不同的子序列
  19. 使用 BigDecimal 进行浮点数运算
  20. 关闭烦人的自动翻译栏,并在关闭后继续使用该功能

热门文章

  1. Android大型实战:《亲信,优雅的从入门到进阶》-刘桂林-专题视频课程
  2. 洛谷_2762 太空飞行计划问题
  3. 00后南航大二学生自制火箭,成功发射后回收
  4. c语言实现一致性hash算法,一致性哈希算法(Consistent Hashing)
  5. 北大青鸟 基于.NET的WEB程序设计 视频教程
  6. AtCoder Beginner Contest 192
  7. Freedom of Choice URAL - 1517
  8. echarts lengend格式化和换行
  9. Python基础之集合set操作
  10. python quit()讲解_Python locals.QUIT属性代码示例