java中的==和equals的区别

关于JAVA中的==equals函数的区别

今天在研读Thinking in java 时注意到==和equals的区别,于是就通过查看JDK_API才读懂了他们的区别,于是将心得分享一下,望批评指正,谢谢。

在JAVA程序中一般的基本类型(值类型int,double,boolean等)都只能通过 = = 来判断值是否相等。

如:System.out.println(1==1);System.out.println(true==true);

不能写成System.out.println(1.equals(1))

System.out.println(true.equals(true));×

但是对于引用类型,==和equals就产生了比较大的区别:

1、无论是自定义的类型还是像JAVA本身封装好的类Integer、String等,在对他们的引用判等时,= = 都是判断他们的地址是否一致,即两个引用是否指向同一个对象。若是则true,否则FALSE

如下例:Integer n1 =new Integer(100);Integer n2=new Integer(100);

System.out.println(n1==n2);

运行结果为FALSE

因为引用n1和n2分别指向不同的Integer对象,虽然两个引用所指向的对象的值相等,但是他们的地址是不一样的,即引用就不会一样。

而如果改为System.out.println(n1.equals(n2));则返回true,这是因为n1和n2分别为Integer类型的引用,在Integer中对equals()方法重新写了,覆盖了Object类中的equals()方法,Integer中的equals()方法的作用是判断两个引用指向对象的值是否相等,故而返回true,像String,Boolean,Double等类都重写了equals方法,故可以用equals方法判断两个对象的值是否相等。

2,、如果是自己写的类,若没有重写equals方法,则调用equals方法时将会直接调用Object中的equals方法,而Object中的equals方法的作用是判断两个引用指向的是否是同一对象,故和上例产生了偌大的区别,读者看的时候一定会惊奇的。不过知道是重写了equals方法后就简单多了。看下面例子就是如此

Class Test

{

Int i;

}

Public class EqualsTest{

 Public static void main(String[] args)

  {

 Test t1=new Test();

Test t2=new  Test();

 t1.i=t2.i =100;

System.out.println(t1==t2);//结果为FALSE

System.out.println(t1.equals(t2));//结果为FALSE

 

  }

}

因为这个实例中执行的是Object中的equals方法。

3、说明:在Integer类型的引用判等时我们将鼠标移动到equals方法上面,可以看到其执行的方法:

boolean java.lang.Integer.equals(Object obj)

Compares this object to the specified object. The result is true if and only if the argument is not null and is an Integer object that contains the same int value as this object.

比较此对象与指定对象。当且仅当参数不为 null,并且是一个与该对象包含相同 int 值的 Integer 对象时,结果为 true。

Overrides:equals(...)in Object

Parameters:

objthe object to compare with.

Returns:

trueif the objects are the same; false otherwise

在执行判断Test对象引用的时候鼠标放在equals方法上面后提示为:

boolean java.lang.Object.equals(Object obj)

指示其他某个对象是否与此对象“相等”。 

equals 方法在非空对象引用上实现相等关系:

  • 自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
  • 对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
  • 传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
  • 一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
  • 对于任何非空引用值 x,x.equals(null) 都应返回 false。

Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

4、在执行System.out.println(“12”.equals(“12”));时是执行String类的equals方法,结果为true

posted @ 2014-07-10 01:09  幽林孤狼  阅读(1203)  评论(0编辑  收藏  举报