Java对象的比较--==、equals、compareTo、compare的应用

一、= =运算符的使用
"
==
"运算符用来比较两个变量是否相等,也就是说,这个运算符用于比较变量对应内存中所储存的数值是否相同,要比较两个基本类型的数据或两个引用变量是否否相等,只能使用 等等号运算符。
如果一个引用指向的数据是对象(引用类型),使用等等号运算符比较的是两个变量是否指向同一对象,也就是要看这两个对象是否在同一块储存空间,如果是要比这两个对象的内容是否相等,用此符号则无法实现。

 public static void main(String[] args) {
    String s1=new String("abc");
    String s2=new String("abc");
    System.out.println(s1==s2);
    s2=s1;
    System.out.println(s1==s2);
    }
*************************************************************************    
false
true

Process finished with exit code 0`

二、equals方法的使用
equals方法时Object类提供的方法,每一个Java类都继承自Object类,所以每一个,对象都具一个equals方法,Object类中定义的equals方法是直接使用"=="运算符比较两个对象,所以在没有覆写equals方法的情况下。equals与等等号的效果一样,比较的是引用。若想比较对象中的内容,需要覆写equals方法。
因为String类已经覆写过equals方法。
这是Object类中的equals方法

public boolean equals(Object obj) {
        return (this == obj);
    }

这是String类中覆写的equals方法

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

 public static void main(String[] args) {
    String s1=new String("abc");
    String s2=new String("abc");
    System.out.println(s1.equals(s2));
    System.out.println(s1==s2);
    }
  *****************************************************************
   true
   false

Process finished with exit code 0

当我们自定义的类需要判断两个对象中的内容是否相等时,可以通过覆写equals方法来比较。

三、compareTo方法的使用
compareTo方法是一个compareable接口中定义的一个方法,通常是基于自然顺序,比较对象的大小,其返回值是一个int类型值,其语法是 S1.compareTo(S2);若S1,S2相等,返回0;若S1小于S2,则返回值小于0,;若S1大于S2,则返回值大于0;

public interface Comparable {
 // 返回值:
 // < 0: 表示 this 指向的对象小于 o 指向的对象  
 // == 0: 表示 this 指向的对象等于 o 指向的对象
 // > 0: 表示 this 指向的对象等于 o 指向的对象 
 int compareTo(E o); 
   }
public class Card implements Comparable {
    public int rank; // 数值
    public String suit; // 花色
    public Card(int rank, String suit) {
        this.rank = rank; this.suit = suit;
    }
    // 根据数值比较,不管花色 
    // 这里我们认为 null 是最小的
    @Override public int compareTo(Card o) {
        if (o == null) {
            return 1;
        }
        return rank - o.rank;
    }
}

四、compare方法的使用
compare方法是Comparator接口定义的一个方法,基于比较器,比较对象的大小,其用法与compareTo方法类似。

public interface Comparator {
 // 返回值: 
 // < 0: 表示 o1 指向的对象小于 o2 指向的对象
 // == 0: 表示 o1 指向的对象等于 o2 指向的对象
 // > 0: 表示 o1 指向的对象等于 o2 指向的对象
    int compare(T o1, T o2); 
 }
public class Card implements Comparable {
        public int rank; // 数值
        public String suit;//花色
        public Card(int rank, String suit) {
         this.rank = rank;
         this.suit = suit;
        }
************************************************************************************************
public class CardComparator implements Comparator {
        // 根据数值比较,不管花色
        // 这里我们认为 null 是最小的
        @Override
        public int compare(T o1, T o2) {
         if (o1 == o2) {
         return 0;
         }if (o1 == null) {
         return -1;
         }if (o2 == null) {
         return 1;
         }
         return o1.rank - o2.rank;
         }
}

你可能感兴趣的:(Java对象的比较--==、equals、compareTo、compare的应用)