《Java》基本类型的比较和引用类型的比较

news2024/11/25 0:53:44

目录

基本类型

引用数据类型

基本类型之间的比较

基于Comparable的比较

总结


👑作者主页:Java冰激凌
📖专栏链接:Java

基本类型

         Java中提供了基本类型有八种 分别是 byte short int long float double char boolean

         基本类型的值可以直接储存在一个变量里,直接在变量上完成一些基本运算,例如相加、逻辑比较、位运算等。下面是一个Java程序的示例代码,展示了如何使用基本类型

public class BasicTypesExample {

    public static void main(String[] args) {
        byte b = 100;       // 声明并初始化一个byte变量
        short s = 200;      // 声明并初始化一个short变量
        int num = b + s;    // 整型变量num表示b和s的和
        System.out.println("b + s = " + num);

        double d = 2.34;    // 声明并初始化一个双精度浮点型变量
        float f = 3.12f;    // 声明并初始化一个单精度浮点型变量
        double result = d * f;  // 计算结果
        System.out.println("d * f = " + result);

        char ch = 'a';      // 声明并初始化一个字符型变量
        boolean flag = true;// 声明并初始化一个布尔型变量
        System.out.println("字符 " + ch + " 是否是小写字母?" + Character.isLowerCase(ch)); // 使用Character类中的isLowerCase()方法判断ch是否是小写字母
        System.out.println("flag 的反码是 " + !flag); // 取反运算符
    }
}

引用数据类型

        引用类型可以是用户自定义类型 也可以是Java各种包中封装的类型 并且 数组 对象 都是引用类型 所有引用类型的默认值都为null

        引用类型与基本类型不同 引用类型变量保存的是对象的地址,因此对于引用类型变量的比较,需要使用equals()方法或者“==”运算符。


基本类型之间的比较

        在基本类型之间我们可以使用使用“==”来进行比较

public static void main (String[] args) {
        int a = 10;
        int b = 10;
        double c = 10.0;
        double d = 10.0;
        System.out.println("a == b :" + (a == b));
        System.out.println("c == d :" + (c == d));
    }

但是在引用类型中 如果我们想比较两个引用类型的值是否相等 我们就需要借助到equals来比较

public static void main (String[] args) {
        String s1 = new String("hello");
        String s2 = new String("hello");
        System.out.println(s1.equals(s2));
   
    }

并且如果我们使用等号的话 我们输出结果会是false 因为我们在介绍引用类型就已经提到了 我们的引用类型存储的是地址  两个不同的引用去比较是否相等比较的是他们的地址是否相同 当然是不一样的啦 但是还是会存在特殊情况的 我们来看如下的代码

public static void main (String[] args) {
        String s1 = "hello";
        String s2 = "hello";
        System.out.println(s1 == s2);
    }

到了此时 我们的s1 跟 s2比较此处会输出true 这是为何 保存的不是地址嘛  怎么会变的 一样 此时我们可以回顾一下当初讨论的String的不可变性 其中提到了常量池的概念 我们可以借助我们的常量池来解释这个问题 因为我们的“hello”字符串在创建的 时候 会在字符串常量池中也创建出一个hello 在我们对于他引用的时候  我们就会在常量池中查找这个字符串是否存在 如果这个字符串已经存在的话 我们的引用类型的变量就可以直接指向这个常量池中的元素 上述的代码就是因为同时指向了常量池中的hello 所以会出现输出结果为true的结果

那么我们又要提出新的问题 如果我们将s2换成创建一个新的对象呢?

    public static void main (String[] args) {
        String s1 = "hello";
        String s2 = new String("hello");
        System.out.println(s1 == s2);
    }

此时我们的输出变为了false  这是为啥嘞 这还是回到我们线程池的解释 我们的s2的确创建了一个新的对象 并且这个对象指向的hello也是常量池中对象 我们可是要记得 如果对于引用类型进行比较 我们比较的是地址哦  虽然s2指向的对象是指向hello的 但是其中还间隔有一共对象哦  那么我们如何验证其中的值是否相等呢  我们还是要用到我们的equals

public static void main (String[] args) {
        String s1 = "hello";
        String s2 = new String("hello");
        System.out.println(s1 == s2);
        System.out.println(s1.equals(s2));
    }

如果对于字符串常量池不明确 此处是我们的 String的不可变的博客 其中有这明确的解释

与大佬展开讨论String的不可变性icon-default.png?t=N3I4https://guobinglin.blog.csdn.net/article/details/128355409?spm=1001.2014.3001.5502对了 我们的自定义类型是不能使用我们的equals方法的 所以说我们要在我们的自定义类中重写我们的equals方法哦


基于Comparable的比较

        除了使用equals()方法和“==”运算符比较引用类型变量,Java还提供了一个基于接口的比较方式,即使用Comparable接口。该接口定义了一个比较方法compareTo(),用于比较两个对象之间的大小关系。实现Comparable接口需要重写compareTo()方法。该方法需要返回一个整数值,表示当前对象与参数对象的大小关系。如果当前对象比参数对象小,则返回负整数;如果当前对象与参数对象相等,则返回0;如果当前对象比参数对象大,则返回正整数。

        我们来以下的代码演示一下 我们的每个类代表一个学生  如果我们想要对于两个学生类之间做比较 要做一个排序的话 我们就需要借助到我们的Comparable接口实现compareTo方法    

class Student implements Comparable<Student>{
    int id;
    int age;
    String name;

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

    @Override
    public int compareTo (Student o) {
        return this.age - o.age;
    }
}
public class Demo5 {
    public static void main (String[] args) {
        Student zhangSan = new Student(1,14,"zhangsan");
        Student liSi = new Student(2,8,"lisi");
        System.out.println(zhangSan.compareTo(liSi));
    }
}

    以上是解决掉了我们的引用类型之间比较其中值的问题 但是也带来了另一个大问题 就是说 我们如果直接在Student类中实现我们的Comparable接口的话  一旦重写compareTo方法 那么我们对于这个类比较的时候就只能使用我们定死的比较规则 这显然是不符合我们代码的“高内聚 低耦合”的 所以说 为了解决这个问题 我们衍生出一个比较器

class Student implements Comparable<Student>{
    int id;
    int age;
    String name;

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

    @Override
    public int compareTo (Student o) {
        return this.age - o.age;
    }
}
class StudentComparable implements Comparator<Student> {
    @Override
    public int compare (Student o1 , Student o2) {
        return o1.age - o2.age;
    }
}
public class Demo5 {
    public static void main (String[] args) {
        Student zhangSan = new Student(1,14,"zhangsan");
        Student liSi = new Student(2,8,"lisi");
        StudentComparable studentComparable = new StudentComparable();
        System.out.println(studentComparable.compare(zhangSan,liSi));
        //System.out.println(zhangSan.compareTo(liSi));
    }
}

此处我们使用了一个类实现了我们的Comparator接口 并且重写了我们的compare方法 这样做的好处是什么呢 这个比较器就可以基于我们要按照从小到大 或者从大到小排序来说 实现我们的比较器 在使用Collection.sort()中就可以传入我们的这个比较器 也可以在其他地方使用我们类之间的比较 实现我们多种比较形式 


总结

Object,equals  :因为Object类是所有类的父类 所以都可以直接调用equals来进行比较其中的值 不过只能比较是否相等 也就是说 返回来类型是boolean类型 

Comparable.compareTo: 需要在类中实现该接口并且重写该方法 但是这么做的话对于代码的侵入性太强 在原则上不满足我们代码的“高内聚 低耦合”

Comparator.compare:需要实现一个比较器对象 使用起来非常灵活对于代码的侵入性很弱

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

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

相关文章

EL 表达式--各种运算-代码演示--EL 的 11 个隐含对象--pageContext 对象介绍--JSTL 标签库介绍--core 核心库--综合代码

目录 EL 表达式 EL 表达式介绍 代码示例 EL 常用输出形式 代码演示 Book.java el_input.jsp EL 运算操作 基本语法语法&#xff1a; 关系运算 逻辑运算 算数运算 EL 的 empty 运算 应用实例 empty.jsp EL 的三元运算 应用实例 EL 的 11 个隐含对象&#xff0c…

Unity-ML-Agents-训练生成的results文件解读-PushBlock

前言 训练结果文件路径&#xff1a;E:\ml-agents-release_19\results\push_block_test_02&#xff08;具体路径以自己电脑为准&#xff09; ML-Agents安装和PushBlock训练过程请见&#xff1a;&#xff08;注意&#xff1a;push_block_test_02没有全部训练完毕&#xff09; …

同样是测试,朋友到了30k,我才12K,这份测试面试8股文确实牛

程序猿在世人眼里已经成为高薪、为人忠诚的代名词。 然而&#xff0c;小编要说的是&#xff0c;不是所有的程序员工资都是一样的。 世人所不知的是同为程序猿&#xff0c;薪资的差别还是很大的。 众所周知&#xff0c;目前互联网行业是众多行业中薪资待遇最好的&#xff0c;…

推荐几款项目管理工具,提高你的团队协作效率

如何管理团队才能使团队发挥最大的价值&#xff0c;如果团队缺少协作&#xff0c;就会因为团队的内耗和冲突导致项目无法完成&#xff0c;如何提高团队协作效率呢&#xff1f;我们可以借助团队协作类的项目管理工具。 几个常见的项目管理工具&#xff1a; 1、进度猫 进度猫是…

MySQL高级第十五篇:MVCC多版本并发控制原理剖析

MySQL高级第十五篇&#xff1a;MVCC多版本并发控制原理剖析 一、什么是MVCC&#xff1f;二、快照读与当前读&#xff1f;1. 快照读2. 当前读 三、MVCC实现原理&#xff08;ReadView&#xff09;1. 隐藏字段2. Read View3. 思路设计4. ReadView使用规则5. MVCC整体操作流程 四、…

响应式开发HTML5CSS3实现视频播放器的功能案例

目录 前言 一、本视频播放器需要实现的功能 ​二、代码分布结构 三、部分主要代码 1.index01.html 2.video1.css 3.video1.js 四、images图片资源及视频 五、运行效果 前言 1.本文讲解的响应式开发技术&#xff08;HTML5CSS3Bootstrap&#xff09;的HTML5视频播放器等…

随想录Day59--单调栈: 503.下一个更大元素II , 42. 接雨水

看到下一个更大&#xff0c;最先想到的就是单调栈。所以503.下一个更大元素II可以用单调栈的思路进行求解&#xff0c;其实这道题和496.下一个更大元素 I的思路是一样的&#xff0c;不过是多了一个首位相连的环状条件&#xff0c;这时候可以想到&#xff0c;把数组再复制遍历&a…

推荐系统|多目标建模|多目标优化|跨域多目标算法演进

目录 多目标建模总结 推荐系统——多目标优化 网易严选跨域多目标算法演进 背景介绍 多目标建模及优化 1.样本与特征 2. 模型结构迭代 3. 位置偏差与 Debias 4. 多目标 Loss 优化 5. 跨域多目标建模 多目标建模总结 http://t.csdn.cn/H514i 常见的指标有点击率CTR、…

电、气物联网联合管理监测方案

一、概述 水、电、气联合管理就是把同一个用户的用电计量和用水计量、用气计量统一到一个账户&#xff08;同时具有子账户&#xff09;&#xff0c;用一套软件进行统一管理&#xff0c;当账户余额不足时&#xff0c;可实行停电催费&#xff0c;从而既达到预付费的目的&#xff…

hue源码编译,替换cloudera manage hue,解决hue滚动条bug问题

一.安装依赖 yum install python python-dev python-setuptools python-pip \ libkrb5-dev libxml2-dev libxslt-dev libssl-dev \ libsasl2-dev libsqlite3-dev libldap2-dev \ libffi-dev nodejs npm cmake make gcc g++ 二.拉取源码 wget https://github.com/cloudera/hue/a…

机器学习笔记之K近邻学习算法

机器学习笔记之K近邻学习算法 引言回顾&#xff1a;投票法回顾&#xff1a;明可夫斯基距离 K \mathcal K K近邻算法算法描述 K \mathcal K K值的选择小插曲&#xff1a;懒惰学习与急切学习 KD \text{KD} KD树描述及示例 K \mathcal K K近邻 VS \text{ VS } VS 贝叶斯最优分类器…

汽车基础软件信息安全与AUTOSAR

AUTOSAR 信息安全框架和关键技术分析 随着汽车网联化和智能化,汽车不再孤立,越来越多地融入到互联网中。在这同时,汽车也慢慢成为潜在的网络攻击目标,汽车的网络安全已成为汽车安全的基础,受到越来越多的关注和重视。AUTOSAR 作为目前全球范围普遍认可的汽车嵌入式软件架…

HDFS FileSystem 导致的内存泄露

目录 一、问题描述 二、问题定位和源码分析 一、问题描述 ftp程序读取windows本地文件写入HDFS&#xff0c;5天左右程序 重启一次&#xff0c;怀疑是为OOM挂掉&#xff0c;马上想着就分析 GC日志了。 ### 打印gc日志 /usr/java/jdk1.8.0_162/bin/java \-Xmx1024m -Xms512m …

Net2FTP搭建免费web文件管理器『打造个人网盘』

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 前言 文件传输可以说是互联网最主要的应用之一&#xff0c;特别是智能设备的大面积使用&#xff0c;无论是个人存储文件资料&#xff0c;还是商业文件流转&#xff0c…

老杨说运维 | 数智时代,运维一体化如何落地实践?

在IT运维的发展过程中&#xff0c;随着分布式架构的加速推进&#xff0c;云原生技术加入应用&#xff0c;运维工具相比过去呈现出了更高强度的进化态势&#xff0c;即从多个相对独立的软件向EA形态的一体化系统进化。本次樱花论坛正是基于这一新的变革点&#xff0c;邀请了行业…

(十二)rk3568 NPU 中部署自己训练的模型,(2)模型转换

对于rknn 模型部署,本人使用*.pt -> *.onnx -> *.rknn的方式。 一、首先是pt文件到onnx文件的转换。 onnx文件导出时,需要修改models/yolo.py文件中的后处理部分。 注意:在训练时不要修改yolo.py的这段代码,训练完成后使用export.py进行模型导出转换时一定要进行修…

RHCE第六次作业

目录 一、编写脚本for1.sh,使用for循环创建20账户&#xff0c;账户名前缀由用户从键盘输入&#xff0c;账户初始密码由用户输入&#xff0c;例如: test1、test2、test3、.....、 test10 1.创建脚本for1.sh 2.执行脚本并查看是否创建成功 二、编写脚本for2.sh,使用for循环,通过…

微积分:微分

目录 1.代数推导 2.几何推导 3.总结 1.代数推导 假设我们有一个正方形初始边长为X&#xff0c;这时面积S1x 然后正方形的边长增加△x&#xff0c;此时面积S2&#xff08;x△x&#xff09; 变化的面积大小是△s&#xff08;x△x&#xff09;- x2x△x&#xff08;△x&#x…

软件测试外包干了4年,感觉废了..

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

c++算法——枚举法

枚举概念 枚举法是通过计算机速度快的特点&#xff0c;对问题所有可能性进行枚举&#xff0c;从中找到答案&#xff0c;需要利用循环。 例题 1&#xff0c;简单数字谜 题目描述 在□内填上一个合适的相同的数字&#xff0c;使等式“□365283□8256”成立。 输入格式 无 输出…