java中对象的比较详解

news2024/9/25 23:20:04

一、问题背景

我们先来看这样一个背景,如果有一个学生类,成员属性有姓名name(String),年龄age(int),分数score(double).

public class Test {
    class student{
        String name;
        int age;
        double score;

        public student(String name, int age, double score) {
            this.name = name;
            this.age = age;
            this.score = score;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        public double getScore() {
            return score;
        }

        public void setScore(double score) {
            this.score = score;
        }
    }
}

那么我们如果想要比较相关学生的年龄该如何比较呢?如果想寻找分数相同的同学我们该如何去寻找呢?这就涉及到java里面对象的比较

二、基本类型的比较

java中 == 、>、<可以用于直接比较基本数据类型数值的大小,实际上 == 这个符号可以用于比较时,主要有三种形式

  • " =="既可以判断基本类型(基本数据类型里面没有String),又可以判断引用类型,当左右两边都是引用类型时,比较的实际上是两个引用的地址,当两边是基本类型的时候,那么实际上比较的是数值。
  • "=="如果判断基本类型,判断的是值是否相等。eg: int i=10;double d=10.0 ;i == d;//正确
  • "=="如果判断引用类型,断的是地址是否相等,即判定是不是同一个对象。

示例

public static void main(String[] args) {
        int a = 10;
        int b = 20;
        double a1 = 10.0;
        System.out.println(a > b);
        System.out.println(a == b);
        System.out.println(a == a1);
        char c1 = 'A';
        char c2 = 'B';
        System.out.println(c1 > c2);
        System.out.println(65 == c1);
        System.out.println(c1 == c2);
        boolean b1 = true;
        boolean b2 = false;
        System.out.println(b1 == b2);
        System.out.println(b1 != b2);
    }

在这里插入图片描述

		student student1 = new student("zhangsan", 1, 10.0);
        student student2 = new student("lisi", 2, 11.0);
        student student3 = new student("wangwu", 3, 10.0);
        student student4 = new student("zhaoliu", 4, 12.0);

        student student5 = student1;
        System.out.println(student1 == student5);//true,student1与student5指向用一个对象,所以引用是同一个
        student student6 = new student("zhangsan", 1, 10.0);
        System.out.println(student1 == student6);//false,student1与student5指向不同对象
        System.out.println(student1>student2);//编译错误
        

Java中引用类型的变量不能直接按照 > 或者 < 方式进行比较。 那为什么= =可以比较?
因为:对于用户实现自定义类型,都默认继承自Object类,而Object类中提供了equal方法,而==默认情况下调用的就是equal方法,但是该方法的比较规则是:没有比较引用变量引用对象的内容,而是直接比较引用变量的地址,但有些情况下该种比较就不符合题意。
下面代码就是java原生object类里的eques

// Object中equal的实现,可以看到:直接比较的是两个引用变量的地址
public boolean equals(Object obj) {
return (this == obj);
}

三、对象的比较

3.1覆写(重写)eques方法

一般覆写 equals 的套路应该有以下步骤

  1. 如果指向同一个对象,返回 true
  2. 如果传入的为 null,返回 false
  3. 如果传入的对象类型不是 Card,返回 false
  4. 按照类的实现目标完成比较,例如这里只要花色和数值一样,就认为是相同的牌
  5. 注意下调用其他引用类型的比较也需要 equals,例如下面代码里的 name 的比较覆写
  6. 基类equal的方式虽然可以比较,但缺陷是:equal只能按照相等进行比较,不能按照大于、小于的方式进行比较。

示例

@Override
        public boolean equals(Object o) {
            if (this == o) return true;//如果两个是同一个对象,那么返回true;
            if (o == null || getClass() != o.getClass()) return false;// o如果是null对象,或者o和引用类型不是同一个类
            //if(o == null || !(o instanceof student)){
            //                return false;
            //            }//也可以这样写
            student student = (student) o;//object类是所有类型的父类,所以要是想取得o里面的成员属性,需要向下转型
            return age == student.age && Double.compare(student.score, score) == 0 && this.name.equals(student.name);
        }

3.2 基于Comparble接口类的比较

Comparble是JDK提供的泛型的比较接口类,源码实现具体如下:

public interface Comparable<E> {
// 返回值:
// < 0: 表示 this 指向的对象小于 o 指向的对象
// == 0: 表示 this 指向的对象等于 o 指向的对象
// > 0: 表示 this 指向的对象大于 o 指向的对象
int compareTo(E o);
}

比如在上面的代码里,在比较score大小时就调用了原生Double类型里面的compare方法(Double实现了Compable接口)
对用用户自定义类型,如果要想按照大小与方式进行比较时:在定义类时,实现Comparble接口即可,然后在类中重写compareTo方法。

示例

public class Test {
    static class student implements Comparable<student>{
        String name;
        int age;
        double score;

        public student(String name, int age, double score) {
            this.name = name;
            this.age = age;
            this.score = score;
        }
         @Override
        public int compareTo(student o) {
            return this.age-o.age;
        } 
  }

3.3 基于比较器比较

用户自定义比较器类,实现Comparator接口

public interface Comparator<T> {
// 返回值:
// < 0: 表示 o1 指向的对象小于 o2 指向的对象
// == 0: 表示 o1 指向的对象等于 o2 指向的对象
// > 0: 表示 o1 指向的对象等于 o2 指向的对象
int compare(T o1, T o2);
}

示例:

import java.util.Comparator;
class Card {
	public int rank; // 数值
	public String suit; // 花色
	public Card(int rank, String suit) {
	this.rank = rank;
	this.suit = suit;
	}
}
class CardComparator implements Comparator<Card> {
// 根据数值比较,不管花色
// 这里我们认为 null 是最小的
@Override
	public int compare(Card o1, Card o2) {
	if (o1 == o2) {
	return 0;
	}
	if (o1 == null) {
	return -1;
	}
	if (o2 == null) {
	return 1;
	}
	return o1.rank - o2.rank;
	}
public static void main(String[] args){
	Card p = new Card(1, "♠");
	Card q = new Card(2, "♠");
	Card o = new Card(1, "♠");
	// 定义比较器对象
	CardComparator cmptor = new CardComparator();
	// 使用比较器对象进行比较
	System.out.println(cmptor.compare(p, o)); // == 0,表示牌相等
	System.out.println(cmptor.compare(p, q)); // < 0,表示 p 比较小
	System.out.println(cmptor.compare(q, p)); // > 0,表示 q 比较大
}

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

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

相关文章

【ubuntu】设置国内镜像源

ubuntu清华镜像源 备份 sudo mv /etc/apt/sources.list /etc/apt/sources.list.bak 新建 sudo touch /etc/apt/sources.list sudo vi /etc/apt/sources.list 添加内容 # 默认注释了源码镜像以提高 apt update 速度&#xff0c;如有需要可自行取消注释 deb https://mirrors.tuna…

想不想知道智能配音怎么弄

配音是一种将人的声音与影像相结合的技术&#xff0c;可以为电影、动画、广告等视频内容提供声音和情感上的支持。当观众看到画面中的角色在说话时&#xff0c;如果有配音&#xff0c;则更容易进入故事情节并深入参与其中。对于一些需要讲述复杂信息的内容&#xff0c;通过配音…

Redis实战案例7-缓存雪崩及其解决思路

1. 缓存雪崩 如果缓存集中在一段时间内失效或者Redis服务宕机&#xff0c;所有的查询都落在数据库上&#xff0c;造成了缓存雪崩。 2. 解决思路 给不同的key的TTL添加随机值 在缓存的时候给过期时间加上一个随机值&#xff0c;这样就会大幅度的减少缓存在同一时间过期。 利用R…

PHP TP5.0框架会员根据经验值升级等级

// 初始化最小差值为一个较大的数 $minDifference 500000; 先看一下会员等级表规则的表结构 普通会员默认注册就是&#xff0c;经验值0 1.先查询出最高等级所需要的经验值 //先查询最高等级所需要的经验值 $b Db::name(wechat_user_vip)->order(id DESC)…

【bug解决】Could not resolve ‘us.archive.ubuntu.com‘

解决步骤&#xff1a; 1、备份 /etc/resolv.conf 文件 sudo cp /etc/resolv.conf /etc/resolv.conf.bak 2、修改/etc/resolv.conf 文件 # 编辑文件 sudo vi /etc/resolv.conf# 修改nameserver变量值 nameserver 8.8.8.8esc -> :wq!3、重启network服务 /etc/init.d/netwo…

【二】构造函数和原型

ES6&#xff08;ECMAScript 6.0&#xff09;之前js没有引入类的概念 在ES6之前&#xff0c;对象不是基于类创建的&#xff0c;而是用一种称为构建函数的特殊函数来定义对象和它们的特征 ES6之前创建对象可以通过以下三种方式创建对象&#xff1a; 对象字面量&#xff1a; v…

前端vue入门(纯代码)17

不管何时何地&#xff0c;永远保持热爱&#xff0c;永远积极向上&#xff01;&#xff01;&#xff01; 【19.尚硅谷GitHub案例】 1.静态GitHub搜索案例的静态文件&#xff1a; index.html <!DOCTYPE html> <html lang"en"> <head><meta cha…

RNN其中的X.reshape

假设RNN中的输入为2528&#xff0c;2是batchsize可以理解为有几句话&#xff0c;5是timestep可以理解为有几个词&#xff0c;28是vocab_size。如下就是两个句子&#xff0c;每个句子由5个单词组成。28则为每个单词的词向量&#xff0c;在此略去。 在输入的时候&#xff0c;首先…

力姆泰克电动推杆

LAP梯形丝杠电动推杆 内含长寿命润滑脂&#xff0c;免维护 向下翻动查看更多 力姆泰克电动推杆 高强度/高耐磨材料选择&#xff0c;高精度的零部件加工&#xff0c;先进的壳体设计理念&#xff0c;造就高承载能力&#xff0c;抗冲击&#xff0c;低噪音&#xff0c;长寿命的优…

机器学习9:使用 TensorFlow 进行特征组合编程实践

在【机器学习6】这篇文章中&#xff0c;笔者已经介绍过环境准备相关事项&#xff0c;本文对此不再赘述。本文将通过编程案例来探索特征组合&#xff08;Feature Crosses&#xff09;对模型训练的影响&#xff0c;加深对上一篇文章&#xff08;机器学习8&#xff09;的理解。 经…

C++ DAY2

1.总结类和结构体的区别 1.结构体是一种值类型&#xff0c;而类是引用类型。值类型用于存储数据的值&#xff0c;引用类型用于存储对实际数据的引用 2.结构体中声明的成员变量无法赋予初值&#xff0c;类可以 3.结构体是值类型&#xff0c;它在栈中分配空间&#xff1b;而类是…

青大数据结构【2018】【算法分析】

关键字&#xff1a; 单链表奇偶数拆分、顺序表交集、二叉排序树 右中左的顺序&#xff0c;找出二叉排序树中值大于等于k的所有结点。

2.位带操作

1.位带操作&#xff1a; 2.位带区与位带别名区地址转换&#xff1a; 外设位带别名区地址&#xff1a;AliasAddr0x42000000(A-0x40000000)*8*4n*4&#xff1b;SRAM位带别名区地址&#xff1a;AliasAddr0x22000000(A-0x20000000)*8*4n*4&#xff1b;IO口操作宏定义&#xff1a;…

【Linux】NoSQL之 Redis配置与优化

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 NoSQL之 Redis配置与优化 关系数据库与非关系型数据库关系型数据库非关系型数据库关系型数据库和非关系型数据库区别数据存储方式不同扩展方式不同对事务性的支持不同 非关系…

多元回归预测 | Matlab麻雀算法(SSA)优化极限学习机ELM回归,SSA-ELM回归预测,多变量输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab麻雀算法(SSA)优化极限学习机ELM回归,SSA-ELM回归预测,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% 清空环境变…

交叉熵损失CrossEntropyLoss

交叉熵损失CrossEntropyLoss 语义分割网络输出tensor的尺寸为【B,C,H,W】,进行多分类&#xff0c;label的尺寸为【B,H,W】。 举例&#xff1a;三分类&#xff1a;output【1, 3&#xff0c;3, 3】&#xff0c;label【1, 3, 3】 验证 import torchoutput torch.tensor([[[[1, 1…

字符集,编码,解码,中文乱码

字符集 ASCII 美国佬用的&#xff0c;1个字节表示那些英文字母啥的就够了 GBK 中国的&#xff0c;两个字节表示2w多汉字也够了 Unicode 万国符&#xff0c;4个字节&#xff0c;用来包含全世界所有的字符。 编码 编码就是将字符集中的数字&#xff0c;如a对应数字97&…

Vue中el与data函数

1、绑定容器&#xff0c;el与$mount的异同 <body><div id"root"><h1>你好&#xff0c;{{name}}</h1></div> </body> <script>const vm new Vue({//el:#root, //第一中写法&#xff0c;new的时候直接写好eldata:{name:…

云 LIS 实验室信息管理系统源码 C#检验系统源码

科技的飞速发展为实验室信息管理带来了新机遇&#xff0c;云计算技术的应用更是为实验室信息管理打开了新的大门。云 LIS 实验室信息管理系统&#xff0c;作为一种新型的信息化管理方案&#xff0c;已经在多个实验室的信息化管理中得到应用&#xff0c;并且具有广阔的应用前景。…

社区团购小程序怎么制作

社区团购小程序开发&#xff0c;有什么功能 商品管理&#xff1a;社区团购小程序提供商品管理功能&#xff0c;可以方便地添加、编辑和删除商品信息。你可以设置商品的价格、库存、规格等&#xff0c;并上传商品的图片和描述&#xff0c;以吸引用户关注。 配送管理&#xff1…