大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > Java技巧 > java中的==和equals的区别

java中的==和equals的区别

关键词:==equalsjava==和equals函数的区别  阅读(519) 赞(12)

[摘要]本文是对java中的==和equals的区别的讲解,对学习Java编程技术有所帮助,与大家分享。

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

今天在研读Thinkinginjava时注意到==和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

如下例:Integern1=newInteger(100);Integern2=newInteger(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方法后就简单多了。看下面例子就是如此

ClassTest

{

Inti;

}

PublicclassEqualsTest{

Publicstaticvoidmain(String[]args)

{

Testt1=newTest();

Testt2=newTest();

t1.i=t2.i=100;

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

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

}

}

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

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

booleanjava.lang.Integer.equals(Objectobj)

Comparesthisobjecttothespecifiedobject.TheresultistrueifandonlyiftheargumentisnotnullandisanIntegerobjectthatcontainsthesameintvalueasthisobject.

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

Overrides:equals(...)inObject

Parameters:

objtheobjecttocomparewith.

Returns:

trueiftheobjectsarethesame;falseotherwise

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

booleanjava.lang.Object.equals(Objectobj)

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

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



相关评论