java中equals和==的思考

 首先是==操作符。
    针对对象而言,是两个对象引用指向的对象的内部地址是否一致,如果一致,就是true,否则就是false,假设,有一个类A,用A定义了一个对象:A a = new A();A a1=a;其中的a和a1就是对象引用,a引用指向的地址是A对象的内部地址,此时a赋值给a1,a1也指向了新对象A的内部地址,所以两个对象引用,是相等的。如果是这种情况:A a = n   ew A();A b = new A();实质是创建了两个A对象,开辟了两块内存,具有两个地址(假设d1,d2),a引用指向d1,b引用指向d2,所以a==b的执行结果是false。
针对基本数据类型而言,比较的就是变量代表的值是否相等,假设 int i = 1,j=1;此时i==j的执行结果是true,针对基本数据类型没有引用的概念,假设int i=1;int j=i;   此时只是将i的值copy一份给j,所以j的值改变了,并不会影响i的值。
再解:实质上==,比较的是变量(包括引用变量)中所存储的值是否一致,一致为true,否则为false;对于基本数据类型好理解,因为基本数据类型的赋值操作是copy一份     值赋给另一个变量;针对对象而言,如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
其次是equals方法。
    equals方法主要还是从代码来理解,首先来看Object类,这是所有对象的根类,以下是Object类中的equals方法的源码:
    public boolean equals(Object obj)
    {
        return this == obj;
    }
    从中可以看见Object类中equals方法的本质是==,所以要比较对象的内容的时候,经常需要重写equals方法(如果不想重写equals方法的话,可以引用apache的jar包-commons-lang-2.4.jar,该包的中的EqualsBulider类可供使用,例如:EqualsBuilder.reflectionEquals(a1, a2))。再者根据hashCode的常规协定,就必须再重写hashCode方法。
    对String类而言,由于String中针对了equals方法已经进行了重写,所以默认比较的就是String的内容,还有一些基本数据类型的包装类Integer等类,也是对equals方法重     写了,默认比较的就是其中的值。但针对这几种类型,要注意equals和==的区别,假设如下代码:
    Integer i = new Integer(1);Integer j = new Integer(1);
    i==j的执行结果是false,i.equals(j)的执行结果是true;
    改变下以上代码:Integer i = 1;Integer j = 1;
    i==j的执行结果是true,i.equals(j)的执行结果是true;
    为什么呢?(如果是String类型也是一样的)
    情况一:通过new创建了2个对象,这时==操作符,肯定结果就是false,而equals比较的是内容,都是1,就为true;
    情况二:1是一个常量,在整个缓冲区中只有一份,所以,i和j实际指向的都是同一个1,所以==操作的结果就是true。

猜你喜欢

转载自blog.csdn.net/jiandanfeng2/article/details/7326927