Java的包装类及其缓存机制

ops/2024/11/25 13:05:48/

Java的包装类及其缓存机制

​ Java 的包装类(Wrapper Classes)是为每种基本数据类型提供的对象表示。基本数据类型(如 intdouble 等)是非对象类型,而包装类为它们提供了对应的对象版本,以便可以在需要对象的地方使用这些基本类型。包装类都位于 java.lang 包中,使用时无需显式导入。

一、Java的包装类

1、基本数据类型与对应的包装类

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

2、包装类的用途

  1. 对象化:包装类允许基本数据类型在需要对象的上下文中使用。例如:

    • 在集合类(如 ArrayListHashMap)中存储和操作基本数据类型时,因为集合只能存储对象。
    java">ArrayList<Integer> list = new ArrayList<>();
    list.add(10); // 自动装箱
    list.add(20);
    
  2. 提供实用方法:包装类包含许多有用的方法,比如:

    • 字符串和基本数据类型的相互转换。
    • 获取类型的最大值和最小值。
    • 类型的静态常量和元信息。
  3. 自动装箱与拆箱(从 Java 5 开始):

    • 自动装箱:将基本数据类型自动转换为对应的包装类对象。
    • 自动拆箱:将包装类对象自动转换为对应的基本数据类型。

3、包装类的重要功能

3.1 静态方法

包装类提供了许多静态方法,用于基本数据类型的常见操作。例如:

  • parseXXX(String):将字符串转换为对应的基本数据类型。

    java">int num = Integer.parseInt("123");
    double d = Double.parseDouble("45.67");
    
  • valueOf(String):将字符串转换为包装类对象。

    java">Integer num = Integer.valueOf("123");
    
  • toString():将包装类对象转换为字符串。

    java">Integer num = 100;
    String str = num.toString(); // "100"
    
3.2 常量

包装类提供了一些静态常量,比如:

  • 最大值和最小值:

    java">int max = Integer.MAX_VALUE; // 2147483647
    int min = Integer.MIN_VALUE; // -2147483648
    
3.3 自动装箱与拆箱

从 Java 5 开始,可以直接将基本数据类型与包装类互换,无需手动创建对象或调用方法:

  • 自动装箱:

    java">Integer num = 100; // 等效于 Integer.valueOf(100)
    
  • 自动拆箱:

    java">int value = num; // 等效于 num.intValue()
    
3.4 比较
  • equals():比较两个包装类对象的值是否相等。

    java">Integer num1 = 100;
    Integer num2 = 100;
    System.out.println(num1.equals(num2)); // true
    
  • compareTo():用于比较两个包装类对象,返回:

    • 正数:当前对象大于指定对象。
    • 负数:当前对象小于指定对象。
    • 0:两者相等。
    java">Integer num1 = 10;
    Integer num2 = 20;
    System.out.println(num1.compareTo(num2)); // -1
    

注意事项

  1. 值的缓存IntegerShortByteCharacterBoolean):

    • 对于值在 -128127 范围内的 Integer,会从缓存中返回对象,而不创建新对象。

    • 示例:

      java">Integer num1 = 127;
      Integer num2 = 127;
      System.out.println(num1 == num2); // true,指向同一个缓存对象Integer num3 = 128;
      Integer num4 = 128;
      System.out.println(num3 == num4); // false,不在缓存范围内,创建了新对象
      
  2. 性能开销

    • 包装类的使用涉及对象创建和拆箱过程,性能比直接使用基本数据类型稍慢。

综合示例

java">public class WrapperExample {public static void main(String[] args) {// 自动装箱与拆箱Integer num = 100; // 自动装箱int value = num;   // 自动拆箱// 静态方法String str = "123";int intValue = Integer.parseInt(str);Double doubleValue = Double.valueOf("45.67");// 比较Integer num1 = 127;Integer num2 = 127;System.out.println(num1 == num2); // true (缓存)Integer num3 = 128;Integer num4 = 128;System.out.println(num3 == num4); // falseSystem.out.println("最大值:" + Integer.MAX_VALUE);System.out.println("最小值:" + Integer.MIN_VALUE);}
}

Java中基本数据类型的缓存机制

​ 在 Java 中,不同基本数据类型的包装类对值的缓存范围和机制有所不同。以下是各包装类的缓存策略:


1. Integer 缓存

  • 范围-128127

  • 实现Integer 类通过静态内部类 IntegerCache 实现缓存

  • 适用场景:当使用 valueOf() 方法或自动装箱时,如果值在缓存范围内,直接返回缓存对象;否则,创建新对象。

  • 代码验证:

    java">Integer num1 = 127;
    Integer num2 = 127;
    System.out.println(num1 == num2); // true,来自缓存Integer num3 = 128;
    Integer num4 = 128;
    System.out.println(num3 == num4); // false,超出缓存范围
    

2. Short 缓存

  • 范围-128127

  • 实现:与 Integer 类似,Short 也通过静态缓存实现。

  • 验证代码:

    java">Short s1 = 127;
    Short s2 = 127;
    System.out.println(s1 == s2); // trueShort s3 = 128;
    Short s4 = 128;
    System.out.println(s3 == s4); // false
    

3. Byte 缓存

  • 范围-128127

  • 实现:由于 byte 的值范围本身就是 -128127,所以所有的 Byte 对象都使用缓存

  • 验证代码:

    java">Byte b1 = 127;
    Byte b2 = 127;
    System.out.println(b1 == b2); // trueByte b3 = -128;
    Byte b4 = -128;
    System.out.println(b3 == b4); // true
    

4. Long缓存

  • 范围-128127

  • 实现:与 Integer 类似,Long 通过静态缓存实现。

  • 验证代码:

    java">Long l1 = 127L;
    Long l2 = 127L;
    System.out.println(l1 == l2); // trueLong l3 = 128L;
    Long l4 = 128L;
    System.out.println(l3 == l4); // false
    

5. Character 缓存

  • 范围\u0000(0)到 \u007F(127,即 ASCII 字符)。

  • 实现Character 通过静态缓存实现。

  • 验证代码:

    java">Character c1 = 127;
    Character c2 = 127;
    System.out.println(c1 == c2); // trueCharacter c3 = 128;
    Character c4 = 128;
    System.out.println(c3 == c4); // false
    

6. Boolean 缓存

  • 范围:仅缓存 truefalse 两个值。

  • 实现Boolean 直接缓存了两个对象(Boolean.TRUEBoolean.FALSE)。

  • 验证代码:

    java">Boolean bool1 = true;
    Boolean bool2 = true;
    System.out.println(bool1 == bool2); // trueBoolean bool3 = false;
    Boolean bool4 = false;
    System.out.println(bool3 == bool4); // true
    

7. FloatDouble

  • 没有缓存机制:

    • 因为 floatdouble 的值范围较大,且分布不均,未实现缓存机制。
    • 每次创建包装类对象时,都会分配新的对象。
  • 验证代码:

    java">Float f1 = 1.0f;
    Float f2 = 1.0f;
    System.out.println(f1 == f2); // falseDouble d1 = 1.0;
    Double d2 = 1.0;
    System.out.println(d1 == d2); // false
    

总结:缓存范围对比

包装类缓存范围备注
Byte-128127全部缓存
Short-128127部分缓存
Integer-128127部分缓存
Long-128127部分缓存
Character\u0000\u007F部分缓存(ASCII 范围)
Booleantruefalse完全缓存
Float缓存每次创建新对象
Double缓存每次创建新对象

结论

  • 整数型包装类(ByteShortIntegerLong)都缓存-128127 范围的值。
  • Character缓存 ASCII 范围的字符。
  • Boolean 缓存了两个固定值:truefalse
  • 浮点型包装类(FloatDouble)没有缓存机制。

http://www.ppmy.cn/ops/136574.html

相关文章

手撕一个阻塞队列

目录 手撕一个阻塞队列代码讲解 手撕一个阻塞队列 要手撕一个阻塞队列&#xff1a;就要实现一个普通的队列&#xff0c;加上阻塞&#xff0c;加上锁 代码 class MyBlockingQueue{private String[] elemsnull;private int tail0;private int head0;private int size0;private…

鸿蒙NEXT开发-Navigation组件导航

注意&#xff1a;博主有个鸿蒙专栏&#xff0c;里面从上到下有关于鸿蒙next的教学文档&#xff0c;大家感兴趣可以学习下 如果大家觉得博主文章写的好的话&#xff0c;可以点下关注&#xff0c;博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

OmniDiskSweeper :一款专为 macOS 设计的磁盘使用分析工具

OmniDiskSweeper 是一款专为 macOS 设计的磁盘使用分析工具&#xff0c;由 The Omni Group 开发。它的主要目的是帮助用户可视化磁盘上的文件和文件夹&#xff0c;并找出占用大量空间的文件&#xff0c;从而帮助用户释放磁盘空间。 OmniDiskSweeper 的特点包括&#xff1a; 简…

【反向迭代器】—— 我与C++的不解之缘(十七)

前言 ​ 在STL中的迭代器部分&#xff0c;之前只关注与正向迭代器&#xff0c;忽视了反向迭代器&#xff1b;现在来看一下反向迭代器到底是个什么东西&#xff0c;以及反向迭代器怎么实现&#xff0c;怎么为之前自己模拟实现的容器增加反向迭代器&#xff1f; 反向迭代器的使用…

windows vscode C++ 简明教程

windows vscode C++ 简明教程 1 安装mingw64 MinGW-w64(Minimalist GNU for Windows 64)是一个开源工具集,用于在 Windows 系统上编译和生成原生的 Windows 应用程序。它是 MinGW 项目的扩展版本,支持 32 位和 64 位 Windows 程序开发。MinGW-w64 提供了 Windows 版的 GN…

归并排序与逆序对问题(C语言版)

一、引言 归并排序是一种高效且稳定的排序方法&#xff0c;而逆序对问题是算法领域的一个经典问题&#xff0c;本文教大家如何实现归并排序&#xff0c;以及如何使用归并排序去结果逆序对问题 二、归并排序 归并排序思想 分解&#xff1a;将待排序的数组分成两半&#xff0c…

windows11下git与 openssl要注意的问题

看了一下自己贴文的历史&#xff0c;有一条重要的忘了写了。 当时帮有位同事配置gitlab&#xff0c;众说周知gitlab是不太好操作。 但我还是自认自己git还是相当熟的。 解决了一系列问题&#xff0c;如配置代理&#xff0c;sshkey&#xff0c;私有库&#xff0c;等等&#xff0…

数据集-目标检测系列- 安全背心 检测数据集 safety_vests >> DataBall

数据集-目标检测系列- 安全背心 检测数据集 safety DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 贵在坚持&#xff01; 数据样例项目地址&#xff1a; * 相关项目 1&#xff09;数据集可视化项目&#xff1a;gi…