目录
1.基本类型的比较
2.引用类型的比较
2.1 两个对象是否相同
2.1.1 重写equals方法(是否相同,返回值true或false)
2.2 两个对象的大小(需要确定根据什么进行比较,如年龄,姓名等等)
2.2.1 内部实现Comparable接口
2.2.2 外部实现对应的比较器(该比较器实现Comparator接口
1.基本类型的比较
比较运算符进行比较,如 > < = >= <= != == 等进行比较。
注:八大基本数据类型:byte,short,int,long,float,double,char,boolean。
2.引用类型的比较
2.1 两个对象是否相同
2.1.1 重写equals方法(是否相同,返回值true或false)
只能判断两个对象是否相等,不能比较它们两个之间的大小。
● 示例代码
class Store {
int code;
String name;
public Store(int code, String name) {
this.code = code;
this.name = name;
}
//重写equals方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Store store = (Store) o;
//如果给出的两个商店的商店编号和商店名称都一样,那么就认为它们是一个商店
return code == store.code && Objects.equals(name, store.name);
}
@Override
public int hashCode() {
return Objects.hash(code, name);
}
}
public class CompareTest {
public static void main(String[] args) {
//相同名称,但不同编号
Store s1 = new Store(1001,"好再来");
Store s2 = new Store(1002,"好再来");
System.out.println(s1.equals(s2));
//相同编号,但不同名称
Store s3 = new Store(1003,"乐尔乐");
Store s4 = new Store(1003,"好再来");
System.out.println(s3.equals(s4));
//相同编号相同名称
Store s5 = new Store(1004,"好再来");
Store s6 = new Store(1004,"好再来");
System.out.println(s5.equals(s6));
}
}
● 运行结果测试
2.2 两个对象的大小(需要确定根据什么进行比较,如年龄,姓名等等)
2.2.1 内部实现Comparable接口
当该对象确定以什么属性进行比较之后就固定了,无法修改,不太灵活。
● 示例代码
//方法二:内部实现Comparable接口(不够灵活,对本身代码入侵性强)
class Store implements Comparable<Store>{
int code;
String name;
public Store(int code, String name) {
this.code = code;
this.name = name;
}
@Override
public int compareTo(Store o) {
return this.code - o.code;//根据编号比较,this > o 返回正整数,this < o 返回负整数,相等返回0
}
}
public class CompareTest {
public static void main(String[] args) {
//根据商店编号进行大小比较
Store s1 = new Store(1001,"好再来");
Store s2 = new Store(1002,"乐尔乐");
Store s3 = new Store(1002,"好再来");
//s2调用了compareTo方法,所以this引用指向它
System.out.println(s2.compareTo(s1)); //s2 > s1 返回正整数
System.out.println(s2.compareTo(s3)); //s2 = s3 返回0
//s1调用了compareTo方法,所以this引用指向它
System.out.println(s1.compareTo(s2)); //s1 < s2 返回负整数
}
}
● 运行结果测试
注:当商店要根据姓名进行大小比较时,那么就必须重新修改其compareTo方法,而原本根据编号进行比较的代码便无法使用,所以这种比较方式是不灵活的,且对本身代码的入侵性比较强,所以就有了第三种比较方式→外部实现一个比较器
2.2.2 外部实现对应的比较器(该比较器实现Comparator接口)
比内部实现Comparable接口要灵活,可以不用修改本身代码。
● 示例代码
//方法三:外部实现对应的比较器
class Store {
int code;
String name;
public Store(int code, String name) {
this.code = code;
this.name = name;
}
}
//编号比较器(根据商店编号进行比较)
class CodeComparator implements Comparator<Store> {
@Override
public int compare(Store o1, Store o2) {
return o1.code - o2.code;
}
}
//姓名比较器(根据商店名称进行比较)
class NameComparator implements Comparator<Store> {
@Override
public int compare(Store o1, Store o2) {
return o1.name.compareTo(o2.name);
}
}
public class CompareTest {
public static void main(String[] args) {
Store s1 = new Store(1009,"乐尔乐");
Store s2 = new Store(1005,"好再来");
//根据商店编号进行大小比较
CodeComparator codeComparator = new CodeComparator();
//根据商店编号比较(s1 > s2 返回正整数)
int codeRet = codeComparator.compare(s1,s2);
System.out.println(codeRet);
//根据商店名称进行大小比较
NameComparator nameComparator = new NameComparator();
//根据商店名称比较(s1 < s2 返回负整数)
int nameRet = nameComparator.compare(s1,s2);
System.out.println(nameRet);
}
}
● 运行结果测试