Java中的自动装箱拆箱

C#上位机与OneNET云平台数据交互实战——基于HTTP与JSON解析 本文详细介绍了使用C#开发上位机软件与OneNET物联网云平台进行数据交互的实战方法。通过构建HTTP请求、解析JSON数据,实现设备数据的实时获取、界面展示与本地存储,为工业监控与数据采集提供了一套完整高效的C#解决方案。 阅读详情

一. 自动拆装箱机制

        Java中常见的数据为引用类型中的对象,有些场景下,需要基本数据类型拥有对象的性质,因此需要将基本数据类型转换为包装器型。此时将基本数据类型转换成包装器类型的过程称之为装箱, 将包装器类型转换成基本数据类型的过程称之为拆箱。

二. 基本类型及其对应的包装器类型

基本类型包装器类型
byteByte
shortShort
intInteger
floatFloat
doubleDouble
longLong
charCharacter
booleanBoolean

三. 自动装拆箱原理

       自动拆装箱时在Jdk1.5新增的功能特性。自动装拆箱的过程是由编译器完成的而不是Jvm完成的,在编译的过程中,是否完成拆箱和装箱的过程是由编译器进行判断的。

       在Jdk 1.5中,Interger的操作上引入了一个新功能来节省内存和提高性能。整型对象通过使用相同的对象引用实现了缓存和重用,代码示例如下:

public static void main(String[] args) {
    Integer a = 1000;
    Integer b = 1000;
    Integer c = 100;
    Integer d = 100;
    System.out.println("a == b is " + (a == b));
    System.out.println(("c == d is " + (c == d)));
}

输出结果:

a == b is false
c == d is true

结果分析:

       在Jdk中,装箱的过程都是通过valueOf()这个方法来实现的,Integer的valueOf()源码如下:

  public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            //如果i的值大于-128小于127则返回一个缓冲区中的一个Integer对象
            return IntegerCache.cache[i + (-IntegerCache.low)];
            //否则返回 new 一个Integer 对象
            return new Integer(i);
    }

  private static class IntegerCache {
        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;
        }

        private IntegerCache() {}
    }

  简化后的源码:

private static class IntegerCache {

        static final Integer cache[];
        //定义一个Integer类型的数组且数组不可变
        static {  
        //利用静态代码块对数组进行初始化。                     
            cache = new Integer[256];
            int j = -128;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);
        }

  //cache[]原来是一个Integer 类型的数组(也可以称为常量池),value 从-128到127,
    public static Integer valueOf(int i) {   
        if (i >=-128 && i <= 127)        
            return IntegerCache.cache[i + (-IntegerCache.low)];
            //如果装箱时值在-128到127之间,之间返回常量池中的已经初始化后的Integer对象。
        return new Integer(i);
        //否则返回一个新的对象。
    }
}

通过阅读源码我们发现,当Integer类加载时,会在内部缓存中创建256个Integer对象常量池,区间范围为[-128,127],当valueOf(int i)这个方法在转换整数值区间为[-128,127]时,不会创建新的对象而是从内部缓存中获取,当转换不在这个区间内时就会new一个新的对象。

注意:适用于整数值区间[-128,127] ,同时只适合于自动装箱,使用构造函数创建对象不适用。

三. 自动装箱实现

         代码如下:

public static void main(String[] args) {
        // TODO Auto-generated method stub
        int a=3;
        //定义一个基本数据类型的变量a赋值3
        Integer b=a;
        //b是Integer 类定义的对象,直接用int 类型的a赋值    
        System.out.println(b);
        //打印结果为3
    }

在这里,利用自动装箱原理实现了将一个基本数据类型的变量赋值给一个该类型对应的包装类对象。实际上,Integer b = a的实现是调用了Integer.valueOf(int i)方法,即实际上是Integer b = Integer.valueOf(a)。可以看到Integer.valueOf ( a )其实是返回了一个Integer的对象,其实可以简化为:Integer b=3,同样这段代码等价于:Integer b=Integer.valueOf (3 ) 。

四. 自动拆箱的实现

public static void main(String[] args) {
        // TODO Auto-generated method stub

        Integer b=new Integer(3);
        //b为Integer的对象
        int a=b;
        //a为一个int的基本数据类型
        System.out.println(a);
        //打印输出3。
    }

在这里,利用自动拆箱原理实现了将一个包装类对象赋值给一个该对象对应的基本数据类型变量。实际上,int a = b的实现是调用了int a = b.intValue()。

补充:intValue()的源码解析

public int intValue() {
        return value;
    }

有关value的源码:

private final int value;

public Integer(int value) {
     this.value = value;
}

从上述源码可得,value就是定义Integer b = new Integer(3)所赋予的值,故上述代码可以写成:

public static void main(String[] args) {
        // TODO Auto-generated method stub

        Integer b=new Integer(3);
        //b为Integer的对象,b.intValue返回实例化b时构造函数new Integer(3)赋予的值3。
        int a=b.intValue();
        //a为一个int的基本数据类型
        System.out.println(a);
        //打印输出3。
    }

五. 代码示例解析

public static void main(String[] args) {        
        //new关键字,对象与对象
        Integer a=new Integer(126);
        Integer b=new Integer(126);
        System.out.println(a==b);
        //由于引用a和引用b指向的是不同的地址空间,故输出false

        //自动装箱及满足Integer缓存机制 
        Integer c=126;
        Integer d=126;  
        System.out.println(c==d);
        //由于c和d通过Integer.valueOf(126)转换,且126在(-128,127)区间内,所以引用c和引用d指向的是同一个缓存中的对象地址,故输出true

        //自动装箱及不满足Integer缓存机制
        Integer e=136;
        Integer f=136;
        System.out.println(e==f);
        //由于c和d通过Integer.valueOf(136)转换,但是136不在在(-128,127)区间内,所以引用c和引用d指向的是各自通过new关键字构造出的对象地址,故输出false

        //自动拆箱,intValue()方法
        int g=59;
        Integer h=new Integer(59);
        System.out.println(g==h);
        //由于自动拆箱,h通过intValue()与int g之间实现了转化等效,即g==h.intValue()==59,最终g和h都是59,故输出true
    }

 

平衡小车动力学建模 两轮自平衡小车由车体和双轮两部分组成,可以看成一个移动的倒立摆,分别对车轮和车体进行力学分析,建立动力学模型,最后,通过对两者的分析给出系统的状态空间表达式。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kjiPEUVJ-1679470559950)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\image-20230322110521545.png)] 阅读详情

相关推荐

关于Win11安装Ubuntu子系统报错:WslRegisterDistribution failed with error 解决办法

Win11安装Ubuntu子系统报错:WslRegisterDistribution failed with error

qq_51908382的博客 3万+

Java包装类的自动装箱拆箱使用以及详解

Java包装类是一组用于将基本数据类型转换为对象的类,它们位于java.lang包中。Java基本数据类型是非对象类型,例如int、float、boolean等,而包装类提供了一种将这些基本数据类型转换为对象的方式。Java包装类的主要目的是在需要使用对象而不是基本数据类型的情况下提供支持。例如,在集合类中,只能存储对象而不是基本数据类型。此时,可以使用包装类将基本数据类型转换为对应的对象,并将其存储在集合中。Java包装类的常用包装类如下包装类作用Integer用于封装int类型的值。

qq_39939541的博客 1411

Unity机械拆装实战:5步搞定发动机模型交互式装配(附完整代码)

本文详细介绍了在Unity中实现高交互性机械拆装仿真的完整流程。以发动机模型为例,通过5个核心步骤:项目初始化与模型准备、核心交互实现、智能装配逻辑、场景管理与相机控制、进阶优化与扩展,系统讲解了从零构建交互式装配功能的方法,并提供了完整的代码示例。

weixin_28049429的博客 217

Java基础复习(DaySeven):自动装箱与拆箱、反射、异常

分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。《Java高级面试》《Java高级架构知识》《算法知识》《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取![外链图片转存中…(img-RozJVQ8u-1712122621237)]《Java高级架构知识》[外链图片转存中…(img-GQdPqtxw-1712122621238)]《算法知识》[外链图片转存中…(img-M2zTUT9L-1712122621238)]

erthrerg的博客 382

(蓝桥杯)STM32G431RBT6(SysTick timer)

选用最基础的定时器。

2301_81764359的博客 1903

从问卷到结论:手把手教你用SPSS 28完成一份完整的社科数据分析报告

本文详细介绍了如何使用SPSS 28完成社会科学研究中的数据分析报告,从问卷数据导入、清洗到描述性和推断性统计分析,再到结果呈现与报告撰写。通过实际案例演示,帮助研究者掌握SPSS 28的核心功能,提升数据分析效率与报告质量。

weixin_28717431的博客 249

【Java】Java 中的自动装箱和拆箱

自动装箱和拆箱可以让开发人员编写更加清晰的代码,使代码更加易于阅读。基本类型包装类型booleanBooleanbyteBytecharCharacterfloatFloatintIntegerlongLongshortShortdoubleDouble自动装箱和拆箱的实现是通过 Java 编译器在编译时进行的。具体来说,Java 编译器会将自动装箱和拆箱操作转换为对应的方法调用,以实现基本数据类型和包装类型之间的转换。但这在性能方面是要付出代价的。

swadian2008的博客 6581

IFRS 9与CECL对比解析:跨国企业财务必须掌握的两种信用损失模型

本文深度解析IFRS 9与CECL两种信用损失模型的差异,帮助跨国企业应对财务合规挑战。从基础架构、数据治理到监管策略,详细对比三阶段模型与单一阶段模型的核心区别,并提供实施双轨制的实务建议,助力企业优化资本管理和税务筹划。

3c4x5z6v7b的博客 670

Java自动装箱/拆箱

那么Java中有八大**基本数据**类型,byte、char、short、int、long、double、float、boolean。而它们有对应的包装类Byte、Character、Short、Integer、Long、Double、Float、Boolean,这样通过包装后,它们就成为了引用数据类型那么基本数据类型怎么变成对应的包装类呢?

weixin_56395837的博客 3202

推荐算法之Thompson(汤普森)采样

如果想理解汤普森采样算法,就必须先熟悉了解贝塔分布。 一、Beta(贝塔)分布 Beta分布是一个定义在[0,1]区间上的连续概率分布族,它有两个正值参数,称为形状参数,一般用α和β表示,Beta分布的概率密度函数形式如下: 这里的Γ表示gamma函数。 Beta分布的均值是: 方差: ...

weixin_30508241的博客 4260

MacBook 长期挂机 OpenClaw:电池保护 + 防休眠设置

本文介绍了MacBook长期挂机运行OpenClaw时的电池保护和防休眠设置方案。主要内容包括:1)电池保护策略,通过电源连接、充电限制和定期充放电维护电池健康;2)防休眠设置,禁用系统休眠、自动休眠和屏幕休眠;3)OpenClaw的Docker部署方法。文章提供了详细的命令行脚本和配置说明,帮助用户实现MacBook的长期稳定运行,同时保护电池寿命。

一键难忘的博客 1696

(转)java自动装箱和拆箱

http://www.importnew.com/15712.html 自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值转自动地转换成对应的对象。自动装箱与拆箱的机制可以让我们在Java的变量赋值或者是方法调用等情况下使用原始类型或者对象类型更加简单直接。 如果你在Java1.5下进行过编程的话,你一定不会陌生这一点,你不能直接地向集合(Collections)中放入原始类...

jackyrongvip的专栏 616

uniapp - 解决苹果ios真机运行报错:错误:请查看是否设备未加入到证书列表或者确认证书类型是否匹配(HbuilderX运行IOS手机出现问题,uniapp运行到IOS真机提示请查看是否设备未)

uni-app,ios苹果,App平台端,uniapp运行到IOS真机提示错误:请查看是否设备未加入到证书列表或者确认证书类型是否匹配,UUID在哪里,uniApp运行到ios真机报错解决,安装自定义基座App失败,没找到有计划资源,证书、标识符和描述文件,证书标识符和描述文件下面没有选项怎么回事,HBuilder真机调试报错请查看是否设备未加入到证书列表或者确认证书类型是否匹配,UniApp运行到IOS真机提示,授权的设备才可以直接安装基座,添加调试的IOS设备,在Devices中,添加手机设备UUID

🏆 前端领域优质创作者 1万+

如何理解Java中的自动拆箱和自动装箱?

小伟刚毕业时面的第一家公司就被面试官给问住了,记忆尤深啊… 如何理解Java中的自动拆箱和自动装箱? 自动拆箱?自动装箱?什么鬼,听都没听过啊,这…这…知识盲区… 回到家后小伟赶紧查资料,我透,这不就是问基本类型跟封装类型吗,面试官整啥名词呢… 别问结果,问就是没过。 1、 什么是自动装箱,自动拆箱 定义:基本数据类型和包装类之间可以自动地相互转换 理解:装箱就是自动将基本数据类型转换为封装类型,拆箱就是自动将封装类型转换为基本数据类型。 我们知道,Java中提供了四大类基本数据类型,分别是:整数、浮点数、

niceyoo的博客 2080

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java中的自动装箱和拆箱

Java自动装箱和拆箱

薛建新的博客 2311

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java中的自动装箱与自动拆箱

本文讲解了Java中的自动装箱和自动拆箱,并介绍了128陷阱,结合案例进行讲解

2403_88484791的博客 1029

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java中的自动装箱、拆箱

自动装箱与自动是Java语言中经常遇到的语法糖,属于早期(编译期)优化的技术。以下介绍了自动装箱和自动拆箱的底层原理、触发条件等。 01、自动装箱和自动拆箱 1、自动装箱:自动将基本数据类型转换成包装器类型; 2、自动拆箱:自动将包装器类型转换成基本数据类型; 02、自动装箱的底层原理 自动装箱的时候实际调用的是各个包装器类型的valueOf()方法,所以只需要搞明白各个包装器类型的valueOf...

昨日的桥 377

java装箱拆箱_Java中的自动装箱与拆箱

自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值转自动地转换成对应的对象。自动装箱与拆箱的机制可以让我们在Java的变量赋值或者是方法调用等情况下使用原始类型或者对象类型更加简单直接。如果你在Java1.5下进行过编程的话,你一定不会陌生这一点,你不能直接地向集合(Collections)中放入原始类型值,因为集合只接收对象。通常这种情况下你的做法是,将这些原始类型的值转换成对象,然后...

weixin_29138993的博客 196

Java中的自动装箱与拆箱

文章目录1 自动装箱与拆箱1.1 简单理解1.2 什么是自动装箱和拆箱1.3 自动装箱拆箱要点1.4 何时发生自动装箱和拆箱1.4.1 赋值时1.4.2 方法调用时1.5 自动装箱的弊端1.6 重载与自动装箱1.7 容易混乱的对象和原始数据值1.8 缓存的对象 1 自动装箱与拆箱 1.1 简单理解 自动装箱和拆箱从Java 1.5开始引入,目的是将原始类型值自动地转换成对应的对象。自动装箱与拆箱的机制可以让我们在Java的变量赋值或者是方法调用等情况下使用原始类型或者对象类型更加简单直接。 如果在Java1

上善若泪 857

java自动装箱拆箱_深入剖析Java中的自动装箱和拆箱过程

深入剖析Java中的装箱和拆箱自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题。本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱、拆箱相关的问题。以下是本文的目录大纲:一.什么是装箱?什么是拆箱?二.装箱和拆箱是如何实现的三.面试中相关的问题若有不正之处,请谅解和批评指正,不胜感激。请尊重作者劳动成果,转载请标明原文链接:一.什...

weixin_31869579的博客 234

Java中的自动装箱与拆箱技术详解

自动装箱和拆箱是Java中一项非常有用的特性,它们极大地简化了基本数据类型与包装类型之间的转换过程,提高了编程的便利性和灵活性。然而,在使用时也需要注意其潜在的性能问题和==运算符的陷阱。合理利用这一特性,可以帮助我们编写出更高效、更简洁的Java代码。

m0_61431263的博客 848

Java 中的自动装箱和拆箱原理

写在前面 本来想偷懒不写这篇文章的,但是找了一些网上搜索的文章,感觉讲的不太好,所以专门写了这边文章分享下。 相关链接 JDK 8 中的自动装箱和拆箱的讲解 解答 首先,先了解下什么是自动装箱和拆箱(Autoboxing and Unboxing)。 自动装箱(Autoboxing ):Java编译器在__基本数据类型(the primitive types)__及___其对应的对象包装...

淡淡的回忆 599

Java 中的自动装箱和拆箱

自动装箱是指将基本数据类型转换为对应的包装类型。当使用包装类型作为参数传递给需要相应基本数据类型的方法,或者将基本数据类型赋值给包装类型时,会自动将基本数据类型转换为包装类型。

drhnb的博客 439
上一篇: Java中基本类型及类型转换
下一篇: Java中equals()和==的区别
至学者
博客等级 码龄9年 180粉丝 773原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值