JavaSE基础:数值比较

简介: JavaSE基础:数值比较

   数值比较

等值判断

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

和 == 的区别

  1. 对于基本类型,两者等价:判断数据是否相等。
  2. 对于对象(如 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 接口都用于比较两个元素的大小:


  1. Comparable 接口位于 java.lang 包内,定义在要比较的实体类内部:包含 compareTo 方法。


  1. Comparator 接口位于 java.util 包内,实现在类的外部:包含 compare 方法和 equals 方法。

Comparator 接口的 equals 方法和 Object 类的 equals 方法不同, Object 类的 equals 方法实现在实体类的内部。


compare To方法

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 表达式简写
相关文章
|
6月前
|
Java
JavaSE——方法(1/2)-介绍、方法的各种形式、使用的要求
JavaSE——方法(1/2)-介绍、方法的各种形式、使用的要求
34 5
|
6月前
|
存储 缓存 算法
【经典算法】LeetCode 1143:最长公共子序列Java/C/Python3实现含注释说明,Medium)
【经典算法】LeetCode 1143:最长公共子序列Java/C/Python3实现含注释说明,Medium)
26 1
|
7月前
|
存储 搜索推荐 Java
JavaSE学习值之--String类(三)
JavaSE学习值之--String类(三)
69 0
JavaSE学习值之--String类(三)
|
7月前
|
Java
JavaSE基础篇:枚举
JavaSE基础篇:枚举
|
7月前
|
存储 Java 编译器
JavaSE学习--数据类型和运算符
JavaSE学习--数据类型和运算符
90 0
|
7月前
|
存储 Java 编译器
JavaSE学习值之--String类(一)
JavaSE学习值之--String类(一)
58 0
|
7月前
|
Java
JavaSE学习值之--String类(二)
JavaSE学习值之--String类(二)
65 0
|
Java
Java每日一练(20230507) 组合总和、缺失的正数、单词搜索II
Java每日一练(20230507) 组合总和、缺失的正数、单词搜索II
81 0
|
算法 Java
JavaSE:第五章:数组
JavaSE:第五章:数组
JavaSE:第五章:数组
|
Java
java学习第九天笔记-字符串180-统计字符个数
java学习第九天笔记-字符串180-统计字符个数
58 0
java学习第九天笔记-字符串180-统计字符个数