从long和Long来看Java中几个诡异但合理的问题

问题:比方有时候进行JSON数据网络传输,client我们用long来表达。但服务端我们用了Long,有时候我们希望Long为null(比方有些自增ID不能设置ID值),但总是有值。搞了半天莫名其妙。


解决:将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

posted on 2017-05-21 21:31  ljbguanli  阅读(141)  评论(0编辑  收藏  举报