关于比较的一点笔记

时间:2022-08-25 02:15:10

  在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()这种行为方式能够避免一些本该不用出现的问题。