【浅挖一下Java包装类的缓存】
初级开发经常会被问的一道经典面试题
public static void main(String[] args) {Integer a = 127;Integer b = 127;boolean flag = a == b;System.out.println("flag = " + flag);System.out.println("====================================================");Integer c = 128;Integer d = 128;boolean flag2 = c == d;System.out.println("flag2 = " + flag2);}
很多小伙伴可能会不假思索地回答是 true false。因为Integer有缓存,数值在-128 至 127之间的数字返回的是同一个对象。
面试官有可能会追问确定一定是true和false吗?
这里其实他是想知道你的“八股文”是背来的还是真的点进去源码看来的。
话不多说,点源码看
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() {}}
缓存其实是由静态内部类IntegerCache实现的,有三个Field。
low 表示缓存最低位值
high 表示缓存最高位值
cache[] 就是缓存存放的数组
可以看到静态代码块里缓存的最高位值至少是127,但是如果配置了相应的JVM参数java.lang.Integer.IntegerCache.high 使之大于127,则缓存的范围将会变大。
面试题中这段代码如果运行时配置了最大值为1024,则运行结果将会是true true。
【浅挖一下Java包装类的缓存】相关推荐
- java 包装类的缓存机制
java 包装类的缓存机制 1.前提:发生自动装箱的过程(基本类型–>包装类型) 创建一个包装类对象有两种方法: (1)构造器方法(就是new出来): (2)自动装箱(就是编译器自动调用包装类的 ...
- Java包装类的缓存机制
一. 1.Java的基本数据类型的包装类型的大部分都用到了缓存机制来提升性能. 2.Byte,Short,Integer,Long这4种包装类默认创建了数值[-128,127]的相应类型的缓存数据 C ...
- Java包装类的缓存
包装类同String类相似,也是非可变类,其对象一经创建,就不能修改.并且,包装类也重写了equals方法,对于相同类型的两个包装类对象,只要两个对象所包装的基本数据类型的值是相等的,则equals方 ...
- Java包装类的缓存范围
包装类提供了对象的缓存,具体的实现方式为在类中预先创建频繁使用的包装类对象,当需要使用某个包装类的对象时,如果该对象封装的值在缓存的范围内,就返回缓存的对象,否则创建新的对象并返回. 在包装类 ...
- Java的知识点20——包装类基本知识、包装类的用途、自动装箱和拆箱、包装类的缓存问题
包装类基本知识 将基本数据类型存储到Object[]数组或集合中的操作 包装类均位于java.lang包 "数字型"都是java.lang.Number的子类.Number类是抽象 ...
- java整型缓存_JAVA整型包装类的缓存策略
Java Integer的缓存策略 public classJavaIntegerCache {public static voidmain(String... strings) { Integer ...
- java包装类和基本类型谁先谁后_你知道Java中基本类型和包装类的区别吗
前情提要 上一篇中,通过一道常见的面试题(即:String.StringBuilder.StringBuffer的区别),引申到Java中基本类型和包装类的相关内容.在这一篇中,我们将解决上一篇中引申 ...
- 近7000字长文详细讲解Java包装类,面试稳了
零基础学习之Java包装类 概述 基本介绍 包装类的使用 装箱 介绍 代码示例 拆箱 介绍 代码示例 包装类常见的API 基本数据类型和字符串之间的转换 数据类型的最大值和最小值 转大小写 转进制 包 ...
- java 包装类缺点_Java 自动拆箱和自动装箱学习笔记
Java 自动拆箱和自动装箱学习笔记 详情参考以下 1. 概述 Java 中的自动装箱和自动拆箱算是一种语法糖,也就是在编译阶段编译器在合适的情况下帮我们的做了自动拆箱和自动装箱. 众所周知,Java ...
最新文章
- Wide ResNet ResNeXt DenseNet DPNet [9] NASNet [10] SENet [11] Capsules [12
- 指定在此oracle主目录中配置,oracle11g卸载
- 《从0到1学习Flink》—— Flink 写入数据到 ElasticSearch
- 多所高校通知,新学期延期开学!做好线上教学准备
- usb连接不上 艾德克斯电源_艾德克斯HT3150联机和IT6720校准联机记
- tf.truncated_normal与tf.random_normal的区别
- [BZOJ]2194: 快速傅立叶之二
- 特征工程(六): 非线性特征提取和模型堆叠
- Spring Security 3.0控制一个帐号只允许登录一次的问题
- MAC使用find命令的正确办法
- 来看看你更适合哪一种Ubuntu
- 二、博客首页完成《iVX低代码仿CSDN个人博客制作》
- 【vijos】在vijos的自己的域中创建题目
- 常用软件写网页html,新手用什么软件写html网页比较靠谱
- 腾讯技术分享实录:游戏后台开发九问
- JS 拖拽对齐参考线+自动吸附+对齐到网格
- 计算机桌面怎么能添加文字,怎么在桌面上添加文字便签
- 深入浅出CChart 每日一课——第五课 回到折线图,苦逼屌丝之万丈高楼平地起
- 大疆无人机航测实测教程:航线规划、像控点布设、刺点、成图(附航测练习数据下载)
- Linux下 配置NTP时间服务器