【用Java学习数据结构系列】对象的比较(Priority Queue实现的前提)

简介: 【用Java学习数据结构系列】对象的比较(Priority Queue实现的前提)

看到这句话的时候证明:此刻你我都在努力

加油陌生人

3.png

前言

上一篇文章已经给大家大致了解了一下Priority Queue,以及它的底层实现---堆 ,但是其实大家可以发现我们上一篇文章的对象是 int 类型,所以我们进行向上调整和向下调整时我可以使用 “<” “ >” “ ==” 进行比较他们的大小进行比较调整,但是如果我们的Priority Queue 里储存的是一个对象呢?那么这时就涉及到对象的比较了。那么对象如何进行比较就往下看看这篇文章吧。

对象比较的三种方式

对象的比较我们现在主要有三种方式:


  1. 重写equals
  2. 实现compa方法rable接口并改写(重写)其compareTo方法
  3. 加入比较器,我们自己定义一个比较器类并实现comparor接口,重写compare方法,比较时创建比较器对象进行调用其compare方法即可。

那么下面我们就一一给大家演示一遍

重写equals

如下代码:


我们根据我们自己的想法,决定我们比较员工(Worker)的标准为工龄(workAge),只要工龄相等我们就直接判定其为相同的,那么我们就可以像下面这样子重写equals方法。我们也可以加上其它比较元素。

public class Worker {
 
    String name;
    int age;
 
    int workAge;
 
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null ) return false;
        Worker worker = (Worker) o;
        return  workAge == worker.workAge;
    }
 
    
    public static void main(String[] args) {
 
        Worker t=new Worker();
        Worker t1=new Worker();
        Worker t2=new Worker();
        t.age=19;
        t.name="aaa";
        t.workAge=3;
 
        t1.age=19;
        t1.name="aaa";
        t1.workAge=2;
 
        t2.age=22;
        t2.name="ccc";
        t2.workAge=3;
 
        System.out.println(t.equals(t1));
        System.out.println(t.equals(t2));
 
    }
 
 
}



实现comparable接口

正如上面所说那么我们首先要我们需要比较的对象实现comparable接口,在重写compareTo方法,那么下面就演示一下:

compareTo方法的返回值是int类型,其中返回值大于0则比较结果为大于,小于0则比较结果为小于,等于0则说明比较的两个对象相等。

public class Worker implements Comparable {
 
 
    String name;
    int age;
 
    int workAge;
 
    @Override
    public int compareTo(Object o) {
        if (this == o) return 0;
        if (o == null ) return -1;
        Worker worker = (Worker) o;
        return  workAge - worker.workAge;
    }
 
 
 
 
    public static void main(String[] args) {
 
        Worker t=new Worker();
        Worker t1=new Worker();
        Worker t2=new Worker();
        t.age=19;
        t.name="aaa";
        t.workAge=3;
 
        t1.age=19;
        t1.name="aaa";
        t1.workAge=2;
 
        t2.age=22;
        t2.name="ccc";
        t2.workAge=3;
 
      if(t.compareTo(t1)>0){
          System.out.println("大于");
      }else if(t.compareTo(t1)<0){
          System.out.println("小于");
      }else {
          System.out.println("相等");
 
      }
 
    }
 
 
 
}


加入比较器

如下代码我们定义了一个比较器的类ComWorker,然后重写了compare方法,然后在需要比较时,实例化一个比较器对象,然后调用其compare方法,即可。

public class Worker  {
 
 
 
 
    String name;
    int age;
 
    int workAge;
 
    public static void main(String[] args) {
 
        ComWorker c=new ComWorker();
 
        Worker t=new Worker();
        Worker t1=new Worker();
        Worker t2=new Worker();
        t.age=19;
        t.name="aaa";
        t.workAge=3;
 
        t1.age=19;
        t1.name="aaa";
        t1.workAge=2;
 
        t2.age=22;
        t2.name="ccc";
        t2.workAge=3;
 
 
        int n= c.compare(t,t1);
 
      if(n>0){
          System.out.println("大于");
      }else if(n<0){
          System.out.println("小于");
      }else {
          System.out.println("相等");
 
      }
 
    }
 
}
 
 class ComWorker implements Comparator {
 
 
     @Override
     public int compare(Object o1, Object o2) {
         if (o1==o2) return 0;
 
         Worker worke1 = (Worker) o1;
         Worker worker2 = (Worker) o2;
         return worke1.workAge-worker2.workAge;
     }
 }


equals 方法:

用途:用于检查两个对象是否相等。

场景:当你需要判断两个对象是否代表相同的数据或状态时,比如检查两个字符串是否包含相同的字符序列。

实现:通常重写Object类的equals方法来定义对象相等的逻辑。

因为所有类都是继承自 Object 的,所以直接覆写即可,不过只能比较相等与否

Comparable 接口:

用途:用于定义对象的自然排序规则。

场景:当你的对象需要按照某种自然顺序(如数字的大小、字符串的字典顺序)进行排序时,比如在集合类如TreeSet或Arrays.sort()中使用。

实现:实现Comparable接口并重写compareTo方法。

需要手动实现接口,侵入性比较强,但一旦实现,每次用该类都有顺序,属于 内部顺序

Comparator 接口:

用途:用于定义对象的自定义排序规则。

场景:当你需要按照非自然顺序(比如根据对象的某个属性)对对象进行排序时,比如在Collections.sort()或Stream API中使用。

实现:实现Comparator接口并定义compare方法。

需要实现一个比较器对象,对待比较类的侵入性弱,但对算法代码实现侵入性

在Priority Queue中的形式

集合框架中的PriorityQueue底层使用堆结构,因此其内部的元素必须要能够比大小,PriorityQueue采用了:

Comparble和Comparator两种方式。


Comparble是默认的内部比较方式,如果用户插入自定义类型对象时,该类对象必须要实现Comparble接

口,并覆写compareTo方法

用户也可以选择使用比较器对象,如果用户插入自定义类型对象时,必须要提供一个比较器类,让该类实现

Comparator接口并覆写compare方法。

目录
相关文章
|
3月前
|
前端开发 Java
java实现队列数据结构代码详解
本文详细解析了Java中队列数据结构的实现,包括队列的基本概念、应用场景及代码实现。队列是一种遵循“先进先出”原则的线性结构,支持在队尾插入和队头删除操作。文章介绍了顺序队列与链式队列,并重点分析了循环队列的实现方式以解决溢出问题。通过具体代码示例(如`enqueue`入队和`dequeue`出队),展示了队列的操作逻辑,帮助读者深入理解其工作机制。
111 1
|
1月前
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
118 3
|
2月前
|
Java
深入JavaSE:详解Java对象的比较。
总的来说,Java对象的比较就像海洋生物的比较,有外在的,有内在的,有面对所有情况的,也有针对特殊情况的。理解并掌握这些比较方式,就能更好地驾驭Java的世界,游刃有余地操作Java对象。
59 12
|
2月前
|
存储 NoSQL 算法
Redis设计与实现——数据结构与对象
Redis 是一个高性能的键值存储系统,其数据结构设计精妙且高效。主要包括以下几种核心数据结构:SDS、链表、字典、跳跃表、整数集合、压缩列表。此外,Redis 对象通过类型和编码方式动态转换,优化内存使用,并支持引用计数、共享对象和淘汰策略(如 LRU/LFU)。这些特性共同确保 Redis 在性能与灵活性之间的平衡。
|
3月前
|
编解码 JavaScript 前端开发
【Java进阶】详解JavaScript的BOM(浏览器对象模型)
总的来说,BOM提供了一种方式来与浏览器进行交互。通过BOM,你可以操作窗口、获取URL、操作历史、访问HTML文档、获取浏览器信息和屏幕信息等。虽然BOM并没有正式的标准,但大多数现代浏览器都实现了相似的功能,因此,你可以放心地在你的JavaScript代码中使用BOM。
114 23
|
4月前
|
算法 数据可视化 开发者
为什么要学习数据结构与算法
今天,我向大家介绍一门非常重要的课程——《数据结构与算法》。这门课不仅是计算机学科的核心,更是每一位开发者从“小白”迈向“高手”的必经之路。
为什么要学习数据结构与算法
|
3月前
|
Java 数据安全/隐私保护
Java 类和对象
本文介绍了Java编程中类和对象的基础知识,作为面向对象编程(OOP)的核心概念。类是对象的蓝图,定义实体类型;对象是具体实例,包含状态和行为。通过示例展示了如何创建表示汽车的类及其实例,并说明了构造函数、字段和方法的作用。同时,文章还探讨了访问修饰符的使用,强调封装的重要性,如通过getter和setter控制字段访问。最后总结了类与对象的关系及其在Java中的应用,并建议进一步学习继承等概念。
|
3月前
|
存储 Java 编译器
Java 中 .length 的使用方法:深入理解 Java 数据结构中的长度获取机制
本文深入解析了 Java 中 `.length` 的使用方法及其在不同数据结构中的应用。对于数组,通过 `.length` 属性获取元素数量;字符串则使用 `.length()` 方法计算字符数;集合类如 `ArrayList` 采用 `.size()` 方法统计元素个数。此外,基本数据类型和包装类不支持长度属性。掌握这些区别,有助于开发者避免常见错误,提升代码质量。
205 1
|
4月前
|
设计模式 缓存 Java
重学Java基础篇—Java对象创建的7种核心方式详解
本文全面解析了Java中对象的创建方式,涵盖基础到高级技术。包括`new关键字`直接实例化、反射机制动态创建、克隆与反序列化复用对象,以及工厂方法和建造者模式等设计模式的应用。同时探讨了Spring IOC容器等框架级创建方式,并对比各类方法的适用场景与优缺点。此外,还深入分析了动态代理、Unsafe类等扩展知识及注意事项。最后总结最佳实践,建议根据业务需求选择合适方式,在灵活性与性能间取得平衡。
205 3
|
3月前
|
存储 缓存 Java
理解Java引用数据类型:它们都是对象引用
本文深入探讨了Java中引用数据类型的本质及其相关特性。引用变量存储的是对象的内存地址而非对象本身,类似房子的地址而非房子本身。文章通过实例解析了引用赋值、比较(`==`与`equals()`的区别)以及包装类缓存机制等核心概念。此外,还介绍了Java引用类型的家族,包括类、接口、数组和枚举。理解这些内容有助于开发者避免常见错误,提升对Java内存模型的掌握,为高效编程奠定基础。
159 0

热门文章

最新文章