java学习--8个包装类

Java 中的8 个包装类(Wrapper Class) 是为了解决基本数据类型无法直接参与面向对象编程(如不能作为集合元素、无法调用方法)的问题,为每个基本数据类型提供了对应的引用类型。以下是完整的 8 个包装类详解:

一、8 个包装类全览

基本数据类型 对应的包装类 父类 备注
byte Byte Number 字节型,占 1 字节
short Short Number 短整型,占 2 字节
int Integer Number 整型,占 4 字节(唯一非首字母大写)
long Long Number 长整型,占 8 字节
float Float Number 单精度浮点型,占 4 字节
double Double Number 双精度浮点型,占 8 字节
char Character Object 字符型,占 2 字节
boolean Boolean Object 布尔型,无固定字节大小

二、核心特点

1. 继承体系
  • 数值型包装类(Byte/Short/Integer/Long/Float/Double) :继承自 java.lang.Number(抽象类,提供了将包装类转换为基本类型的方法:byteValue()intValue()longValue() 等)。
  • Character/Boolean :直接继承自 java.lang.Object
2. 不可变性

所有包装类都是不可变类(final 修饰,内部值一旦创建无法修改),例如:

复制代码
Integer a = 10;
a = 20; // 并非修改原有对象,而是创建新的Integer对象
3. 自动装箱 / 拆箱(JDK 1.5+)
  • 装箱 :基本类型 → 包装类(自动调用 valueOf() 方法)。
  • 拆箱 :包装类 → 基本类型(自动调用 xxxValue() 方法)。

示例:

复制代码
// 自动装箱(int → Integer)
Integer num = 100; 
// 自动拆箱(Integer → int)
int n = num;       

// 手动装箱/拆箱(底层原理)
Integer num2 = Integer.valueOf(100);
int n2 = num2.intValue();
4. 常量池(缓存机制)

为了优化性能,部分包装类提供了常量池缓存

  • Byte:缓存 -128 ~ 127 的值。
  • Short:缓存 -128 ~ 127 的值。
  • Integer:默认缓存 -128 ~ 127(可通过 JVM 参数 -XX:AutoBoxCacheMax=<size> 调整上限)。
  • Long:缓存 -128 ~ 127 的值。
  • Character:缓存 0 ~ 127 的字符。
  • Float/Double/Boolean:无缓存(浮点数离散,Boolean 仅缓存 TRUE/FALSE 静态常量)。

示例(缓存影响 == 比较):

复制代码
Integer a = 127;
Integer b = 127;
System.out.println(a == b); // true(取自缓存)

Integer c = 128;
Integer d = 128;
System.out.println(c == d); // false(新创建对象)

// 建议用 equals() 比较包装类值
System.out.println(c.equals(d)); // true

三、常用方法

所有包装类都提供了通用的核心方法,以 Integer 为例:

  1. 类型转换

    • static Integer valueOf(int i):返回指定 int 值的 Integer 对象(优先缓存)。
    • static Integer valueOf(String s):将字符串转换为 Integer(需数字格式)。
    • int intValue():拆箱为 int。
    • static int parseInt(String s):字符串转 int(常用)。
  2. 常量

    复制代码
    // Integer的最大值/最小值
    System.out.println(Integer.MAX_VALUE); // 2147483647
    System.out.println(Integer.MIN_VALUE); // -2147483648
  3. 进制转换

    复制代码
    // 十进制转二进制/八进制/十六进制
    System.out.println(Integer.toBinaryString(10)); // 1010
    System.out.println(Integer.toOctalString(10));  // 12
    System.out.println(Integer.toHexString(10));    // a

四、典型应用场景

  1. 集合操作 :集合(如 ListMap)只能存储引用类型,需用包装类:

    复制代码
    List<Integer> list = new ArrayList<>();
    list.add(10); // 自动装箱
    int num = list.get(0); // 自动拆箱
  2. 泛型限定 :泛型只能用引用类型,例如 Map<String, Long>

  3. 空值处理:基本类型不能为 null,包装类可表示 "无值"(如数据库字段 NULL)。

五、注意事项

  1. NPE 风险 :包装类拆箱时如果为 null,会抛出 NullPointerException

    复制代码
    Integer num = null;
    int n = num; // 运行时NPE
  2. equals () 比较 :包装类比较值时必须用 equals(),而非 ==== 比较对象地址)。

  3. 性能:自动装箱 / 拆箱会产生额外开销,高频循环中建议使用基本类型。

总结

Java 8 个包装类是基本类型的 "面向对象包装",核心解决了集合存储泛型使用空值表示等问题,掌握其装箱拆箱、缓存机制、常用方法是 Java 基础的核心要点。

相关推荐
程序员黑豆6 小时前
Java 注释详解:单行、多行与文档注释的完整指南
java·前端·ai编程
油丶酸萝卜别吃7 小时前
前端转全栈学习路线
前端·学习
hey_sml7 小时前
JAVA每日一学---CompletableFuture中thenApply与thenCompose区别详解
java·开发语言
Doraemomo7 小时前
数据结构-环形链表
java·数据结构·链表
萧瑟余晖9 小时前
Java深入解析篇十七之SpringCloud
java·开发语言
是未才9 小时前
从输入 URL 到页面返回:DNS、路由、TLS 与 HTTP 完整链路
java·后端·计算机网络
ttod_qzstudio9 小时前
Java 常用语法极简通关(五):类与对象——字段、方法、构造器、this 与 static
java·开发语言·python
GlueNa2SiO310 小时前
第十八章 Linux故障排查与恢复
linux·服务器·笔记·学习
萧瑟余晖11 小时前
Java深入解析篇十七之Spring Security
java·开发语言·spring
weixin_4316004411 小时前
NestJS 入门(3):Guard 如何挡住未登录请求?
前端·后端·学习·nest.js