【Java基础】吃透包装类!从手动装箱到自动拆箱,这篇趣味解读让你秒懂✨
哈喽,各位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; // 全程基本类型,无额外对象创建 }
四、趣味小测试(自测一下)
-
Integer a = 127; Integer b = 127; → a == b?(答案:true,因为Integer缓存了-128~127)
-
Integer a = 128; Integer b = 128; → a == b?(答案:false,超出缓存范围,创建新对象)
-
int a = 128; Integer b = 128; → a == b?(答案:true,b自动拆箱成int比较)
💡 提示:Integer有缓存池(-128~127),这也是高频面试题,下次咱们专门聊~
总结
-
8种基本类型对应8个包装类,Integer和Character是特殊写法,别记混;
-
Integer的构造方法已过时,优先用valueOf(),parseInt()转基本类型、valueOf()转包装类;
-
自动拆箱/装箱是“懒人福利”,但循环中频繁装箱会耗内存,返回null场景适合用包装类。
如果这篇文章帮你搞懂了包装类,记得点赞+收藏🌟!有任何踩坑经历,评论区聊聊~咱们下期聊聊Integer缓存池的那些事儿~
更多推荐




所有评论(0)