Java中关于Integer的使用

首先,我们先来看一下下面的代码:

ini 复制代码
Integer a = 20;
Integer b = 20;
System.out.println(a == b);

Integer c = 128;
Integer d = 128;
System.out.println(c == d);

小伙伴们能否一眼看出结果?然后用idea运行看看,跟自己想的结果是否一样?

今天我们就来说说java中Integer的使用问题。 下面先贴出运行结果:

至于为什么会出现以上的结果呢?我们先来看看"=="操作符,对于对象,也就是引用类型,"=="操作符比较的是对象在内存中的地址(即是否为同一个对象)。Integer不是java中的基础数据类型,Integer是int的包装类,属于对象,所以例子中的System.out.println(a == b);System.out.println(c == d);是判断a对象和b对象、c对象和d对象的内存地址是否相等。

那么为什么会出现一个是true一个是false的结果呢?我们来看下JDK的源码:

ini 复制代码
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;
        //就是这里初始化[-128,127]这个范围的数据放入到cache数组中。
        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类的源码,我们发现,Integer类中有一个名为IntegerCache的静态内部类,IntegerCache类中有一个static静态代码块,java静态代码块会在类加载时运行。IntegerCache类中有一个Integer类型的cache数组,系统启动的时候就会初始化-128,127这个范围的数值放入cache数组中,看debug截图:

我们再来看看Integer a = 20;这行代码,在执行Integer a = 20;的时候,底层是会进行自动装箱的:

ini 复制代码
Integer a = 20;
//底层会进行自动装箱
Integer a = Integer.valueOf(20);

来看下valueOf方法的源码:

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

总结:

i的值 >= -128并且 <= 127的时候,就直接从IntegerCache类中的cache数组里面取,然后返回;否则的话,就调用new Integer方法去创建新的Integer对象。至于为什么是-128,127这个区间呢?是因为这个范围内的数值我们平时用的比较多。这是程序开发中的池化思想,对于常用的整数值,直接从缓存池中获取对象,减少了对象的创建和垃圾回收的开销。

相关推荐
知识的搬运工旺仔43 分钟前
CREATE INDEX CONCURRENTLY:线上建索引不阻塞 DML 的代价与坑
数据库·后端·sql
小蒜学长1 小时前
大学生健康饮食的智慧管理系统(代码+数据库+LW)
java·后端·springboot·大学生·健康饮食
小蒜学长1 小时前
基于Java的论坛数据可视化分析系统的设计与实现(代码+数据库+LW)
java·spring boot·后端·数据可视化·论坛系统
青山木1 小时前
RocketMQ 入门到原理(一):整体架构与消息的生命周期
java·分布式·后端·中间件·架构·rocketmq
黑马程序员毕设2 小时前
基于微信小程序的二手交易平台设计与实现报告
前端·人工智能·spring boot·后端·考研
十二同学啊2 小时前
Drools规则引擎:让复杂业务规则从代码中解耦
java·后端·开源
打工仔折腾 AI3 小时前
Pascal Editor 本地部署实战:Bun 启动 WebGPU 3D 编辑器并解决公网访问报错
人工智能·后端·python·性能优化
用户EasyAdminBlazor3 小时前
EasyAdminBlazor 2.3 源码架构解析:Blazor Admin 请求到底是怎么跑起来的?
后端