java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java包装类缓存机制

Java中包装类的缓存机制详细讲解

作者:kitirose

Java中的包装类缓存机制是指在Java 5中引入的一个功能,该功能可以帮助节省内存、提高性能,这篇文章主要介绍了Java中包装类缓存机制的相关资料,文中通过代码介绍地方非常详细,需要的朋友可以参考下

Java中包装类的缓存机制是为了提升性能、减少重复对象创建,其中以Integer的缓存最为典型。下面分三部分详细讲解:

一、Integer的缓存机制(重点)

Integer的缓存机制由IntegerCache内部类实现,核心逻辑是:预先创建并缓存一定范围的Integer对象,当需要使用该范围的整数时,直接返回缓存中的实例,而非新创建对象

1. 缓存范围

默认情况下,缓存范围是 -128 ~ 127(Java规范强制要求)。

2. 触发场景

缓存仅在自动装箱(基本类型→包装类)或调用Integer.valueOf(int) 时生效,直接new Integer(int)会强制创建新对象(不使用缓存)。

代码示例

public class IntegerCacheDemo {
    public static void main(String[] args) {
        // 自动装箱(触发缓存)
        Integer a = 127;
        Integer b = 127;
        System.out.println(a == b); // true(同一缓存对象)

        // 超过缓存范围
        Integer c = 128;
        Integer d = 128;
        System.out.println(c == d); // false(新对象)

        // 显式调用valueOf(触发缓存)
        Integer e = Integer.valueOf(127);
        Integer f = Integer.valueOf(127);
        System.out.println(e == f); // true

        // new关键字(不触发缓存,强制新建)
        Integer g = new Integer(127);
        Integer h = new Integer(127);
        System.out.println(g == h); // false(不同对象)
    }
}

二、其他基本类型包装类的缓存机制

Integer外,部分包装类也有缓存机制,但范围和实现略有不同,总结如下:

包装类缓存范围说明
Byte-128 ~ 127全部缓存(因Byte取值范围仅为-128~127)
Short-128 ~ 127固定范围,不可调整
Long-128 ~ 127固定范围,不可调整
Character0 ~ 127对应ASCII字符(常用字符)
Booleantruefalse仅缓存两个静态实例(Boolean.TRUE/FALSE
Float无缓存浮点型取值范围太广,缓存无意义
Double无缓存同上

代码示例(其他包装类)

// Byte缓存(全部范围)
Byte b1 = 127;
Byte b2 = 127;
System.out.println(b1 == b2); // true(缓存)

// Character缓存(0~127)
Character c1 = 'a'; // ASCII码97,在缓存范围
Character c2 = 'a';
System.out.println(c1 == c2); // true

Character c3 = '中'; // Unicode码20013,超出缓存
Character c4 = '中';
System.out.println(c3 == c4); // false

// Boolean缓存
Boolean bool1 = true;
Boolean bool2 = true;
System.out.println(bool1 == bool2); // true(同一实例)

三、包装类 vs 基本数据类型:使用场景对比

选择的核心依据是:是否需要“对象特性”或“null值”

1. 优先用基本数据类型的场景

示例

// 局部变量用基本类型(高效)
int count = 0;
for (int i = 0; i < 1000; i++) {
    count += i; // 基本类型运算效率高
}

2. 必须用包装类的场景

3. 注意事项

总结

实际开发中,根据是否需要“对象特性”或“null值”选择即可,避免过度使用包装类导致性能损耗。

到此这篇关于Java中包装类的缓存机制详细讲解的文章就介绍到这了,更多相关Java包装类缓存机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文