从long和Long来看Java中几个诡异但合理的问题
问题:比方有时候进行JSON数据网络传输,client我们用long来表达。但服务端我们用了Long,有时候我们希望Long为null(比方有些自增ID不能设置ID值),但总是有值。搞了半天莫名其妙。
有时候不注意就会遇到这样的问题,两个Long用==进行比較。然后自己也莫名其妙了一下。
解决:对于Long用equals取代==。
原因:==比較的内存地址。
能够看到这是比較Long的value常量。所以...
代码:https://github.com/ACC-GIT/ACCTestJava/blob/master/src/com/acc/test/java/LongTest.java
解决:将client的long改为Long。
原因:原来是我们client并没有设置ID,可是因为使用了long,这样默认值就是0。服务端解析的时候就成了0。
分析:long类型假设是局部变量则编译器要求初始化。而其它情况默认值是0。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
问题:直接看以下的代码:
Long a1 = 1l; Long b1 = 1l; System.out.println(a1 == b1); Long a2 = new Long(1); Long b2 = 1l; System.out.println(a2 == b2);
有时候不注意就会遇到这样的问题,两个Long用==进行比較。然后自己也莫名其妙了一下。
解决:对于Long用equals取代==。
原因:==比較的内存地址。
分析:如上面代码。1l的内存地址存在于JVM的常量池中,a1和b1都指向这个地址,所以a1==b1为true。
a2是通过new得到的一个在堆内存中的地址,肯定和常量池中的1l内存地址不等。所以a2==b2 为false。
题外:equals是Object的方法。默认是比較内存地址,但假设覆盖了就不一样,以下来看Long的覆盖:
public boolean equals(Object obj) { if (obj instanceof Long) { return value == ((Long)obj).longValue(); } return false; }
能够看到这是比較Long的value常量。所以...
代码:https://github.com/ACC-GIT/ACCTestJava/blob/master/src/com/acc/test/java/LongTest.java