自动装箱/拆箱

Java Integer包装类缓存(cache) Java的Integer类有一个内部的缓存机制,主要用于优化自动装箱(autoboxing)和拆箱(unboxing)的性能。这个特性首次引入于Java 5,旨在减少对频繁使用的小整数值的重复对象创建,从而提高性能和减少内存使用。 阅读详情
Integer x = null;
System.out.println(2 * x); 

运行结果:

Exception in thread “main” java.lang.NullPointerException

这是因为x在与2进行相乘之前会先进行自动拆箱
即 x.intValue()
因为x是null,所以会引发空指针异常。

对于八大基本类型,他们都有相应的包装类。并且包装类都是用final修饰的,无法再派生子类。
那么为什么会有包装类呢?因为有时需要将基本类型装换为对象。

以下是int的包装类Integer

public final class Integer extends Number implements Comparable<Integer> {
    /**
     * A constant holding the minimum value an {@code int} can
     * have, -2<sup>31</sup>.
     */
    @Native public static final int   MIN_VALUE = 0x80000000;
    ...
    ...
    ...
}

所有的数值基本类型包装类的超类都是Number类(除了Character和Boolean)

以下演示装箱和拆箱
将int类型变换为Integer类型为装箱
相反,将Integer类型转换为int类型的拆箱

		Integer x = 110;
        int t = 110;
        Integer tt = Integer.valueOf(t);//装箱
        int xx = x.intValue();//拆箱

Integer装箱源码

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

Integer拆箱源码

	private final int value;
	
    public int intValue() {
        return value;
    }

看一段代码:

		Integer a1 = 128;
        Integer a2 = 128;
        System.out.println(a1 == a2);

        a1 = 127;
        a2 = 127;
        System.out.println(a1 == a2);

我们都知道 == 比较的是对象在内存中的位置
那么这两个 输出的答案是什么呢?
false
true

为什么会这样呢?
128相比较不相等 肯定是因为在内存中创建了两个新的Integer对象。
127不相等则是因为Integer中的这段代码

    /**
     * Cache to support the object identity semantics of autoboxing for values between
     * -128 and 127 (inclusive) as required by JLS.
     *
     * The cache is initialized on first usage.  The size of the cache
     * may be controlled by the {@code -XX:AutoBoxCacheMax=<size>} option.
     * During VM initialization, java.lang.Integer.IntegerCache.high property
     * may be set and saved in the private system properties in the
     * sun.misc.VM class.
     */

    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() {}
    }

可以看出,Integer类一实例化,就会将[-128,127]中所有的数在静态块中进行缓存操作,也就是这个范围内的数已经给你包装好了,你只需要将引用指向这个对象就行了,所以,在比较利用==比较127时,其实比的是用一个对象的两个不同名称的引用罢了。

【任何电机可使用的七段式s曲线-----包括matlab代码和simulink仿真】 S形加加速(T1)→>匀加速(T2)→减加速(T3)→>匀速(T4 )>加减速(T5)>匀减速(T6)-→>减减速(T7) 阅读详情

相关推荐

Blender关于GIS安装及使用天地图

Blender下载安装及GIS插件的安装及使用

Miss_SQ的博客 6968

Integer比较时用==还是equals

一般情况在代码代码中比较interger的值时用==是没有问题的,但是也存在一定的范围。可以看到,当Integer表示的值在[-128 ~ 127]之间,使用==时能达到我们的预期的。可是一旦超过这个范围,结果就不是我们想要的了。如上图,我们看到一旦integer超过了[-128~127],==比较的结果为false;这是因为Integer在进行比较的时候会自动的进行拆箱操作,而进行拆箱操作的时候会调用valueOf方法。

admin_wuekte的博客 8493

Web3前沿技术的智能合约安全审计

随着Web3技术的快速发展,智能合约作为区块链应用的核心组件,其安全性问题日益突出。本文旨在系统性地介绍智能合约安全审计的技术体系,帮助开发者理解智能合约安全风险,掌握安全审计的方法论和工具链。智能合约安全的基本概念常见漏洞类型及其原理安全审计的技术方法实际审计案例分析安全审计工具和资源首先介绍基本概念和背景然后分析常见漏洞和安全风险接着详细讲解安全审计技术提供实际案例和代码示例最后讨论工具资源和未来趋势智能合约:运行在区块链上的自执行程序,代码即法律安全审计。

AI天才研究院 1545

integer使用==号比较的问题

这主要涉及Integer与int之间的自动拆装箱问题,==号的使用情况, 当Integer与Integer之间比较时,比较的是引用地址,但是具体还得看Integer是如何创建的,可能会发生自动拆装箱, 当int与int比较时,就是直接比较的字面量的值, 当int与Integer比较时,得看具体是如何创建的,可能会发生自动拆装箱,如以下几种经典情况: Integer与Integer比较 ...

jonesAriven的博客 2986

基于carsim与Simulink联合仿真的车辆换道轨迹规划与轨迹跟踪模型

PID_反步控制_滑膜控制三种四旋翼无人机轨迹跟踪控制算法仿真 附带对应的说明文档,提供建模过程与仿真结果文献(英文)➕PPT 描述:采用的同一种参考轨迹,都是三维仿真 三种控制方法: [1]PID控制、[2]反步控制、[3]滑膜控制(三个仿真模型) 每个仿真均应用了同一种轨迹路径,直接运行即可出三维图,可以实现四旋翼无人机轨迹的跟踪

2501_90804007的博客 1083

NXP(恩智浦)—TJA1043TK CAN收发器芯片详解

本文章主要讲解NXP(恩智浦)—TJA1043TK CAN收发器的相关知识。

零零刷的博客 2201

java中int与Integer用==比较详解

前言:    越是简单的东西,我们往往越是没有去把它明白,但我们大部分时间又常常在用,就像我们今天说的int与Integer的使用,我们程序员基本天天都在用,但是我今天没用详细弄清楚之前我也是不清楚,我们来看看这两个在用==号比较给我们带来的疑问。        先看看下面的代码,看看我们是否都会        @Test public void testEquals() { int int...

xingkongdeasi的专栏 5万+

Trae的付费之路还挺艰难,茫茫多的人想付付不了(附解决办法)

不得不说,Trae国际版这个付费其实整的挺复杂的,但没办法,毕竟有政策限制,付费成功后,你就是尊贵的Pro用户啦,使用Claude 4不排队还是挺爽的,而且600次其实不算少了,有一个小技巧,简单的问题就把模型切到Gemini-2.5-flag,因为使用这个模型是没有次数限制的。其次付费的时候有个ZIP Code,这东西也是个迷之存在,有的地区节点需要填,有的不需要,如果你选到了不需要填的节点,那很好,付费就行了,如果需要填,可以填一个51800试试。

cpp加油站的专栏 5877

interger 装箱

:true 128 :false /** * Cache to support the object identity semantics of autoboxing for values between * -128 and 127 (inclusive) as required by JLS. * * The cache is initi...

sinat_29066773的博客 469

KNN算法

其原理是在给定的数据集中,根据某个距离度量方法,将测试数据与已知数据集中的所有数据进行距离计算,然后选取K个距离最近的数据作为测试数据的邻居,根据邻居的类别进行投票,将测试数据分类到得票最多的类别中。总之,KNN算法是一种简单而有效的分类方法,它不需要对数据进行训练,可以适用于多种数据类型和应用场景,并且可以通过调整K值或距离阈值等参数来控制算法的复杂度和性能。,KNN算法需要找到K个距离测试样本最近的训练样本,计算它们的类别,并将测试样本归入到得票最多的类别中。则取值为1,否则为0,表示邻居中属于类别。

优快云XXCQ的博客 2628

MATLAB应用实战系列(四十三)-基于MATLAB的光伏并网系统仿真设计

在Matlab中建立光伏电站接入系统模型,包括光伏发电逆变器及负荷模型等,仿真分析接入点处的电能质量,实现高品质并网运行。 壹 构建太阳能电池模型。 初始化参数如下图所示。 贰 构建MPPT控制模型。 具体封装如下所示: 通过PWM算法实现DC-DC稳步输出最大点。 叁 三、构建直流短距离输电线路。 仿真模型如下图: 通过电容来均衡线路电压,使得线路电压保持可靠性。 肆 通过逆变器变换,使得直流线路转换成...

wenyusuran的专栏 3168

java自动装箱_Java的自动装箱/拆箱

概述自JDK1.5开始, 引入了自动装箱/拆箱这一语法糖, 它使程序员的代码变得更加简洁, 不再需要进行显式转换。基本类型与包装类型在某些操作符的作用下, 包装类型调用valueOf()方法将原始类型值转换成对应的包装类对象的过程, 称之为自动装箱; 反之调用xxxValue()方法将包装类对象转换成原始类型值的过程, 则称之为自动拆箱。实现原理首先我们用javap -cAutoBoxingDe...

weixin_42298802的博客 493

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java自动装箱/拆箱机制可能引发的问题

自动装箱/拆箱机制与相等比较引发的问题记录,新手详细记录。

changyana的博客 997

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

NTscan扫描工具

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

java装箱和拆箱的意义_Java自动装箱/拆箱

在 让人疑惑的Java代码 一文中我们说到编译器自动为我们加上valueOf这个方法吗?忘了没关系,我们来回顾一下,源代码如下:编译一下,拿到class文件,我们反编译一下,变成了如下代码:这个加上valueOf方法的过程,就是Java中经常说的装箱过程。Java中一共有四类八种基本数据类型,除掉这几种类型,其它的都是对象,也就是引用类型。在JDK1.5中,给这四类八种基本类型加入了包装类,对应如...

weixin_42299494的博客 1611

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Java的自动装箱/拆箱

概述 自JDK1.5开始, 引入了自动装箱/拆箱这一语法糖, 它使程序员的代码变得更加简洁, 不再需要进行显式转换。基本类型与包装类型在某些操作符的作用下, 包装类型调用valueOf()方法将原始类型值转换成对应的包装类对象的过程, 称之为自动装箱; 反之调用xxxValue()方法将包装类对象转换成原始类型值的过程, 则称之为自动拆箱。 实现原理 首先我们用javap -cAutoBo...

weixin_34138255的博客 156

浅谈JAVA中的自动装箱/拆箱

前言:自动装箱和拆箱是JDK1.5提供的新特性,大致是由编译器自动帮助完成基本类型和基本类型的包装类之间的转换。 好吧,知道了自动装箱的大致意思之后,我们先来复习一个有关基本类型以及包装类的概念: 基本类型:int,double,float,long,boolean,char,btye,short 基本类型包装类:Integer,Double,Float,Long,Boolean,Char,

derson2388的专栏 4543

Java自动装箱/拆箱

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

weixin_56395837的博客 3202

java自动装箱_Java自动装箱/拆箱

在让人疑惑的Java代码 - 知乎专栏 一文中我们说到编译器自动为我们加上valueOf这个方法吗?忘了没关系,我们来回顾一下,源代码如下:编译一下,拿到class文件,我们反编译一下,变成了如下代码:这个加上valueOf方法的过程,就是Java中经常说的装箱过程。Java中一共有四类八种基本数据类型,除掉这几种类型,其它的都是对象,也就是引用类型。在JDK1.5中,给这四类八种基本类型加入了包...

weixin_29251337的博客 161

Java基础 关于Integer的自动装箱/拆箱机制与Integer类的部分特性

Java基础 关于Integer的自动装箱/拆箱机制与Integer类的部分特性 本文引用了知乎ID “技术小黑屋” [https://zhuanlan.zhihu.com/p/25130481] 自动装箱/拆箱的概念 指的是Java会自动将基本数据类型转换为相应的对象,例如int转Integer,反之为拆箱,即Integer转int类型,java是面向对象开发的语音,所以当一个值包装为一个类的时候会更便于我们去操作它;我们看到装箱拆箱的操作时编译期间自动完成的,装箱是调用了Integer.valueOf(

qq_38317445的博客 388

Java之自动装箱/拆箱

Java之自动装箱/拆箱 一、自动装箱 1.概念:自动装箱就是自动将数据类型转换成包装器类型; 举例: public static void main(String[]args){ Integer integer=1; //装箱 } 自动装箱都是通过包装类的valueOf()方法来实现的 二、自动拆箱 1.概念:自动拆箱就是自动将包装器类型转换成基本数据类型; 举例: public static void main(String[]args){ int i=integer; //拆箱

只须一笑不须愁X的博客 535

Java包装类型自动装箱/拆箱导致NPE

包装器类型和基本数据类型都可以的业务场景下,优先考虑使用基本类型对于不确定的包装器类型,一定要对NULL情况做检验和判断。

BASK2312的博客 1001

自动装箱/自动拆箱

int----->Integer char—>Character 2.jdk5.0之后提供了自动装箱和自动拆箱: 3.基本数据类型/包装类与String类型之间的转换: Integer i = 10;//自动装箱 基本数据类型/包装类–>String: valueOf(Xxx xxx) String–>基本数据类型/包装类: parseXxx(String s) tips:要转成String,找String类的方法 要转成包装类,找包装类里的方法 ...

FunnyPrince_的博客 167

Java 基本类型与包装类:自动装箱 / 拆箱的底层原理 + 易错点

Java自动装箱与拆箱机制解析及避坑指南 本文深入剖析Java基本类型与包装类的核心区别,重点解读自动装箱/拆箱的底层原理。通过Integer等包装类的源码分析,揭示valueOf()缓存机制(-128~127范围)及其对等值判断的影响。结合实战案例,总结五大易错点:空指针异常(null拆箱)、等值判断错误(误用==)、性能损耗(循环内频繁装箱)、不可变性误解以及方法参数传递陷阱。文章特别指出在Java17+中的优化点,并给出高频场景下的性能优化建议。最后延伸讨论面试高频问题和扩展学习方向,帮助开发者规避&

m0_67391377的博客 775

java自动装箱拆箱,自动装箱/拆箱在Java中如何工作?

Since JDK 5.0, auto boxing/unboxing was introduced in Java. The trick is simple and helpful, but when I started testing different conversions between wrapper classes and primitive types, I get really ...

weixin_33855603的博客 110

J2SE 5.0新特性(四)自动装箱/拆箱

从J2SE5将自动装箱/拆箱的概念引入到Java中。 自动装箱:每当我们需要一种类型的对象时,基本数据类型就被自动封装到与它相同类型的包装器中,并返回 自动拆箱:当我们需要一个值时,这个被装箱到对象中的值就会被自动的提取出来,不需要我们手动去调用xxValue()方法。 自动装箱/拆箱机制的引入,大大简化了编程,免除了对值进行手工装箱/拆箱繁琐的工作,同时可以避免发生错误。而且,它对泛型有十分重要的作用。

Java学习小天地 672
上一篇: Java是按值调用还是按引用调用的?
下一篇: 反射-基本了解(Class类)
大锤997
博客等级 码龄6年 4粉丝 13原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值