基本类型的比较VS引用类型的比较

news2025/1/22 18:09:02

基本类型的比较VS引用类型的比较

数据类型的介绍

类型的比较,在Java中有两种数据类型,一种是基本数据类型,一中是引用类型。

基本数据类型包含一些我们常用的数据:

类型类型名称
byte字节型
int整型
char字符型
double浮点型
boolean布尔型
…………

而引用类型最常见的有:

类型类型名称
String字符串
Array数组
类、接口、数组、枚举、注解、泛型……

其中还有使用引用类型书写的基本数据类型:

基本数据类型引用类型
byteByte
intInteger
charCharacter
doubleDouble
booleanBoolean
…………

每个基本数据类型都有对应的引用类型,而他们作为基本数据类型比较时和引用类型比较时又存在着一点点差异。

基本数据类型的比较

基本数据类型之间可以直接比较,返回值是boolean型的最常用的就是==比较运算符。

int a = 10;
int b = 20;
System.out.println(a==b);
//false
b = 10;
System.out.println(a==b);
//true

还有>,<,>=,<=!=这几种比较方法

int a = 20;
int b = 10;
System.out.println(a > b);
//true
System.out.println(a >= b);
//true
System.out.println(a != b);
//true

虽然基本数据类型我们已经使用不下上百次了,不过一些基本的引用数据类型也是需要理解和使用的。

引用数据类型的比较

引用类型也可以称之为对象,使用equal来比较对象的大小,在字符串中我们倒是经常使用。

String s1 = "hello";
String s2 = "hello";
//使用 == 来比较
System.out.println(s1 == s2);
//true
//使用 equsl 来比较
System.out.println(s1.equals(s1));
//true

可以惊奇的发现!他们结果居然一样!这个是因为内存中有一个字符串常量池,其中会存储我们一些常用的字符串,就像上面代码中的hello,在代码中如果需要这个字符串时,就相当于将这个字符串的地址引入过来,而使用==对地址进行比较,发现地址是相同的。也就会输出true.

String s1 = "hello";
//在内存中新开辟一块空间来存储 hello 字符串
String s2 = new String("hello");
//使用 == 来比较
System.out.println(s1 == s2);
//false
//使用 equsl 来比较
System.out.println(s1.equals(s1));
//true

新开辟的空间地址肯定和原来的地址不相同,所以这里会输出false

既然引用类型可以称之为对象,那么对于类对象之间的比较又是如何?

对象之间的比较

比如说对于一个猫咪的年龄进行比较是否可以直接使用比较运算符。

static class Cat {
    String desc;//猫的品种
    int age;//猫的年龄

    public Cat(String desc, int age) {
        this.desc = desc;
        this.age = age;
    }
}
public static void main(String[] args) {
    Cat cat1 = new Cat("波斯猫", 3);
    Cat cat2 = new Cat("短尾猫", 4);
    Cat cat3 = cat1;
    System.out.println(cat1 == cat2);//false
    System.out.println(cat1 == cat3);//true
}

比较两个对象的地址是否相等,对于cat1cat2,是不相等的,cat2是新的一个对象自然地址不一样,所以会输出false

cat3是等于cat1,表示这个指向cat1这个对象,所以在比较时自然会相等,所以输出true

不过这个代码并没有按我们的想法去比较两个猫的年龄,可以看出无法使用比较运算符来比较。

使用Equal覆写基类

已知所有数据类型都是继承至Object类,如果需要比较自定义类中的数据,使用equal可以用于比较两个对象是否相等。

static class Cat {
    String desc;//猫的品种
    int age;//猫的年龄

    public Cat(String desc, int age) {
        this.desc = desc;
        this.age = age;
    }
    //重写equals方法
    @Override
    public boolean equals(Object o){
        if(this == o){
            return true;
        }
        if(o == null || !(o instanceof Cat)){
            return false;
        }
        Cat c = (Cat)o;
        return age==c.age && desc == c.desc;
    }

自己与自己比较,然后返回一个对象之间是否相等的值。

使用Comparable接口类来比较

Comparable是JDK中提供的比较接口类,他可以用于比较泛型,也就是所有的数据类型,只需要你指定一个比较对象,这个比较器就会根据你提供的比较方法来比较两个数据。

使用Comparable中compareTo方法

在这里插入图片描述在这里插入图片描述

public class Test {
    static class Cat implements Comparable<Cat>{
        String desc;//猫的品种
        int age;//猫的年龄

        public Cat(String desc, int age) {
            this.desc = desc;
            this.age = age;
        }
        //比较年龄
        @Override
        public int compareTo(Cat o) {
            if(o==null){
                return 1;
            }
            return age - o.age;
        }
    }
    public static void main(String[] args) {
        Cat cat1 = new Cat("波斯猫", 3);
        Cat cat2 = new Cat("短尾猫", 4);
        if(cat1.compareTo(cat2)==0){
            System.out.println("一样大");
        }else if(cat1.compareTo(cat2) > 0){
            System.out.println("波斯猫大");
        }else {
            System.out.println("短尾猫大");
        }
    }
}

使用Comparator中Compare方法

源代码中compare。

在这里插入图片描述

static class ComparatorCat implements Comparator<Cat> {

     //比较年龄
    @Override
    public int compare(Cat o1, Cat o2) {
        return o1.age - o2.age;
    }
}
public static void main(String[] args) {
    Cat cat1 = new Cat("波斯猫", 3);
    Cat cat2 = new Cat("短尾猫", 4);
    ComparatorCat comparatorCat = new ComparatorCat();
    int compare = comparatorCat.compare(cat1, cat2);
    if(compare>0){
        System.out.println("波斯猫大");
    }else if(compare < 0){
        System.out.println("短尾猫大");
    }else {
        System.out.println("一样大");
    }
}

实现一个类实现这个比较器,创建对象来实现比较需要比较的数据。

引用类型之间三种比较方法之间的不同:

方法使用方法
Object.equals继承至Object,使用可以直接进行重写操作,只能比较相等,返回值Boolean
Comparable.compareTo需要手动实现接口,每次使用都会排序,存在内部顺序
Comparator.compare实现一个比较器,对类的侵入性弱,代码侵入性强

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

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

相关文章

计算机视觉的深度学习 Lecture15:Object Detection 笔记 EECS 498.007/008

一些介绍&#xff1a; amodal box &#xff08;非模态box&#xff1f;&#xff09; 标记隐含的物体大小 只检测一个目标的流程 同时计算分类分数和Box坐标、使用Multitask Loss。Multitask Loss现在是一种非常常见的方法。 滑动窗口检测多个目标 开销巨大&#xff08;右下…

springboot+vue银行OA系统(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的银行OA系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风歌&…

声音合成——Foley Sound——DECASE项目——多模态智能感知与应用——Autoencoder代码实现(6)

文章目录 概述encoder的编写过程代码编写运行结果问题总结 decoder的编写过程知识补充关于逆卷积 代码编写运行结果总结 Autoencoder模型编写 compile方法 train方法 保存和加载模型模块编写实现代码——autoencoder代码实现代码——train代码实现代码——保存和加载模型的代…

【半监督学习】Match系列.3

半监督语义分割旨在利用尽可能少的有标注图像以及大量的无标注图像来学得一个较好的分割模型。其中&#xff0c;对有标注图像的学习一般类似于全监督语义分割&#xff0c;如计算预测结果与人工标注之间的交叉熵损失&#xff0c;问题的关键在于如何利用无标注图像。 本文简单介…

【Unity】读写ProjectSettings、UserSettings、Library文件夹中的文件

【Unity】读写ProjectSettings、UserSettings、Library文件夹中的文件 AssetDatabase 类提供的 LoadAssetAtPath 方法和 CreateAsset 方法只能读写Assets、Packages文件夹中的资产&#xff0c;如果想要读写其他文件夹&#xff08;ProjectSettings、UserSettings、Library等&am…

【运筹优化】元启发式算法详解:模拟退火算法(Simulated Annealing,SA)+ 案例讲解代码实战

文章目录 一、介绍二、基础知识2.1 局部搜索(或蒙特卡罗)算法2.2 Metropolis 算法2.3 模拟退火算法 三、原理3.1 Statistical Equilibrium 统计平衡3.2 Asymptotic Convergence 渐近收敛 四、实际问题4.1 Finite-Time Approximation 有限时间近似4.2 Geometric Cooling 几何冷却…

区块元素和超连结

DIV (区块元素) <div>元素&#xff08;HTML 文件区块元素&#xff09;是无标签语意的容器元素&#xff0c;虽然它不代表任何意义&#xff0c;却是使用最多的标签之一&#xff0c;主要用来把相似或者被划分为同一区块的内容包在同个div 内&#xff0c;以便后续添加css 样…

【MyBatis】一文教你学会使用MyBatis操作数据库

文章目录 1. MyBatis是什么&#xff1f;2. 为什么要学MaBatis&#xff1f;3. MyBatis环境搭建4. MyBatis的使用4.1 简单示例4.2 获取动态参数4.2.1 ${xxx}获取动态参数4.2.2 #{xxx}获取动态参数4.2.3 #{xxx}与${xxx}获取字符串类型数据4.2.4 sql注入问题4.2.5 模糊查询like4.2.…

动态规划-背包问题-背包九讲

title: 动态规划-背包问题 date: 2023-05-12 13:01:31 categories: Algorithm动态规划 tags:动态规划 01背包问题 题目 题目链接&#xff1a;https://www.acwing.com/problem/content/description/2/ 有 N N N 件物品和一个容量是 V V V 的背包。每件物品只能使用一次。 …

数据分析05——往Pandas中导入数据

1、导入Excel&#xff1a; 注意这种方法可以导入xlsx和xls两种类型的数据读入的数据会以DataFrame的格式显示举例&#xff1a;df pd.read_excel(‘./data/demo_03.xlsx’)还可以导入excel文件中具体的某一个表格&#xff1a;pd.read_excel(‘./data/demo_03.xlsx’, sheet_na…

SD-MTSP:麻雀搜索算法SSA求解单仓库多旅行商问题(提供MATLAB代码,可以修改旅行商个数及起点)

一、单仓库多旅行商问题 多旅行商问题&#xff08;Multiple Traveling Salesman Problem, MTSP&#xff09;是著名的旅行商问题&#xff08;Traveling Salesman Problem, TSP&#xff09;的延伸&#xff0c;多旅行商问题定义为&#xff1a;给定一个&#x1d45b;座城市的城市集…

postgresql源码学习(55)—— 列中的NULL值是如何存储和判断的?

问题来自 《PostgreSQL面试题集锦》学习与回答_Hehuyi_In的博客-CSDN博客 第11题 一、 NULL值存储位置 在pg元组头数据中&#xff0c;有一个t_bits数组&#xff0c;用于存储空值位图。当元组中没有null值的时候&#xff0c;t_bits可以被认为是空的&#xff0c;当元组有null值的…

javaweb学习 html+css基础1

1、学习路线 2、web网站的开发模式 课程安排 web 前端 前端学习内容 html和css的帮助网站 HTML 系列教程 (w3school.com.cn) html快速入门 使用VSCode开发工具&#xff0c;输入 &#xff01;enter&#xff0c;即可出现骨架。 ctrl/ 可以将文字转换为注释 右击一个页面…

【JavaEE】计网之IP协议+以太网+DNS

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 网络层重点协议——IP协议&#xff0c;在复杂的网络环境中确定一个合适的路径~ 本篇文章我们来讲解什么是 IP协议及以太网&#xff0c;在IP协议中&#xff0c;有 地址管理 和 路由选择 两个…

C++中基类和派生类的构造函数与析构函数的调用顺序分析

基类为B&#xff0c;派生类为C&#xff0c;直接上代码以及运行结果。 目录 思路分析 代码一 运行结果一 代码二&#xff1a;B(i)改为b(i) 运行结果二 代码三&#xff1a;加上B(i) 运行结果三 代码四&#xff1a;删掉C类定义的B对象b&#xff0c;删除b(i) 运行结果四 思路…

Linux使用全应用

一、CentOS安装Docker Docker CE 支持 64 位版本 CentOS 7&#xff0c;并且要求内核版本不低于 3.10&#xff0c; CentOS 7 满足最低内核的要求&#xff0c;所以我们在CentOS 7安装Docker。 基础命令 搜索镜像&#xff1a;docker search mysql 下载镜像&#xff1a;docker p…

[架构之路-197]-《软考-系统分析师》- 关键技术 - 问题分析阶段重要的四个任务

目录 前言&#xff1a; 一、信息系统/软件产品的问题分析概述 二、信息系统/软件产品的问题/痛点分析四步骤 步骤1、问题领域分析&#xff1a;研究遇到问题的业务领域&#xff08;诉求&#xff09; 步骤2、 领域问题和机会分析&#xff1a;分析业务领域的问题、痛点、难点…

计算机网络学习 一 (计算机网络体系结构)

计算机网络 基本概念 计算机网络是一个将分散的,具有独立功能的计算机系统. 简单来说,计算机网络就是一些互连的,自治的计算机系统的集合 分类 广义上:是一个资源共享的系统. 资源共享上: 1.目的–资源共享 2.组成单元–分布在不同地理位置的多台独立的"自治计算机"…

第十四届蓝桥杯青少组模拟赛Python真题 (2022年11月8日)

第十四届蓝桥杯青少组模拟赛Python真题 (2022年11月8日) 编程题 第 1 题 问答题 二进制位数 十进制整数2在十进制中是1位数&#xff0c;在二进制中对应10&#xff0c;是2位数。 十进制整数22在十进制中是2位数&#xff0c;在二进制中对应10110&#xff0c;是5位数。 请问十…

Linux高级---k8s之service服务

文章目录 一、service基本概念二、service类型三、service的使用1、实验环境准备2、ClusterIP类型的Service3、HeadLiness类型的Service4、NodePort类型的Service5、LoadBalancer类型的Service6、ExternalName类型的Service 一、service基本概念 在kubernetes中&#xff0c;pod…