搜索
写经验 领红包

itege和log类型数据大小比较(从it到itege的过程叫做)

导语:从Integer(Long)的比较说开去

Java

在我们的项目中,一些开发人员喜欢在Entity、DTO、VO等实体类中把数字设置成Integer、Long等包装类。而我们的架构师纠正了很多次,只让用int、long这些基本数据类型。他说:使用包装类,在比较的时候可能会出错。

这个说法我之前看资料的时候看到过,但是没有详细地去探究,最近查看了源代码,说说这里面的成因。

先说现象

测试1

结果是true。

测试2

结果是false。

当改成

测试3

无论Integer是多少(在合理范围内),结果都是true。

测试3比较好理解,因为直接用基础数据类型int进行比较。但是测试1、2很多人就不明白了。

理论上讲,都是new出来的对象,内存地址不一致,而==在比较对象的时候,比较的就是内存地址。

所以测试1结果是true,这个结果是错的,而测试2的结果是false,这才是正确的。

为什么会出现这种现象呢?

原因就在于Integer内部有一个私有嵌套类IntegerCache,如果没有进行特别设置的话,在初次使用时会初始化一个缓存数组,范围是-128~127(Integer可以设置这个范围值,Long等不可以)。

也就是说当我们在两个Integer对象用==比较的时候,如果值是在-128~127范围内,会从IntegerCache里取值对比,内存地址一样,所以==的结果为true(测试1)。

如果超过这个范围,比对的就是两个对象的内存地址,==结果为false(测试2)

所以使用Integer、Long这些包装类进行对比的时候,应该用equals(),如果用==,也要使用intValue()。

=============================================================================

据此再说开一点。

将字符串转为数字,有两种方法:

int i = Integer.parseInt("1");

int j = Integer.valueOf("2");

效果一致,但使用前者比较好,因为是直接将字符串转为int。

而后者是通过前者将字符串转为int,再封装成Integer,再拆成int,赋值给j,多了无谓的封箱拆箱动作。

本文内容由快快网络小思创作整理编辑!