【JavaSE】java对象的比较

news2024/11/5 16:40:35

文章目录

  • 元素的比较
    • 基本类型的比较
    • 对象的比较
  • 如何进行对象比较
    • 重写`equals`方法
    • 基于`Comparble.compareTo`的比较
    • 基于`Comparator.compare`的比较
    • 区分`Comparator`和`Comparable`
  • 在`PriorityQueue`中比较的体现

元素的比较

基本类型的比较

Java中,基本类型可以直接进行大小的比较

        //1.基本元素的比较
        int a=10;
        int b=20;
        System.out.println(a>b);
        System.out.println(a<b);
        System.out.println(a==b);
        System.out.println("=============================");
        char ch1='A';
        char ch2='a';
        System.out.println(ch1==ch2);
        System.out.println(ch1>ch2);
        System.out.println(ch1<ch2);
        System.out.println("==========================");
        boolean b1=true;
        boolean b2=false;
        System.out.println(b1==b2);
        System.out.println(b1!=b2);

运行结果:
在这里插入图片描述

对象的比较

		//2.对象的比较
        Student s1=new Student();
        Student s2=new Student();
        Student s3=s2;
        System.out.println(s1==s2);
        //System.out.println(s1<s2);//编译报错
        System.out.println(s3==s2);

运行结果:
在这里插入图片描述

结论:Java的引用类型不能直接进行>或者<的比较.那么为什么可以进行==的比较呢?
因为:对于用户实现自定义类型,都默认继承自Object类,而Object类中提供了equals方法,而==默认情况下调用的就是equals方法.
equal的比较原则是:默认情况下,直接比较
引用变量的地址**

如何进行对象比较

重写equals方法

这里在Student类中重写equals方法

class Student{
    String name;//姓名
    Integer age;//年龄

    public Student(String name,Integer age){
          this.name=name;
          this.age=age;
    }
	//重写equals方法
    @Override
    public boolean equals(Object o) {
        
        if(o==null || !(o instanceof Student)) return false;

            Student obj=(Student)o;

            return this.name.equals(obj.name)?true:false;
    }

}
		//2.对象的比较
        Student s1=new Student("zhangsan",11);
        Student s2=new Student("zhangsan",12);

        Student s3=s2;
        System.out.println(s1==s2);
        System.out.println(s1.equals(s2));
        //System.out.println(s1<s2); ------编译报错
        System.out.println(s3==s2);

重写equals方法虽然可以进行比较,但是只能进行相等比较,不能按照大于,小于的方式进行比较

基于Comparble.compareTo的比较

在类的内部重写compareTo方法:

class Student implements Comparable<Student>{
    String name;//姓名
    Integer age;//年龄

    public Student(String name,Integer age){
          this.name=name;
          this.age=age;
    }
    
    @Override
    public int compareTo(Student o) {
        if(o==null) return 1;
        return age-o.age;
    }
}

进行比较:

public class CompareTest {
    public static void main(String[] args) {
    	Student s1=new Student("zhangsan",11);
        Student s2=new Student("lisi",16);
        Student s3=new Student("zhangsan",12);
		
		System.out.println(s1.compareTo(s2));
        System.out.println(s2.compareTo(s1));
        System.out.println(s3.compareTo(s2));
}
}

运行结果:
在这里插入图片描述

基于Comparator.compare的比较

在类的外部构造一个比较器Comparator:

/**
 * 在外部构造一个比较器
 * */
class StudentComparator implements Comparator<Student>{
    @Override
    public int compare(Student s1, Student s2) {
            return s1.age-s2.age;
    }
}
class Student implements Comparable<Student>{
    String name;//姓名
    Integer age;//年龄

    public Student(String name,Integer age){
          this.name=name;
          this.age=age;
    }
    
}    

调用比较器进行比较

		Student s1=new Student("zhangsan",11);
        Student s2=new Student("lisi",16);
        Student s3=new Student("zhangsan",12);
        //调用比较器
        StudentComparator stuComparator=new StudentComparator();
        System.out.println(stuComparator.compare(s1, s2));

运行结果:
在这里插入图片描述

区分ComparatorComparable

ComparatorComparable都是Java用于比较的对象,但它们的作用场景和使用方式有所不同:

  • Comparable接口:

    • 它是一个内置接口,通常由类自身实现,用于提供自定义类型的自然顺序。如果一个类实现了Comparable接口,那么它的实例就可以直接通过compareTo()方法与其他同类实例进行比较。比如,String类就是实现了Comparable<String>,可以直接比较两个字符串的大小。
    • 所以,Compareable接口需要手动实现,且代码的侵入性比较强,一旦实现,每次用该类都有顺序,属于内部顺序
  • Comparator接口:

    • 它是另一个独立于对象本身的接口,它允许你在运行时动态地改变比较规则。当需要对列表或其他集合进行排序,但不想修改类本身或者不知道对象内部如何排序时,可以使用Comparator
    • 需要实现一个比较器对象,对待比较类的侵入性弱.

PriorityQueue中比较的体现

由于PriorityQueue底层使用的堆结构,因此其内部的元素必须要能够比大小,PriorityQueue采用了两种比较方式的实现:

  • Comparable:是类默认的内部比较方式,如果用户插入自定义类型的对象时,该类对象必须要实现Comparable接口,并且重写了CompareTo方法
  • Comparator:用户也可以选择使用比较器对象,如果用户插入自定义类型对象时,必须要提供一个比较器类,让该类实现Comparator接口并且重写了compare方法

接下来我们通过源码来进行理解:
当我们进行插入操作时:

public boolean offer(E e) {
        if (e == null)
            throw new NullPointerException();
        modCount++;
        int i = size;
        if (i >= queue.length)
            grow(i + 1);
        siftUp(i, e);//向上调整
        size = i + 1;
        return true;
    }

这里我们看到,调用了关键方法siftUp向上调整方法.

private void siftUp(int k, E x) {
        if (comparator != null)
            siftUpUsingComparator(k, x, queue, comparator);
        else
            siftUpComparable(k, x, queue);
    }

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2231474.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多SpringBoot项目同进程下统一启动

1.背景 使用SpringBoot技术栈进行REST HTTP接口开发服务时&#xff0c;一般来说如果模块较多或者涉及多人协作开发&#xff0c;大家会不自觉的将每个模块独立成一个单独的项目进行开发&#xff0c;部署时则将每个服务进行单独部署和运行。服务间的调用则通过FeignClients&…

lvgl

lvgl 目录 lvgl Lvgl移植到STM32 -- 1、下载LVGL源码 -- 2、将必要文件复制到工程目录 -- 3、修改配置文件 将lvgl与底层屏幕结合到一块 -- lvgl也需要有定时器,专门给自己做了一个函数,告诉lvgl经过了多长时间(ms(毫秒)级别) 编写代码 lvgl的中文教程手册网站…

使用WebAssembly优化Web应用性能

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用WebAssembly优化Web应用性能 引言 WebAssembly 简介 安装工具 创建 WebAssembly 项目 编写 WebAssembly 代码 编译 WebAssem…

【docker】docker 环境配置及安装

本文介绍基于 官方存储库 docker 的环境配置、安装、代理配置、卸载等相关内容。 官方安装文档说明&#xff1a;https://docs.docker.com/engine/install/ubuntu/ 主机环境 宿主机环境 Ubuntu 20.04.6 LTS 安装步骤 添加相关依赖 sudo apt-get update sudo apt-get install…

【Linux】网络编程:初识协议,序列化与反序列化——基于json串实现,网络通信计算器中简单协议的实现、手写序列化与反序列化

目录 一、什么是协议&#xff1f; 二、为什么需要有协议呢&#xff1f; 三、协议的应用 四、序列化与反序列化的引入 什么是序列化和反序列化&#xff1f; 为什么需要序列化和反序列化&#xff1f; 五、序列化推荐格式之一&#xff1a;JSON介绍 六、网络版计算器编程逻…

基于MATLAB的加噪语音信号的滤波

一&#xff0e;滤波器的简述 在MATLAB环境下IIR数字滤波器和FIR数字滤波器的设计方 法即实现方法&#xff0c;并进行图形用户界面设计&#xff0c;以显示所介绍迷你滤波器的设计特性。 在无线脉冲响应&#xff08;IIR&#xff09;数字滤波器设计中&#xff0c;先进行模拟滤波器…

Java项目实战II基于Spring Boot的智能家居系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 随着物联网技术的快速发展和普及&#…

基于Spring Boot+Vue的助农销售平台(协同过滤算法、限流算法、支付宝沙盒支付、实时聊天、图形化分析)

&#x1f388;系统亮点&#xff1a;协同过滤算法、节流算法、支付宝沙盒支付、图形化分析、实时聊天&#xff1b; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk1…

【C++笔记】容器适配器及deque和仿函数

【C笔记】容器适配器及deque和仿函数 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C笔记 文章目录 【C笔记】容器适配器及deque和仿函数前言一.容器适配器1.1什么是容器适配器1.2 STL标准库中stack和queue的底层结构 二.stack2.1stack类模…

软考:中间件

中间件 中间件是一类位于操作系统软件与用户应用软件之间的计算机软件&#xff0c;它包括一组服务&#xff0c;以便于运行在一台或多台机器上的多个软件通过网络进行交互。 中间件的主要功能包括通信支持和应用支持。 通信支持为应用软件提供平台化的运行环境&#xff0c;屏蔽…

统信UOS设备驱动开发-常见问题

包含linux设备驱动开发的基础知识及统信UOS设备驱动的总体架构,常用的设备驱动开发调试优化手段及在环境搭建和代码编写过程中常见问题处理等。 文章目录 环境搭建如何编译驱动代码编写如何实现同源异构环境搭建 如何编译内核 下载并解压内核源码包,进入源码根目录,内核的编…

JS 异步 Promise、Async、await详解

目录 一、JS里的同步异步 二、Promise 1、状态 2、all()、race()、any() 3、简单案例 4、异步执行案例 5、解决异步嵌套繁琐的场景 三、async和await 1、async返回类型 2、async与await结合使用的简单案例 3、解决异步嵌套问题 4、批量请求优化 一、JS里的同步异步…

【Vue3】Vue3相比Vue2有哪些新特性?全面解析与应用指南

&#x1f9d1;‍&#x1f4bc; 一名茫茫大海中沉浮的小小程序员&#x1f36c; &#x1f449; 你的一键四连 (关注 点赞收藏评论)是我更新的最大动力❤️&#xff01; &#x1f4d1; 目录 &#x1f53d; 前言1️⃣ 响应式系统的改进2️⃣ Composition API的引入3️⃣ 更好的Type…

Vue 事件阻止 e.preventDefault();click.prevent

Vue 事件阻止 Vue 事件阻止 e.preventDefault(); click.prevent修饰符

基于vue3和elementPlus的el-tree组件,实现树结构穿梭框,支持数据回显和懒加载

一、功能 功能描述 数据双向穿梭&#xff1a;支持从左侧向右侧转移数据&#xff0c;以及从右侧向左侧转移数据。懒加载支持&#xff1a;支持懒加载数据&#xff0c;适用于大数据量的情况。多种展示形式&#xff1a;右侧列表支持以树形结构或列表形式展示。全选与反选&#xf…

leetcode-21-合并两个有序链表

题解&#xff1a; 1、初始化哑节点dum 2、 3、 代码&#xff1a; 参考&#xff1a;leetcode-88-合并两个有序数组

WPF怎么通过RestSharp向后端发请求

1.下载RestSharpNuGet包 2.请求类和响应类 public class ApiRequest {/// <summary>/// 请求地址/// </summary>public string Route { get; set; }/// <summary>/// 请求方式/// </summary>public Method Method { get; set; }/// <summary>//…

指派问题的求解

实验类型&#xff1a;◆验证性实验 ◇综合性实验 ◇设计性实验 实验目的&#xff1a;学会使用Matlab求解指派问题。 实验内容&#xff1a;利用Matlab编程实现枚举法求解指派问题。 实验例题&#xff1a;有5人分别对应完成5项工作&#xff0c;其各自的耗费如下表所示&#…

vue3 gsap 基于侦听器的动画

1、gsap实现动画 https://gsap.com/ .以上来自baidu ai 2、代码&#xff1a; 安装gsap&#xff1a;pnpm install gsap <script setup> import { ref, reactive, watch } from vue import gsap from gsapconst number ref(0) const tweened reactive({number: 0 })wat…

Flutter CustomScrollView 效果-顶栏透明与标签栏吸顶

CustomScrollView 效果 1. 关键组件 CustomScrollView, SliverOverlapAbsorber, SliverPersistentHeader 2. 关键内容 TLDR SliverOverlapAbsorber 包住 pinned为 true 的组件 可以被CustomScrollView 忽略高度。 以下的全部内容的都为了阐述上面这句话。初阶 Flutter 开发知…