首页 > 其他分享 >拆箱和装箱

拆箱和装箱

时间:2024-07-14 13:56:40浏览次数:10  
标签:拆箱 缓存 int high low 127 Integer 装箱

// 手动装箱
Integer integer = new Integer(10);
// 手动拆箱
int i = integer.intValue();
// 自动装箱,通过 Integer.valueOf() 完成
Integer integer = 10;
// 自动拆箱,通过 Integer.intValue() 完成
int i = integer;
  • IntegerCache
public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}
private static class IntegerCache {
    // 缓存的最小值,默认为 -128
    static final int low = -128;

    // 缓存的最大值,默认为 127,但可以通过 JVM 参数配置
    static final int high;
    static final Integer cache[];

    static {
        // 默认情况下 high 值为 127
        int h = 127;

        // 通过系统属性获取用户可能配置的更高的缓存上限
        // integerCacheHighPropValue 是一个字符串,代表配置的高值
        int i = parseInt(integerCacheHighPropValue);

        // 确保缓存的最高值至少为 127
        i = Math.max(i, 127);

        // 设置 high 的值,但不能超过 Integer.MAX_VALUE - (-low) - 1
        h = Math.min(i, Integer.MAX_VALUE - (-low) - 1);
        high = h;

        // 初始化缓存数组,大小为 high - low + 1
        cache = new Integer[(high - low) + 1];

        // 填充缓存,从 low 开始,为每个值创建一个 Integer 对象
        int j = low;
        for(int k = 0; k < cache.length; k++)
            cache[k] = new Integer(j++);

        // 断言确保 high 的值至少为 127,这是 Java 语言规范要求的
        assert IntegerCache.high >= 127;
    }
}

int a = 100;
Integer b = 100;
// 基本数据类型和包装类型进行 == 比较,这时候 b 会自动拆箱,直接和 a 比较值
// true
System.out.println(a == b);

// -128 到 127 之间的数会从 IntegerCache 中取,然后比较,100 在这个范围之内
Integer c = 100;
Integer d = 100;
// true
System.out.println(c == d);

// 200 不在这个范围之内,所以 new 出来了两个 Integer 对象
c = 200;
d = 200;
// false
System.out.println(c == d);
  • 当需要进行自动装箱时,如果数字在 -128 至 127 之间时,会直接使用缓存中的对象,而不是重新创建一个对象
  • 反例
long t1 = System.currentTimeMillis();
Long sum = 0L;
// sum 是个 Long 型,而 i 为 int 类型
for (int i = 0; i < Integer.MAX_VALUE;i++) {
    // 先把 i 强转为 long 型,然后再把 sum 拆箱为 long 型进行相加操作
    // 之后再自动装箱为 Long 型赋值给 sum
    sum += i;
}
long t2 = System.currentTimeMillis();        
System.out.println(t2-t1);

标签:拆箱,缓存,int,high,low,127,Integer,装箱
From: https://www.cnblogs.com/sprinining/p/18301486

相关文章

  • Java基础进阶——128陷阱(剖析Integer类的自动拆箱和装箱)
    一、什么是128陷阱?下面用一段代码展示了什么是128陷阱:publicstaticvoidmain(String[]args){Integera=10;Integerb=10;Integeraa=127;Integerbb=127;Integeraaa=128;Integerbbb=128;......
  • Java 自动装箱跟拆箱
    ava的自动装箱和自动拆箱是Java5引入的特性,它们简化了基本数据类型和其对应的包装类之间的转换。下面是关于这两个特性的详细解释:自动装箱(Autoboxing)自动装箱指的是Java编译器自动将基本数据类型转换为其对应的包装类类型。例如,当你将一个int类型的值赋给一个Integer类型的......
  • 关于Java中 因取消装箱可能产生 'NullPointerException' 的原因
    一.什么是装箱,什么是拆箱?装箱:将值类型转换为引用数据类型。拆箱:将引用数据类型转换为值类型。说白了就是Integer与int数据类型之间的转换二.为什么会有自动一说呢?我们都知道,java是一个面向对象的语言。因此包括数字、字符、日期、布尔值等等再内的一切都是对象。但是对......
  • 求一个算法思路,类似一维装箱?
    有很多小矩形(膜材料和长度可能不一样,但是高度是统一的):a120,a250,b12,b200,c300,c450,…字母表示膜的材料,数值表示长度。要将这些矩形进行分类,变成更大的矩形(水平平铺,不同的膜材料可以放在一起,但是不同材质的矩形之间要留10毫米间距,相同材质的可以紧密接触)。比如:(a120,a250,c30......
  • CSP历年复赛题-P1049 [NOIP2001 普及组] 装箱问题
    原题链接:https://www.luogu.com.cn/problem/P1049题意解读:装尽可能多的物品,使得总体积越大越好,即剩余空间最小,还是一个01背包问题,物品的体积就是其价值。解题思路:01背包模版题,物品体积、价值相同,直接采用一维dp。100分代码:#include<bits/stdc++.h>usingnamespacestd;co......
  • Integer 自动拆箱封箱
    Integer自动拆箱封箱验证。先写一份Integer Double代码  思考一:这几个值true?false?结果是:truefalsefalsefalse思考二:为什么第一个为true,其他都是false? 理由在这里:Integer 自动拆箱和装箱判断 if (i >= IntegerCache.low && i <= IntegerCache......
  • 【题解】[NOIP2001 普及组] 装箱问题
    [NOIP2001普及组]装箱问题这是一道动态规划题。那就先定义状态吧(这里用的是一维滚动数组)。$f[j]$代表当我有$j$这么多容量可以用时,能装的最大重量是多少。好,状态定义好了再想状态转移方程。$f[j]$可以从哪里转移过来呢?想一想,当我们循环到第$i$个物品时,我们面临两个......
  • 洛谷题单指南-动态规划1-P1049 [NOIP2001 普及组] 装箱问题
    原题链接:https://www.luogu.com.cn/problem/P1049题意解读:装尽可能多的物品,使得总体积越大越好,即剩余空间最小,还是一个01背包问题,物品的体积就是其价值。解题思路:01背包模版题,物品体积、价值相同,直接采用一维dp。100分代码:#include<bits/stdc++.h>usingnamespacestd;co......
  • JTCR-枚举、装箱和注解-10
    枚举枚举定义了一个数据类型和该数据类型允许的若干个值,这些值为命名常量。一个枚举实例的值必须是定义的值。Java中,枚举是类类型,可以有构造器、方法和实例变量,甚至实现接口。但不能使用new实例化。enumName{value1,value2,...}//定义Namen=Name.value1;//......
  • 引用类型,值类型,装箱拆箱
    usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespace引用类型{classProgram{classDataTypeTest{publicintVal;}staticvoidMain(string[]args){......