数值比较和排序的常用方法
等值判断
Object 类实现了
equals方法 ,用于比较两个数据元素是否相等。
浮点类型由于精度丢失问题,进行等值判断常出现错误。如果有需求推荐使用 BigDecimal 类。
int a = 20 - 10;
int b = 10;
System.out.println(a.equals(b)); // true
double a = 20.0 - 10.0;
double b = 10.0;
System.out.println(a.equals(b)); // false
Object 类实现了
toString方法 ,用于返回当前对象在堆内存中的地址信息:类的全限名@内存地址。
- 父类toString()方法存在的意义就是为了被子类重写,以便返回对象的内容信息,而不是地址信息!
- 父类equals方法存在的意义就是为了被子类重写,以便子类自己来定制比较规则
Objects是一个工具类,官方在进行字符串比较时,没有用字符串对象的的equals方法,而是选择了Objects的equals方法来比较
- 使用Objects的equals方法在进行对象的比较会更安全。(做了null的非空判断,避免出现空指针异常)
- 对象进行内容比较的时候建议使用Objects提供的equals方法,比较的结果是一样的,但是更安全
System.out.println(Objects.isNull(s1)); // 判断变量是否为null ,为null返回true ,反之返回false
System.out.println(Objects.equals(s1,s2)); // 比较两个对象的,底层会先进行非空判断,从而可以避免空指针异常。再进行equals比较
和 == 的区别
- 对于基本类型,两者等价:判断数据是否相等。
- 对于对象(如 String 类):
- ==:比较两个元素内存地址是否相等,即是否是同一个元素。
- equals 方法:比较两个元素内容是否一致。
System.out.println(s1 == s2); // 判断两个引用指向的内存地址是否相等
System.out.println(s1.equals(s2)); // 判断两个引用指向的内存地址是否相等(s1 为空抛出空指针异常)
System.out.println(Objects.equals(s1,s2)); // 判断两个引用指向的元素是否一致(推荐)
重写 equals 方法
对于用户自定义类,正常使用 equals 方法需要进行重写。重写 equals 方法必须重写 hashcode 方法:以保证相同对象拥有相同的哈希地址。这样才能正常地把该类对象放入 HashSet/HashMap 等集合框架中查找。
Object 类的 hashcode 方法是本地方法(底层用 c/c++ 实现),直接返回对象的内存地址。
public class User{
int ID;
String name;
......
@Override
public boolean equals(Object obj) {
if(this == obj) return true;
if(obj == null) return false;
if(obj instanceof User){
User other = (User) obj;
if(equals(this.ID, other.ID) && equals(this.name, other.name)){
return true;
}
}
return false;
}
@Override
public int hashCode() {
int result = 17;
result = 31 * result + (ID == null ? 0 : ID.hashCode());
result = 31 * result + (name == null ? 0 : name.hashCode());
return result;
}
}
数值比较
Comparator 接口和 Comparable 接口都用于比较两个元素的大小:
- Comparable 接口位于 java.lang 包内,定义在要比较的实体类内部:包含 compareTo 方法。
- Comparator 接口位于 java.util 包内,实现在类的外部:包含 compare 方法和 equals 方法。
Comparator 接口的 equals 方法和 Object 类的 equals 方法不同, Object 类的 equals 方法实现在实体类的内部。
compareTo 方法
Java 自带数据类型均已实现 Comparable 接口并重写 compareTo 方法,默认情况下
- 如果 s1 等于 s2,则返回 0;
- 如果 s1 小于 s2,则返回小于 0 的值;
- 如果 s1 大于 s2,则返回大于 0 的值。
Integer s1 = 100;
Integer s2 = 90;
System.out.println(s1.compareTo(s2));
compare 方法
Arrays/Collections 类定义了 sort 方法对数组或者集合元素进行排列,数值的比较通过调用 Comparator 接口的 compare 方法实现。
执行 sort 方法时如果没有重写 compare 方法,默认调用的 compare 方法将会直接调用数据类型的 compareTo 方法,使数据从小到大排列。如果是自定义数据类型且未实现 compareTo 方法,则必须重写 compare 方法。
Arrays.sort(students); // 对数组排序
Collections.sort(students); // 对集合元素排序
开发者可以通过重写 compare 方法,实现自定义排列顺序。但要注意,如果数组中保存的是基础类型数据则无法自定义排序。
Arrays.sort(students, new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
return s1.getID() - s2.getID();
}
});
Collections.sort(students, (s1, s2) -> s1.getID() - s2.getID()); // 使用 Lamdba 表达式简写
数据排序
Arrays/Collections 类定义了 sort 方法对数组或者集合元素进行排列,数值的比较通过调用 Comparator 接口的 compare 方法实现。

浙公网安备 33010602011771号