int 是我们常说的整形数字,是 Java 的 8 个原始数据类型(Primitive Types,boolean、byte 、short、char、int、float、double、long)之一。Java 语言虽然号称一切都是对象,但原始数据类型是例外。
Integer 是 int 对应的包装类,它有一个 int 类型的字段存储数据,并且提供了基本操作,比如数学运算、int 和字符串之间转换等。在 Java 5 中,引入了自动装箱和自动拆箱功能(boxing/unboxing),Java 可以根据上下文,自动进行转换,极大地简化了相关编程。
关于 Integer 的值缓存,这涉及 Java 5 中另一个改进。构建 Integer 对象的传统方式是直接调用构造器,直接 new 一个对象。但是根据实践,我们发现大部分数据操作都是集中在有限的、较小的数值范围,因而,在 Java 5 中新增了静态工厂方法 valueOf,在调用它的时候会利用一个缓存机制,带来了明显的性能改进。按照 Javadoc,这个值默认缓存是 -128 到 127 之间。
它们之间的主要区别在于以下几点:
总结:
在实际编码中,通常可以直接使用 int,但在需要对象的上下文中(例如集合,泛型类,方法参数等),可以使用 Integer。此外,自Java 5以来,引入了自动装箱和自动拆箱的特性,可以方便地在基本类型和其对应的包装类型之间进行转换。例如,你可以将 int 自动装箱为 Integer,反之亦然。
自动装箱(Autoboxing)和自动拆箱(Unboxing)是Java中的两个特性,它们允许在基本数据类型(如 int, double, char 等)和对应的包装类型(如 Integer, Double, Character 等)之间进行自动转换。
自动装箱是指将基本数据类型自动转换为其对应的包装类型。这是通过Java编译器在需要的上下文中自动完成的,保证不同的写法在运行时等价,它们发生在编译阶段,也就是生成的字节码是一致的。例如,将 int 转换为 Integer:相当于使用Integer.valueOf()方法
int a = 42;
Integer b = a; // 自动装箱
// 等价于 Integer b = Integer.valueOf(a); // 显式装箱
在这里,a 是一个基本的整数类型,而将它赋给 b 时,会自动转换为 Integer 对象。这样的转换在需要使用对象而实际上只有基本数据类型可用的情况下很方便。
自动拆箱是指将包装类型自动转换为其对应的基本数据类型。同样,这也是由Java编译器在需要的上下文中自动完成的。例如,将 Integer 转换为 int:
Integer b = 42;
int a = b; // 自动拆箱
// 等价于 int a = b.intValue(); // 显式拆箱
在这里,a 是一个 Integer 对象,而将它赋给 b 时,会自动转换为基本的整数类型。
自动装箱和自动拆箱的引入简化了代码,并提高了代码的可读性。它们在Java 5及以后的版本中被引入,旨在使基本数据类型和其对应的包装类型之间的转换更加方便。但在一些性能敏感的场景,需要注意自动装箱和拆箱可能引起的性能开销。
自动装箱 / 自动拆箱似乎很酷,在编程实践中,有什么需要注意的吗?原则上,建议避免无意中的装箱、拆箱行为,尤其是在性能敏感的场合,创建 10 万个 Java 对象和 10 万个整数的开销可不是一个数量级的,不管是内存使用还是处理速度,光是对象头的空间占用就已经是数量级的差距了。
我们其实可以把这个观点扩展开,使用原始数据类型、数组甚至本地代码实现等,在性能极度敏感的场景往往具有比较大的优势,用其替换掉包装类、动态数组(如 ArrayList)等可以作为性能优化的备选项。一些追求极致性能的产品或者类库,会极力避免创建过多对象。当然,在大多数产品代码里,并没有必要这么做,还是以开发效率优先。
坦白说,理解基本原理和用法已经足够日常工作需求了,但是要落实到具体场景,还是有很多问题需要仔细思考才能确定。
在面试中,面试官可以结合其他方面,来考察面试者的掌握程度和思考逻辑,比如:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有