详解Java 虚拟机(第④篇)——8 种基本类型的包装类和常量池
发表于:2025-02-04 作者:千家信息网编辑
千家信息网最后更新 2025年02月04日,Java 基本类型的包装类的大部分都实现了常量池技术, 即Byte,Short,Integer,Long,Character,Boolean; 这 5 种包装类默认创建了数值 [-128,127] 的
千家信息网最后更新 2025年02月04日详解Java 虚拟机(第④篇)——8 种基本类型的包装类和常量池
- Java 基本类型的包装类的大部分都实现了常量池技术, 即Byte,Short,Integer,Long,Character,Boolean; 这 5 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据, 但是超出此范围仍然会去创建新的对象。
- 两种浮点数类型的包装类 Float , Double 并没有实现常量池技术。
valueOf() 方法的实现比较简单,就是先判断值是否在缓存池中,如果在的话就直接返回缓存池的内容。
Integer 的部分源码:
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i);}
在 Java 8 中,Integer 缓存池的大小默认为 -128~127。
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(integerCacheHighPropValue); i = Math.max(i, 127); // Maximum array size is Integer.MAX_VALUE h = 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;}
示例1:
Integer i1=40;//Java 在编译的时候会直接将代码封装成 Integer i1=Integer.valueOf(40);从而使用常量池中的对象。Integer i2 = new Integer(40);//创建新的对象。System.out.println(i1==i2);//输出false
示例2:Integer有自动拆装箱功能
Integer i1 = 40;Integer i2 = 40;Integer i3 = 0;Integer i4 = new Integer(40);Integer i5 = new Integer(40);Integer i6 = new Integer(0);System.out.println("i1=i2 " + (i1 == i2)); //输出 i1=i2 trueSystem.out.println("i1=i2+i3 " + (i1 == i2 + i3)); //输出 i1=i2+i3 true//i2+i3得到40,比较的是数值System.out.println("i1=i4 " + (i1 == i4)); //输出 i1=i4 falseSystem.out.println("i4=i5 " + (i4 == i5)); //输出 i4=i5 false//i5+i6得到40,比较的是数值System.out.println("i4=i5+i6 " + (i4 == i5 + i6)); //输出 i4=i5+i6 trueSystem.out.println("40=i5+i6 " + (40 == i5 + i6)); //输出 40=i5+i6 true
输出
缓存
常量
类型
包装
对象
数值
技术
示例
代码
内容
功能
大小
大部分
就是
拆装
数据
方法
时候
源码
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
oracle的数据库链接
湖北统一软件开发服务有哪些
上海家用软件开发成本价
绍兴app软件开发步骤
安卓app 数据库 版本
junit 数据库操作
沈阳三好街电脑城软件开发
潮信库互联网科技公司怎么样
北京互联网科技公司怎么注册
电力软件开发 标准规范
有关国家网络安全的股票
sql服务器管理窗口
传统网络安全企业排名
备份数据库覆盖了如何找回
啥叫根服务器
榆树网络技术咨询质量保障
互联网发展带来的网络安全
服务器磁盘使用率多少算正常
数据库怎么重复复制
案例数据库是什么
服务器转速
nature 物理数据库
加气站网络安全大课堂
中国有多少人从事软件开发
泛微网络安全儿童画
福州零信任网络安全践行者
深圳软件开发外包工资
魂师对决服务器多久更新
xp iis服务器
雅安的大数据库建在哪里