今天在项目中遇到一个问题,将两个Long类型的对象用==比较,结果一样的值返回false。后来才反应过来,感觉这是个容易忽略的问题,所以总结一下。
像Long,Integer等都是基本类型的包装类,他们既是一个对象,但又有些特殊。
首先==比较两个对象比较的是他们本身的值,也就是指向的内存地址。所以一般情况下包装类不要用==比较大小。
但是呢前面也说了,包装类和一般对象有点不同。
例如两个Integer类型的对象比较大小:
这里可以看到,当值的范围在-128~127的时候Integer可以直接用==比较大小,但是超出这个范围时,==就不管用了。原因是什么呢?我百度了一下之后找到下面这个方法:
首先看注释,这里大概意思是有个缓存机制,值范围在-128~127的会使用这个缓存。而代码中是建立了一个数组,将-128~127放入这个数组中。
这是Integer的valueOf方法,可以看到,如果值在-128~127范围内,会直接从数组中取值返回,如果不是则返回Integer本身。
由于返回的是同一个数组的同一个位置,自然值是一样,可以用==比较。而返回对象的话,就无法用==比较了。
看完Integer之后紧接着看了下其他几个整型包装类的相关源码:
Short,Byte的就不截图了,详细的可以看下源码。
所以这里比较大小还是直接用包装类重写的equals方法比较或用**Value方法取基本类型的值然后用==比较。
其实可以看到Integer源码中重写的equals也是用intValue方法取的基本类型值。
相关文章: