Java的数据类型在使用时也容易出现一些不容易被发现的坑。
基本数据类型共有八种:int, double, float, long, byte, short, boolean, char。
而与之对应的对象数据类型为:Integer, Float, Long, Byte, Short, Boolean, Character。
要区分它们也很简单,首字母大写的就是对象数据类型,没有大写的就是基本数据类型。
这次在项目中踩坑与long和Long类型有关,所以这里就用Long来距离吧。
这次项目的在一个地方需要比较ID,而数据量较大,ID较长,所以就草率的选择了Long来存储ID(实际上用String也行,不过因为需求特殊,有些地方需要使用ID进行计算,故采用Long)。而在一个循环内对ID进行比较时,有了跟下边差不多的代码:

Long a,b;
if(a == b){
    return true;
}
else{
    return false;
}

这里要实现的功能也很简单,当a,b相等时返回true,否则返回false。而在测试环境运行代码时,发现代码不能正常完成功能,有些相等的返回true,有些相等的则返回false。当时和一位大佬盯着代码看了半小时,愣是没看出来,最后大佬弱弱地说这个Long的比较看着有点别扭。然后我们就去查了一下,不查不知道,一查发现确实Long的比较有个大坑。
由于Long是对象数据类型,声明了之后是一个对象,其本质是一个引用,直接比较的话比较的是其地址,而不论a,b的值是否相等,其地址肯定是不等的,所以Long是不能直接用‘==’进行比较的。
那为什么有些相等的又回返回true呢,查阅资料发现java在执行过程中,为了优化程序的执行速度,比较小的数会直接存放在寄存器中,而不给其分配内存地址,而这个比较小的定义则是不大于一个寄存器的长度,一般计算机寄存器为8位,所以当Long存的数在-128~127之间时,不会为其分配地址,所以在比较时会直接取寄存器中的值进行比较,故返回true。
综上所述,在对对象数据类型不能直接进行比较或计算,需要对其进行取值操作,如Long.longValue()。切忌将其与基本数据类型混淆。