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