首页 > 编程语言 >论JAVA 两种“对象比较接口“的区别

论JAVA 两种“对象比较接口“的区别

时间:2024-09-26 20:53:09浏览次数:8  
标签:JAVA name 区别 int age 接口 Person new public

前言

总所周知,java对象的比较有 三种方式 

最简单的是可以调用equals().

因为这个方法定义在Object类中,而我们的类都继承了Object类.所以我们自己定义的类都可以使用这个方法.

除此以外还有两个比较接口,可以通过实现他们的某些方法比较我们的对象

他们是 ComparableComparator!

Comparable 接口

  • 方法: int compareTo(T o)
  • 用途: 定义对象的自然排序。
  • 实现: 当一个类实现 Comparable 接口时,它必须重写 compareTo() 方法。这个方法用于比较当前对象与指定对象的顺序。

光这么说可能有点抽象,我们直接看代码

class Person implements Comparable<Person> {
    public String name;
    public int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public int getAge() {
        return age;
    }    @Override
    public int compareTo(Person other) {
        return Integer.compare(this.age, other.age); // 按年龄升序排序
    }
    @Override
    public String toString() {
        return name + " (" + age + ")";
    }
}
 // 使用示例
        List<Person> people = new ArrayList<>();
        people.add(new Person("Alice", 30));
        people.add(new Person("Bob", 25));
        people.add(new Person("Charlie", 35));
        Collections.sort(people);
        System.out.println(people); // 输出: [Bob (25), Alice (30), Charlie (35)]

 通过这个代码我们可以看到, 我首先创建了一个Person类,接入了 Comparable 接口

又重写了compareTo 这个方法

这里有一个问题我想提一嘴,为什么用的是包装类Integer 去比较,而不是int

答:

  • Integer 是一个对象: Integer 类提供了比较的方法,比如 compareTo() 和静态方法 Integer.compare(), 这些方法可以直接用于比较两个 Integer 对象。

  • int 是基本类型: 基本数据类型没有方法,因此不能直接调用比较函数。虽然你可以使用运算符(如 ><)来比较 int 值,但在需要使用排序或集合等高级操作时,必须依赖于对象的方法。

我们可以看看Integer的 代码

public final class Integer extends Number implements Comparable<Integer>

   我们可以得出结论:

Integer 类实现了 Comparable 接口,允许你比较两个 Integer 对象。这使得 Integer 可以使用 compareTo() 方法进行自然排序。

而我们的int就没有这个待遇了

它的特点

侵入性很强,直接写在类里面了,每次使用都会是这个比较原则

Comparator比较器

如果去使用 这个接口,我们需要一个比较器对象,实现这个接口

class NameComparator implements Comparator<Person>
{
    @Override
    public int compare(Person o1, Person o2) {
        return  o1.name.compareTo(o2.name);
    }
}

 还是刚刚的类,刚刚的例子

  List<Person> people2 = new ArrayList<>();
        people2.add(new Person("Alice", 30));
        people2.add(new Person("Charlie", 35));
        people2.add(new Person("Bob", 25));
        Collections.sort( people2, new NameComparator());
        System.out.println( people2); // 输出: [Alice (30), Bob (25), Charlie (35)]

它的特点 

非侵入性,即不会影响类本身的排序原则。

 关于Collections

我们这里使用了Collections,这是一个工具类,有sort方法

我们看看它的代码

    public static <T extends Comparable<? super T>> void sort(List<T> list) {
        list.sort(null);
    }

    public static <T> void sort(List<T> list, Comparator<? super T> c) {
        list.sort(c);
    }

 Collections类中的sort()方法可以接收实现了List接口的任何集合,如ArrayListLinkedList,并支持使用Comparable接口或Comparator比较器对其元素进行排序。这使得我们能够灵活地对不同类型的列表进行排序,便于管理和操作数据。

 完整代码

import  java.util.*;
class Person implements Comparable<Person> {
    public String name;
    public int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public int getAge() {
        return age;
    }    @Override
    public int compareTo(Person other) {
        return Integer.compare(this.age, other.age); // 按年龄升序排序
    }
    @Override
    public String toString() {
        return name + " (" + age + ")";
    }
}
class NameComparator implements Comparator<Person>
{
    @Override
    public int compare(Person o1, Person o2) {
        return  o1.name.compareTo(o2.name);
    }
}
public class Com
{
    public static void main(String[] args)
    {
        // 使用示例
        List<Person> people = new ArrayList<>();
        people.add(new Person("Alice", 30));
        people.add(new Person("Bob", 25));
        people.add(new Person("Charlie", 35));
        Collections.sort(people);
        System.out.println(people); // 输出: [Bob (25), Alice (30), Charlie (35)]
        List<Person> people2 = new ArrayList<>();
        people2.add(new Person("Alice", 30));
        people2.add(new Person("Charlie", 35));
        people2.add(new Person("Bob", 25));
        Collections.sort( people2, new NameComparator());
        System.out.println( people2); // 输出: [Alice (30), Bob (25), Charlie (35)]
    }
}

结尾

本文算是笔者的第二篇备忘录吧,学习路上对于细节知识笔者总是喜欢刨根问底,为了不浪费幸苦得出的知识,笔者写下这篇博客供大家伙也参考参考

标签:JAVA,name,区别,int,age,接口,Person,new,public
From: https://blog.csdn.net/cjejwe/article/details/142577329

相关文章

  • 如何打造Java SpringBoot民宿山庄农家乐系统?2025最新毕业设计攻略
    ✍✍计算机毕业编程指导师**⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流!⚡⚡Java、Python、小程序、大数据实战项目集⚡⚡文末获取......
  • 如何打造流浪天使乐园管理系统?Java SpringBoot+Vue技术解析
    ✍✍计算机毕业编程指导师**⭐⭐个人介绍:自己非常喜欢研究技术问题!专业做Java、Python、小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。⛽⛽实战项目:有源码或者技术上的问题欢迎在评论区一起讨论交流!⚡⚡Java、Python、小程序、大数据实战项目集⚡⚡文末获取......
  • 7-2 jmu-Java-04面向对象进阶-01-接口-Comparable
    编写实现Comparable接口的PersonSortable类,使其按name以及age排序1.编写PersonSortable类属性:privatename(String)、privateage(int)有参构造函数:参数为name,agetoString函数:返回格式为:name-age实现Comparable接口:实现先对name升序排序,如果name相同则对age进行升序排序......
  • java练习生第二练
    不可变集合不可变集合(ImmutableCollections)在编程中指的是一旦创建,其内容(如元素、大小等)就不能被修改的集合类型。这类集合对于线程安全非常有用,因为它们自然避免了多线程环境下因并发修改而产生的竞争条件和错误。同时,它们也有助于设计不可变对象,这对于确保数据一致性和简......
  • Java毕业设计-基于SSM框架的供电所档案管理系统项目实战(附源码+论文)
    大家好!我是岛上程序猿,感谢您阅读本文,欢迎一键三连哦。......
  • Java毕业设计-基于SSM框架的宠物领养系统项目实战(附源码+论文)
    大家好!我是岛上程序猿,感谢您阅读本文,欢迎一键三连哦。......
  • 掌握 JavaScript 的数学对象:内置数学函数和属性的综合指南
    javascript数学对象:概述javascriptmath对象是一个内置对象,提供数学函数和常量的集合。它不是构造函数,因此您无法创建它的实例;相反,它是通过其静态方法和属性直接使用的。1.常数math对象包含几个对数学计算有用的常量:math.e:自然对数的底数,约等于2.718。math.ln2:2的自然对......
  • 掌握 JavaScript 运算符:从基础知识到按位
    在本博客中,我们将深入探讨javascript运算符的世界,涵盖从基本算术到按位运算的所有内容。我们将探讨“一元”、“二元”和“操作数”等术语,并提供实际示例来帮助您理解每个概念。让我们开始吧!基本运算符一元、二元和操作数一元运算符?作用于单个操作数(例如,x)。二元运算符?作......
  • 掌握 JavaScript:初学者的基本技巧
    JavaScript是一种多功能且功能强大的编程语言,构成了现代Web开发的支柱。如果您是JavaScript新手,这里有一些基本技巧可帮助您掌握其概念并开始构建交互式Web应用程序:1.了解基础知识:变量和数据类型:了解变量、它们的类型(数字、字符串、布尔值、对象、数组等)以及如何操......
  • 掌握 Lerna:管理 JavaScript Monorepos 的指南
    目录简介第一章:lerna是什么?为什么选择monorepos?第2章:安装和设置lerna先决条件分步安装指南设置您的第一个lerna项目第3章:lerna中的依赖关系管理独立依赖提升共享依赖项引导包第4章:跨包运行脚本全局执行脚本针对特定包第5章:使用lerna进行版本控制和发布固定模式与......