在Java中要进行两个对象的比较时,会用到关系运算符。通常关系运算符生成的是一个boolean值结果。它们评价的是运算对象值之间的关系。一般关系运算符包括小于(<)、大于(>)、小于等于(<=)、大于等于(>=)、等于(==)以及不等于(!=)。等于和不等于适用于所有内建的数据类型,但其他比较不适用于boolean类型。
关系运算符==和!=适用于所有对象,但是会有一些有趣的现象,下面是测试代码
1 public class Equivalence { 2 public static void main(String args[]){ 3 4 Integer n1 = new Integer(47); 5 6 Integer n2 = new Integer(47); 7 8 System.out.println(n1 == n2); 9 10 System.out.println(n1 != n2); 11 } 12 }
可以猜测一下测试结果,是不是先是true,再是false。
运行结果 false true
很愉快测试结果刚好反过来了,这是因为两个Integer对象的内容尽管是相同的,但是n1和n2是两个不同的对象,这里比较的是两个不同的Integer对象而非比较两个对象的内容,输出结果过当然就是先false后true了。
那么如何比较两个对象的实际内容是否相同呢?这时候就必须使用所有对象都适用的特殊方法equals()。但是equals()方法不适用于“主类型”,也就是基本数据类型,那些数据类型直接使用==和!=进行比较即可。下面再来看一个测试代码
public class Equivalence { public static void main(String args[]){ Integer n1 = new Integer(47); Integer n2 = new Integer(47); System.out.println(n1.equals(n2)); } }
这个程序的结果是符合我们的预期的,结果是true,但事情还没完。假设我们创建了自己的类,例如
public class Value { int i; }
public class Equivalence { public static void main(String args[]){ Value v1 = new Value(); Value v2 = new Value(); v1.i = v2.i = 100; System.out.println(v1.equals(v2)); } }
这时候的结果又会变回false。出现这问题的原因是因为equals()的默认行为是比较两个指向对象的引用,所以除非在自己的类中改变了equals(),否则不会出现我们希望的行为。注意到equals()这种行为方式能够避免一些本该不用出现的问题。