慎用 java 中的比较符号 "==";

java中的”==”符号其实是一个很容易出错的地方,我觉得java里面object的比较最好都用.equal()比较安全,比如下面的实验:

public static void main(String[] args) {

	Integer a = 32;
        Integer b = 32;
        if(a == b)
        	System.out.println("Integer: a == b");
        else
        	System.out.println("Integer: a != b");
        Integer c = 778;
        Integer d = 778;
        if(c == d)
        	System.out.println("Integer: c == d");
        else
        	System.out.println("Integer: c != d");

        if(c.equals(d))
        	System.out.println("Integer: c.equals(d) is true");
        else
        	System.out.println("Integer: c.equals(d) is false");

        int aa = 32;
        int bb = 32;
        if(aa == bb)
        	System.out.println("int: aa == bb");
        else
        	System.out.println("int: aa != bb");
        int cc = 778;
        int dd = 778;
        if(cc == dd)
        	System.out.println("int: cc == dd");
        else
        	System.out.println("int: cc != dd");
	}

        /*
               Results:
               Integer: a == b
               Integer: c != d
               Integer: c.equals(d) is true
               int: aa == bb
               int: cc == dd
        */

其实代码的目的很明确,就是要比较两个整数是否值相同,注意是值相同,但是c和d的比较就很费解了,竟然输出不等,其实我们会觉得奇怪是因为没有真正理解java中的 “==”和”.equal()” 函数的区别。首先 “==”, “.equal()”的区别在于 “==” 比较的的是两个object相等不相等, “.equal()”比较的是两个object的内容是不是相等。c和d两个object内容也就是值是一样的,但是这明显是两个不同的object,所以当然会输出不等,但是a和b为什么又是输出相等呢? 这个就要涉及一个java的缓存机制:java为避免常用的对象频繁被实例化,引入了缓存机制,Integer类型的缓存数据大小范围是-128到127。也就是说-128到127的integer实例对象其实都是java的缓存数据,不是每次都实例化一个新的object, 所以a == b这个是一个凑巧,正好碰到了其实是同一个object(缓存中的Integer). 至于简单类型int, 那么事情就没这么复杂了。可以正常使用==操作符。

建议:Java中的object的比较(内容的比较)都用equal函数。

Written on January 9, 2013