equals和comparable和comparator的区分

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Objects;

// 实现 Comparable 接口,指定自然排序规则(按年龄升序)
class Student implements Comparable<Student> {
    private String id;
    private int age;
    private double score;

    public Student(String id, int age, double score) {
        this.id = id;
        this.age = age;
        this.score = score;
    }

    // 重写 equals:学号相同则判定为同一个学生
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return Objects.equals(id, student.id);
    }

    // 重写 hashCode:与 equals 保持一致,基于学号计算
    @Override
    public int hashCode() {
        return Objects.hash(id);
    }

    // 重写 compareTo:自然排序规则(按年龄升序)
    @Override
    public int compareTo(Student o) {
        return this.age - o.age;
    }

    // 重写 toString:方便打印输出
    @Override
    public String toString() {
        return "Student{id='" + id + "', age=" + age + ", score=" + score + "}";
    }

    // getter 方法(供 Comparator 调用)
    public double getScore() {
        return score;
    }
}

public class CompareDemo {
    public static void main(String[] args) {
        ArrayList<Student> studentList = new ArrayList<>();
        studentList.add(new Student("001", 20, 92.5));
        studentList.add(new Student("002", 19, 85.0));
        studentList.add(new Student("001", 21, 90.0)); // 与第一个学号相同
        studentList.add(new Student("003", 22, 88.5));

        // 1. 测试 equals 方法
        Student s1 = studentList.get(0);
        Student s2 = studentList.get(2);
        System.out.println("s1 和 s2 是否相等:" + s1.equals(s2)); // true

        // 2. 测试 Comparable 自然排序(按年龄升序)
        Collections.sort(studentList);
        System.out.println("\n按年龄自然排序结果:");
        studentList.forEach(System.out::println);

        // 3. 测试 Comparator 自定义排序(按成绩降序)
        Collections.sort(studentList, new Comparator<Student>() {
            @Override
            public int compare(Student s1, Student s2) {
                // 注意:double 不能直接相减,用 Double.compare 避免精度问题
                return Double.compare(s2.getScore(), s1.getScore());
            }
        });
        System.out.println("\n按成绩降序自定义排序结果:");
        studentList.forEach(System.out::println);
    }
}

全部评论

相关推荐

头像
2025-12-14 11:33
门头沟学院 Java
这是一篇迟来的秋招反思总结。虽然可能是拿到了开发的大sp,或者说小ssp的开发offer,但是真正签下三方的那一刻却并没有什么情绪波动,只觉得“这事结束了,我该继续定下下一个阶段的目标了”。回顾一下自己的秋招历程。我的秋招真正的起点可能起源于去年的年中。那时的我可以说对于求职所需的技巧都完全不懂。没有人带,没有带我求职的“导师”,我所做的只能是问几个学长,然后在各种平台找大佬咨询。最后还是选择了资料最多的Java后端开发,从此我的学习便开始了。刷力扣、刷视频、写项目,日复一日,加了知识星球还去打卡,回看当时打卡记录持续了180+天,直到找到了日常实习才结束。不能说是007,但是平均下来也有了995的强度。在年底找到了第一份日常实习,于是踏上了说走就走的旅程。实习的时候每周都要请半天假从公司坐高铁回到学校,开完会再回去,从中午12点到晚上12点全都在路上,这份辛苦只有自己心里清楚。接着开始找暑期实习,先是被腾讯搞了一通,面微信面穿后录用评估挂,接着又是美团全部答上来后超时自动挂,最后在一个普通的下午突然收到了阿里的实习offer。那一刻所有的努力和辛苦都具象化。暑期实习的过程中,运气好进到了一个强度相对比较低的组,于是在7、8月份每天晚上下班后回去继续刷题、复习各技术栈,还要抽时间面试。到了9月初已经面了40+场,进了面的只挂过一次岗位不匹配的腾讯的存储类岗位。9月陆续收到了多个offer,我以为自己也许会算比较优秀?开始谈薪后发现自己其实只是普通的一员,加了各大信息共享群,发现总是有比我更强的人,也有算法的大佬比我断档的领先。至于我为什么没选算法,在之前的文章里有讲到;而开发的大佬则从本科就开始有了相关的沉淀,我自然无法比肩。于是我想到了“比你优秀的人比你还努力”,我有什么可骄傲的。于是开始继续学习,继续成长,这不是抖M式的强迫自己受苦,也不单纯是为了以后的竞争力,还是为了自己的充实感和心理满足。签下三方的时候没有什么情绪波动,只是普通的点了下按钮,然后转头又去继续改bug了。我想我老了也会继续保持学习,让我不被时代抛弃。
NBA球星伦纳德:这段时间看了佬的故事, 也狠狠的激励了我, 保持持续学习的状态
26届校招投递进展
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务