Java 整数类型的包装类比较 用==还是equals
前一段时间,在项目中 比较两个Long 类型的时候 使用==的时候,有时候正确 有时候却不正确。很是疑惑。如图
这个结果是正确的。但是把比较的值增大 比如把20 更改成128
返回的却是false, 为什么会这样呢。很是费解 ,决定深究一下。
== 是比较两个 变量的值是否是一样的。那么为什么Long 在有的情况下是相等,有的情况下是不等的呢,查看一下字节码,看看这段代码到底是如何执行的。
原来我们在执行n1==n2的时候,Long 包装类型会通过Long.valueOf()方法 把n1和n2,转换之后再进行比较的,那么在看看这个Long.valueOf()方法的源码
这样一目了然了吧,Long.valueOf() 方法会把 -127 到128 之间的数字缓存起来,比较-127 到128之间的数字 Long 会去从缓存中拿取最后的值和传入的值进行比较。这个比较自然是true的,但是 如果大于128的不会放入缓存,这个时候比较的是两个Long 类型的内存地址对象。自然的是返回false.
那么 用equals 会是什么结果呢
显然 若是用 equals 不论 是 变量是20 还是128结果都是 true. 这个是为什么呢,看一下Long 的equals源码
使用Long 的equals方法 比较两个Long 的时候Long 会通过longValue()方法把Long 转换成long 再比较两个值.结果自然是 true.