包装类的自动装拆箱及Integer类的缓存区问题

3分钟搞定!QQ音乐歌单导出Excel保姆级教程(含歌单ID获取技巧) 本文提供了一份详细的QQ音乐歌单导出Excel保姆级教程,帮助用户轻松备份和管理个人音乐收藏。教程核心在于获取歌单ID,并利用浏览器开发者工具执行脚本提取数据,最后通过Excel导入功能快速生成结构化表格。整个过程无需编程基础,3分钟即可搞定,是个人数据管理的实用技巧。 阅读详情

jdk1.5后,出现了自动装箱和拆箱机制。即基本数据类型值可以赋值给基本数据类型的包装类,并可以和基本数据类型值直接运算。那么,这是如何实现的呢?看下面代码示例:

/**
*   基本数据类型的包装类,主要是提供了基本数据类型和字符串之间的转换方法
*   
*/

public class TestWrapClass {

    public static void testAuto () {


        Boolean flag = true;
        Integer i = 10;
        i+=3;


    }

    public static void testCache () {


        Integer i = 10;
        Integer j = 10;
        Integer a = 128;
        Integer b = 128;
        sop(i==j);
        sop(a==b);

    }

    public static void main(String[] args) {

        testAuto();
        testCache();

    }

    public static void sop(Object obj) {

        System.out.println(obj);
    }

}

使用javap -c TestWrapClass,查看反汇编后的代码,以testAuto为例:
public static void testAuto();
Code:
0: iconst_1
1: invokestatic #2; //Method java/lang/Boolean.valueOf:(Z)Ljava/lang/Boolean;
4: astore_0
5: bipush 10
7: invokestatic #3; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
10: astore_1
11: aload_1
12: invokevirtual #4; //Method java/lang/Integer.intValue:()I
15: iconst_3
16: iadd
17: invokestatic #3; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
20: astore_1
21: return
第1:Boolean flag = true在编译时自动调用Boolean类的valueOf(boolean b)的静态方法,返回Boolean对象后赋值。这就是自动装箱过程,i+=3时,首先调用Integer类的intValue方法,进行运算,这是自动拆箱的过程,然后调用Integer类的valueOf方法,进行自动装箱操作。参见第12:和第17:,这就是自动装拆箱的实现过程。
再看testCache方法,结果是:true false 。为什么呢?这就要说到Integer类的缓冲区。我们知道自动装箱是通过调用包装类的静态方法valueOf实现的,而查看Integer类的valueOf方法,发现:

public static Integer valueOf(int i) {
        if(i >= -128 && i <= IntegerCache.high)
            return IntegerCache.cache[i + 128];
        else
            return new Integer(i);
    }

当数值范围在-128——Integer缓冲区最大值(包括两者)时,会返回缓冲区中的Integer对象,否则会新建一个对象。那么,什么是Integer类的缓冲区呢?看下列代码:

private static class IntegerCache {
        static final int high;
        static final Integer cache[];

        static {
            final int low = -128;

            // high value may be configured by property
            int h = 127;
            if (integerCacheHighPropValue != null) {
                // Use Long.decode here to avoid invoking methods that
                // require Integer's autoboxing cache to be initialized
                int i = Long.decode(integerCacheHighPropValue).intValue();
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - -low);
            }
            high = h;

            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);
        }

        private IntegerCache() {}
    }

发现这个缓存类就是定义在Integer类中的一个静态内部类,定义了两个属性:缓存区放置的最大int值和缓存Integer类型数组。如果系统配置(jvm配置)中通过 :-XX:AutoBoxCacheMax= 确定了最大值,那么使用该最大值,但是限定缓存区的最大长度是int型最大值,所以最大值不超过:Integer.MAX_VALUE - -low。最后,初始化了int值从-128到最大值之间的一个Integer型数组。Integer类被加载时,就在方法区创建了一个这样的缓存区。自动装箱时,当数值范围在该缓存区范围内,无论调用多少次,都是返回该缓存区的一个Integer对象,而超出这个范围,则每次在堆区新建一个对象。

用python画带有正负值的条形图 常见的条形图只能表现数据的大小,却不能表现值的正负关系。但是其实仅仅使用`pandas`和`matplotlib`两个包就可以实现y轴负轴的添加以及负值的显示,并且可以为正负值分别设置不同的颜色,让条形图看上去更加清晰,易于我们分析 阅读详情

相关推荐

东方财富 vs 新浪 vs AKShare:3 种股票实时数据接口性能与稳定性实测对比

本文深度评测了东方财富、新浪和AKShare三种股票实时数据接口的性能与稳定性。通过实际测试数据,从延迟、成功率和数据完整性三个维度进行全面对比,为量化交易和数据分析开发者提供选型参考。结果显示,东方财富接口在实时性和稳定性方面表现最优,适合高频交易场景。

weixin_30800807的博客 398

Integer包装类中自动装箱、自动拆箱以及缓存机制的底层原理

自动装箱底层实现原理及Integer缓存机制

qq_67002252的博客 487

Qt QChart实战:从零打造一个实时温度监控仪表盘(附完整源码)

本文详细介绍了如何使用Qt QChart模块从零构建一个工业级实时温度监控仪表盘。通过实战案例,展示了波形图的绘制、坐标轴配置、数据流模拟等关键技术,并提供了完整的源码实现,帮助开发者快速掌握Qt在数据可视化领域的应用。

weixin_42537919的博客 246

包装类详解(装箱(包)、拆箱(包)、Integer类型缓存)

在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。Integer类型把[-128~127]的数据缓存了,这个范围的数据直接取出,不需要新new对象。

crazy_xieyi的博客 1775

PostgreSQL 在 Windows操作系统 无管理员权限情况下的部署详解

但是因为使用默认5432端口,我们修改了端口,所以连接报错,需要修改local连接信息,右键-属性修改相应信息即可,方式同上。(也别太任意吧,个人习惯工具放在不包含中文及特殊字符的目录,另外目录名尽量简短,避免不必要的麻烦)图中我解压到了自己的tools\postgresql18。1)如果想修改默认的5432端口,找到初始化目录中的(上面的tools\postgresql18\。此处替换成你的实际目录\tools\postgresql18\pgsql\pgAdmin 4\runtime。

dong_zhi2328的博客 1119

大模型推理中Prefill与Decode、KV Cache三者说明

Prefill 阶段对输入 Prompt 并行编码,一次性构建KV Cache,属于计算密集型任务。Decode 阶段逐 token 迭代生成,复用KV Cache避免重复计算,属于显存带宽密集型任务。KV Cache是自回归推理的核心基石,用显存换时间,实现两阶段衔接与高效生成。PD 分离通过任务解耦、异构硬件、异步调度、独立批处理,解决传统一体化推理的资源冲突与利用率低下问题,是当前云端大模型推理服务的主流工程优化方向。

a486259的博客 1496

包装类及自动装箱和拆箱_Integer缓存问题

package SomeClass; public class TestBack { public static void main(String[] args) { //基本数据类型转为对象 Integer i = new Integer(333); Integer i1 = Integer.valueOf(22); //包装类对象转为基本数据类型 double d = i1.doubleValue();

weixin_45282014的博客 208

【Python LeetCode 专题】面试经典 150 题

面试经典 150 题

一杯水果茶!足矣~ 1177

java基础(一) java基本数据类型和封装类型

Java基础数据类型 Integer的值缓存范围-128-127,查看源码如下: // 在 -128~127 之间从缓存里取 public static Integer valueOf(int i) { if (i &gt;= IntegerCache.low &amp;&amp; i &lt;= IntegerCache.high) return...

菜饼之路 581

小程序真机调试蓝牙可以使用,线上发布版本蓝牙无法使用

小程序提示请打开蓝牙,微信小程序蓝牙无法连接,小程序真机调试蓝牙可以使用,线上版本蓝牙无法使用,测试环境蓝牙正常,开发环境蓝牙正常,发布后蓝牙无法使用

renkai721的专栏 827

YOLOv13改进:卷积魔改 | 动态蛇形卷积(Dynamic Snake Convolution),实现暴力涨点

如何跟YOLOv13结合:替代YOLOv13的DS-C3K2

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 366

Java(47):解剖 Integer 等包装类的自动装箱拆箱和jvm缓存机制

目录 写在开头 Integer包装类的缓存机制 Integer源码(节选) 其他包装类的缓存行为 自动装箱 Integer初始化的三种方式 比较运算符的应用 参考文章: 写在开头 自动装箱和拆箱、for循环都是java语言的语法糖!! 《深入理解JVM虚拟机》 Integer包装类的缓存机制 Integer的缓存机制: Integer是对小数据(-128~127)是...

Diligence is the mother of success. 577

YOLO26优化:注意力魔改 | SKAttention注意力,自适应地调整其感受野大小,效果优于SENet

SKAttention输入自适应地调整其感受野大小的能力

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 252

【附章4包装类】包装类的顶级理解

包装类:八个分类、各个作用、自动装箱与自动拆箱。包装类的缓存区

小鳴人的博客 1468

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java基础:包装类(自动装箱和自动拆箱) --详解

一.什么是包装类  Java中的基本数据类型没有方法和属性,而包装类就是为了让这些拥有方法和属性,实现对象化交互。     数值型包装类都继承至Number,而字符型和布尔型继承至Object。 二.基本数据和包装类之间的转换 装箱:基本数据类型转换为包装类;   拆箱:包装类转换为基本数据类型。 package com.swpu; public class WrapperTestOne { public static void main(String[] args){ //1.

潘小蓝的博客 734

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

integer包装类

Number抽象类中定义了拆箱的方法 那么有哪些包装类继承来Number呢下图所示: 自动装箱则是调用了 public static Integer valueOf(String s, int radix) throws NumberFormatException { return Integer.valueOf(parseInt(s,ra...

qq_38106008的博客 535

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java 的包装类

目录 包装类的意义 包装类 每个基本数据类型都有对应的包装类 基本数据类型和包装之间的关系: 装箱: 拆箱: 例程: 1.one == two 【false】 对象vs对象 判断【两个引用】(地址)是否一致 ,one和two都是100,但用了两个new就是申请了两个不同的地址. 2.2.java为了提高执行效率,在valuof()方法执行的过程中,提供了一个类似常量数组的...

紫蝶侠的博客 874

Java包装类解析:装箱拆箱与Integer缓冲区

摘要:Java提供8种基本类型的包装类,将基本类型转为对象以便调用方法或访问属性。以Integer为例,演示了对象创建、自动装箱拆箱(JDK1.5+支持)、类型转换及常用方法。重点分析了Integer缓冲区机制:在[-128,127]范围内的值会被复用,超出范围则创建新对象。通过比较运算验证了该机制,如127返回true,128返回false。其他包装类转换规则类似,但需注意不同类型间不能自动转换,以及Byte/Short/Character的常量优化问题。(149字)

m0_74934926的博客 419

Java常用类-包装类详解

Java常用类-包装类 1. 包装类 基本数据类型不是对象,但有时候在实际应用中经常需要将基本类型数据转化为对象。 除了Character和Boolean以外,其他的包装类**(Integer、Long、Byte、Double、Float、Short)**都是抽象类java.lang.Number的子类。 Number抽象类提供了抽象方法intValue()、longValue()、floatValue()、doubleValue(),它的所有子类都需要提供实现。 基本数据类型 包

baidu_38126306的博客 335

java语法糖--自动装箱和拆箱详解

JAVA中最常用的语法糖--自动装箱和拆箱 一,究竟什么是自动装箱和拆箱 1.1 我们直接来看一段非常简单的实例代码: public static void main(String[] args) { int intValue = 100; Integer boxValue = intValue; int value = boxValue; } 相信上述代码是每个java程序员都能看懂的,但是,问题来了: 为什么基本类型i.

romantic_jie的博客 1457

java包装类的几点注意

 java中8种基本类型变量对应的包装类: byte -- Byte short -- Short           int  --  Integer long -- Long float -- Float Double -- Double boolean -- Boolean char -- Character      包装类型的自动拆箱与自动装箱...

LIXG425的专栏 279

包装类

包装类 1.1自动拆装箱 jdk1.5之后新增功能 自动装箱:可以直接将基本类型数据赋值给包装类对象 自动拆箱:直接将包装类对象数据赋值给基本类型变量 Integer integer1=100; Integer integer2=100; System.out.println(integer1==integer2);//true Integer num1=new Integer(100); In...

nore的博客 229

java 包装类可以被继承_小白学Java:包装类

小白学Java:包装类学习了许久的Java,我们知道Java是一种面向对象的语言,万物皆对象。但是我们之前在说到Java基本数据类型的时候,由于处理对象需要额外的系统开销,于是出于对性能的考虑,基本数据类型并不做为对象使用。既然是面向对象的,在Java中许多方法需要把对象作为参数,但是基本类型变量身上没有任何方法和属性,于是Java提供了一个简单的方法,就是为每一个基本数据类型类型都配套提供一个包...

weixin_42184548的博客 1186

常用类之包装类和String类

什么包装类 类型转换中装箱和拆箱 基本类型和字符串转换 Integer 缓冲区: -128 ~ 127 运行结果 1.2 基本类型和字符串转换代码演示 运行结果 1.3 整数缓存区代码演示 运行结果 2.String类 字符串是常量,创建之后不可改变。修改相当于重写开辟空间,不会修改原来的数据,原有常量失效(变成垃圾) 字符串字面值存储在字符串池中 (方法区中),可以共享 String s = “Hello”;产生一个对象,字符串池中存储 String

qq_60501861的博客 401

Java包装类

一.什么是包装类 Java中的基本数据类型没有方法和属性,而包装类就是为了让这些拥有方法和属性,实现对象化交互。 数值型包装类都继承至Number,而字符型和布尔型继承至Object。 二.基本数据和包装类之间的转换 装箱:基本数据类型转换为包装类; 拆箱:包装类转换为基本数据类型。 package com.swpu; public class WrapperTestOne { public static void main(String[] args){ //1.自动装箱

weixin_43758377的博客 226

包装类(Integer)自动拆装箱 valueOf()和intValue()

包装类(封装类) byte - Byte    short - Short    int - Integer    long- Long     float - Float   double-Double char - Character  boolean-Boolean    (1)类所在的包:八个包装类都在同一个包下,java.long包,不需要import导包,可以直接使用;    (2...

你好,Java!的博客 716
上一篇: string中“+”号重载及intern方法
下一篇: 从Top N 问题窥探MapReduce分组前排序思想
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值