你好,欢迎来到我的博客!我是【菜鸟不学编程】
我是一个正在奋斗中的职场码农,步入职场多年,正在从“小码农”慢慢成长为有深度、有思考的技术人。在这条不断进阶的路上,我决定记录下自己的学习与成长过程,也希望通过博客结识更多志同道合的朋友。
️ 主要方向包括 Java 基础、Spring 全家桶、数据库优化、项目实战等,也会分享一些踩坑经历与面试复盘,希望能为还在迷茫中的你提供一些参考。
我相信:写作是一种思考的过程,分享是一种进步的方式。
如果你和我一样热爱技术、热爱成长,欢迎关注我,一起交流进步!
首先,包装类是 Java 为了将基本数据类型(如 int
、double
等)转化成对象而设计的类。比如,int
对应的是 Integer
,double
对应的是 Double
,它们提供了对基本类型值的封装,并且可以作为对象使用。
Java 中的包装类包含:
Byte
Short
Integer
Long
Float
Double
Character
Boolean
基本类型 | 包装类 |
---|---|
int |
Integer |
long |
Long |
double |
Double |
float |
Float |
char |
Character |
boolean |
Boolean |
byte |
Byte |
short |
Short |
ArrayList
是不合法的,你必须用 ArrayList
才行。null
判断,这对于某些场景很有用。parseInt()
, toString()
, valueOf()
等。装箱(boxing)和拆箱(unboxing)是包装类和基本数据类型之间的转换过程。它们让我们在基本类型和包装类型之间切换更加便利。
int num = 10;
Integer integerObj = num; // 自动装箱
这个过程自动地将基本数据类型 int
转换成了 Integer
对象。
Integer integerObj = 20;
int num = integerObj; // 自动拆箱
这里,Integer
被自动转换成了 int
。
Java 5 引入了自动装箱(auto-boxing)和自动拆箱(auto-unboxing),让代码更加简洁,减少了我们手动操作的麻烦。举个例子:
Integer a = 100;
Integer b = 100;
if (a == b) {
System.out.println("a 和 b 相等");
}
实际情况:虽然 a
和 b
存储的值相同,但它们不是同一个对象。为什么呢?因为包装类的缓存机制。
Integer a = 100;
Integer b = 100;
System.out.println(a == b); // 输出 true
Integer
类对值从 -128
到 127
的范围做了缓存。也就是说,当你创建 Integer
对象时,如果这个对象的值在 -128
到 127
之间,JVM 会直接从缓存中取,而不是重新创建一个对象。127
的值,JVM 就会新建一个对象。重点:包装类背后藏着巧妙的设计,不是随便装箱就行,而是有精细的内存管理。
包装类不仅仅是用来装数据的,它们还提供了一些非常实用的方法:
parseXxx()
: 字符串转换为基本类型String str = "123";
int num = Integer.parseInt(str); // 将字符串转为基本数据类型
System.out.println(num); // 123
valueOf()
: 字符串转换为包装类String str = "200";
Integer number = Integer.valueOf(str); // 返回 Integer 对象
System.out.println(number); // 200
toString()
: 转换为字符串Integer num = 500;
String str = num.toString(); // 返回 "500"
System.out.println(str); // 500
有人可能会问:包装类增加了装箱和拆箱的操作,会不会影响性能呢?
null
判断或集合操作,尽量用基本数据类型。包装类最牛逼的一点,就是可以为原本不允许为 null
的数据类型提供 null 支持。
Integer num = null;
if (num == null) {
System.out.println("num 还是 null!");
}
int
)不能赋值为 null
,但 Integer
可以。这让你在很多场景下可以优雅地处理缺失值。equals()
的使用包装类比较时,要特别注意 ==
与 .equals()
的区别:
==
比较的是 对象引用是否相同(是否指向同一个内存地址).equals()
比较的是 对象的内容是否相同例如:
Integer a = 100;
Integer b = 100;
System.out.println(a == b); // true,因为 Integer 缓存池的原因
Integer x = 200;
Integer y = 200;
System.out.println(x == y); // false,超出缓存池范围
System.out.println(a.equals(b)); // true
- 为什么
Integer
可以使用==
比较?在什么情况下不行?- 包装类的自动装箱和拆箱是什么?为什么要引入这两个概念?
- 如何避免包装类比较时出错?
- 包装类和基本类型有什么区别?什么时候应该选择包装类?
特性 | 优势 | 注意点 |
---|---|---|
自动装箱 | 方便快捷,避免手动转换 | 自动装箱性能开销存在 |
自动拆箱 | 简化代码 | 注意空值引发 NullPointerException |
包装类方法 | 提供强大的工具方法,如 parseInt 、valueOf |
== 和 equals() 不同,注意比较方式 |
包装类看似只不过是“一个包裹”,但它为 Java 带来了对象化的便利,为我们的编码带来了更多的灵活性。尤其在集合类、null
处理、数据转换等方面,包装类可谓是扮演着重要的角色。
下一篇想了解 Java 的哪些坑?比如 String
字符串优化,或者 集合框架
深入解析?都可以在评论里告诉我,我们一块儿干!
如果你觉得这篇文章对你有帮助,或者有任何想法、建议,欢迎在评论区留言交流!你的每一个点赞 、收藏 ⭐、关注 ❤️,都是我持续更新的最大动力!
我是一个在代码世界里不断摸索的小码农,愿我们都能在成长的路上越走越远,越学越强!
感谢你的阅读,我们下篇文章再见~