哈喽,各位Java萌新们👋!今天咱们不聊高大上的框架,就盘一盘Java里“平平无奇但处处踩坑”的包装类——尤其是Integer这个“老大哥”,以及让人又爱又恨的自动拆箱/装箱。

为啥要学包装类?简单说:基本数据类型是“直男”(只认值),包装类是“暖男”(有对象属性、能调用方法),集合、泛型这些核心场景都离不开它,不学透早晚掉坑里!

一、先认门:8大基本类型的“专属马甲”

Java里8种基本数据类型,每种都有对应的“包装类”(本质是引用类型),就像给基本类型穿了件“对象马甲”,直接上对照表,记不住的建议收藏👇

基本类型

包装类(全大写开头,就俩特例)

趣味备注

byte

Byte

小个子也有马甲穿

short

Short

比byte高一点~

int

Integer(重点!不是Int)

最常用,坑最多

long

Long

数值能装更多

float

Float

浮点型老大哥

double

Double

精度更高的浮点

char

Character(重点!不是Char)

字符的专属马甲

boolean

Boolean

真假都有面儿

💡 小提醒:只有int和char的包装类不是“基本类型名首字母大写”,这俩是高频笔试题,别写错啦!

二、重点攻坚:Integer类——包装类里的“顶流”

Integer是日常开发中用得最多的包装类,咱们从“怎么造、怎么用”两方面扒清楚。

2.1 构造方法(注意!新版Java已淘汰)

先划重点:Java 9之后,Integer的构造方法被标记为@Deprecated(过时),官方推荐用静态方法valueOf替代!但咱还是得知道,毕竟老代码里可能见得到:

// 1. 过时的构造方法(不推荐) Integer num1 = new Integer(100); // 传入int值 Integer num2 = new Integer("100"); // 传入数字字符串(非数字会抛NumberFormatException) // 2. 推荐用法:静态方法valueOf Integer num3 = Integer.valueOf(100); Integer num4 = Integer.valueOf("100");

2.2 核心方法:Integer的“十八般武艺”

Integer的方法分两类:成员方法(对象调用)静态方法(类直接调用),挑最常用的讲,附代码示例👇

(1)成员方法:把Integer转成其他类型
Integer num = 100; // 转成各种基本类型 short s = num.shortValue(); // 转short int i = num.intValue(); // 转int(自动拆箱底层就是调这个!) long l = num.longValue(); // 转long float f = num.floatValue(); // 转float double d = num.doubleValue(); // 转double // 转字符串、比较 String str = num.toString(); // 转String,结果"100" boolean eq = num.equals(100); // 比较值是否相等,true int compare = num.compareTo(99); // 比较大小:大于返回1,等于0,小于-1,这里返回1
(2)静态方法:把其他类型转成int/Integer

这俩是高频考点,一定要分清!

// 1. parseInt:String → int(基本类型) int num1 = Integer.parseInt("100"); // 结果:100(int) // 2. valueOf:String → Integer(包装类) Integer num2 = Integer.valueOf("100"); // 结果:100(Integer) // 坑:非数字字符串会抛异常 // Integer.parseInt("abc"); // 直接报错NumberFormatException

三、自动拆箱/装箱:Java给你的“懒人福利”(也可能是坑)

终于到了最容易踩坑的环节!先给大家翻译翻译:

3.1 到底啥是自动拆箱/装箱?

  • 自动装箱:int(基本)→ Integer(包装),底层偷偷调用Integer.valueOf()

  • 自动拆箱:Integer(包装)→ int(基本),底层偷偷调用intValue()

说白了:Java帮你省了手动调用方法的步骤,比如:

// 自动装箱:int 100 → Integer Integer num = 100; // 等价于 Integer num = Integer.valueOf(100); // 自动拆箱:Integer → int int num2 = num; // 等价于 int num2 = num.intValue(); // 更骚的操作:混合运算(先拆箱成int计算,再装箱成Integer) Integer sum = 100 + 200; // 先拆箱成int相加,再装箱成Integer

3.2 什么时候用?什么时候踩坑?

✅ 适合用的场景:需要返回null的情况

基本类型有默认值(比如int默认0),但包装类可以为null,比如:

// 需求:查询用户年龄,没查到返回null(而不是0,避免歧义) public static Integer getAge(String userId) { // 模拟查询:没查到返回null if ("000".equals(userId)) { return null; } return 18; // 自动装箱 } // 如果用int返回:没法返回null,只能返回0,会和“年龄0岁”混淆 // public static int getAge(String userId) { // return null; // 直接报错!int不能为null // }
❌ 千万别踩的坑:循环里频繁装箱

比如这个例子,看似没问题,实则创建了5000个Integer对象,巨耗内存!

Integer sum = 0; for (int i = 0; i < 5000; i++) { // 每次循环:sum先拆箱成int → 和i相加 → 结果再装箱成新的Integer sum = sum + i; } // 优化方案:用int接收,避免频繁装箱 int sum2 = 0; for (int i = 0; i < 5000; i++) { sum2 += i; // 全程基本类型,无额外对象创建 }

四、趣味小测试(自测一下)

  1. Integer a = 127; Integer b = 127; → a == b?(答案:true,因为Integer缓存了-128~127)

  2. Integer a = 128; Integer b = 128; → a == b?(答案:false,超出缓存范围,创建新对象)

  3. int a = 128; Integer b = 128; → a == b?(答案:true,b自动拆箱成int比较)

💡 提示:Integer有缓存池(-128~127),这也是高频面试题,下次咱们专门聊~


总结

  1. 8种基本类型对应8个包装类,Integer和Character是特殊写法,别记混;

  2. Integer的构造方法已过时,优先用valueOf(),parseInt()转基本类型、valueOf()转包装类;

  3. 自动拆箱/装箱是“懒人福利”,但循环中频繁装箱会耗内存,返回null场景适合用包装类。

如果这篇文章帮你搞懂了包装类,记得点赞+收藏🌟!有任何踩坑经历,评论区聊聊~咱们下期聊聊Integer缓存池的那些事儿~


Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐