经验之谈:==和equals()如何正确使用

news2024/11/25 20:47:40

大家好,我是三叔,很高兴这期又和大家见面了,一个奋斗在互联网的打工人。

在Java编程中,比较两个对象是非常常见的操作。然而,初学者常常对于== 和 equals() 之间的区别不够清晰,容易在使用时出错。本文将深入探讨 == 和 equals() 的区别与正确使用方法,帮助您避免在对象比较中出现常见的错误。

在Java中,"=="和"equals()"都用于比较对象。然而,它们在比较时所依据的原则和逻辑是不同的,需要特别注意它们之间的区别。

== 和 equals() 的区别

对于基本数据类型来说,== 比较的是值;
对于引用数据类型来说,== 比较的是对象的内存地址。

equals() 是Java中的方法,用于比较两个对象的内容是否相等。该方法是Object 类的方法,所有 Java 类都继承自 Object 类,因此默认继承了 equals() 方法。通常,我们需要在自定义类中重写 equals() 方法,以便根据我们自己的逻辑来比较对象的内容是否相等。

== 比较大小常见的坑

缓存内

对于基本数据类型的包装类来说,你需要知道缓存的概念:Byte, Short, Integer, Long 这 4 种包装类默认创建了数值 [-128,127] 的相应类型的缓存数据,Character 创建了数值在 [0,127] 范围的缓存数据,Boolean 直接返回 True or False。

第一种:所以如果在缓存范围内,使用 == 比较的则是缓存的值的大小,如果在缓存外,则比较的是对象的内存地址,示例如下:
Integer a = 10; 和 Integer b = new Integer(10) 来说, == 返回的则是 false。

public static void main(String[] args) {
        Integer a = 10;
        Integer b = new Integer(10);
        System.out.println(a == b); // false
    }

在这里插入图片描述

因为缓存的存在,a 的值直接使用的是缓存中的对象,b的值则开辟的新的内存空间。对于包装类, == 比较的是值的内存地址,所以返回false。

如果用 equals() 比较,则返回true,它们的值的大小相等

public static void main(String[] args) {
        Integer a = 10;
        Integer b = new Integer(10);
        System.out.println(a.equals(b)); // true
    }

在这里插入图片描述

缓存外

第二种:比较的范围不在缓存内,则每次都是开辟新的内存地址,所以 == 返回的都是false

public static void main(String[] args) {
        Integer a = 200;
        Integer b = 200;
        System.out.println(a == b); // false
    }

在这里插入图片描述

equals() 则是比较的对象的值的大小,所以值相等的情况下返回true:

 public static void main(String[] args) {
        Integer a = 200;
        Integer b = 200;
        System.out.println(a.equals(b)); // true
    }

在这里插入图片描述

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

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

相关文章

CBG9326 与HMC9326MS8G对比开发资料

国内使用UWB高精度室内定位的行业应用产品,工作频段大部分都在3.5Ghz-6GHz低频段(Channel 2(特定场景如管隧矿)和Channel 5)范围,因此只能应用于煤矿、监狱等封闭的小众市场。从市场趋势来看,业…

6.5 多维数组

6.5 多维数组 多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组 如图 二维数组 int a[][] new int[2][5]这个数组a可以看成一个两行五列的数组 package com.baidu.www.array;public class ArrayDemo05…

第三人称射击项目总结

一、UML类图 二、功能需求

Qt信号与槽机制的基石-MOC详解

引入 上篇讲到了信号与槽就是实现的观察者模式,那具体如何生成映射表就是moc做的事情。 一、moc简介 1. moc的定义 moc 全称是 Meta-Object Compiler,也就是“元对象编译器”,它主要用于处理C源文件中的非标准C代码。Qt 程序在交由标准编…

使用go与智能合约交互之使用abigen生成合约go文件进行调用

前两篇文章,我们讲解了go如何通过函数选择器、abi调用的方式与智能合约交互,那么有没有一种更加便捷的方式(就好像调用预先定义好的方法一样)与智能合约交互呢?答案是有的,本章我们就来学习一下如何使用abi…

Stable Diffusion - 真人照片的高清修复 (StableSR + GFPGAN) 最佳实践

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/132032216 GFPGAN (Generative Facial Prior GAN) 算法,用于实现真实世界的盲脸恢复的算法,利用预训练的面部 GAN&#xf…

Linux和TSN网络

时间敏感网络是传统以太网的扩展,实现实时能力和确定性通信。终端通常是基于Linux OS 的,它的实时能力是通过PREEMPT-RT 补丁实现的。而设备的实时性网络是通过时间敏感性网络技术实现。到目前为止,大多数Linux OS 的TSN 都是通过特殊的解决方…

《cuda c编程权威指南》04 - 使用块和线程索引映射矩阵索引

目录 1. 解决的问题 2. 分析 3. 方法 4. 代码示例 1. 解决的问题 利用块和线程索引,从全局内存中访问指定的数据。 2. 分析 通常情况下,矩阵是用行优先的方法在全局内存中线性存储的。如下。 8列6行矩阵(nx,ny)(…

链表OJ题讲解1

💓博主个人主页:不是笨小孩👀 ⏩专栏分类:数据结构与算法👀 🚚代码仓库:笨小孩的代码库👀 ⏩社区:不是笨小孩👀 🌹欢迎大家三连关注,一起学习,一起进步&#…

MySQL高级篇第6章(索引的数据结构)

文章目录 1、为什么使用索引2、索引及其优缺点3、InnoDB中索引的推演4、MyISAM中的索引方案5、索引的代价6、MySQL数据结构选择的合理性 1、为什么使用索引 假如给数据使用 二叉树 这样的数据结构进行存储,如下图所示 2、索引及其优缺点 3、InnoDB中索引的推演 4、M…

Spring中声明式事务

声明式事务:基于Spring AOP,通过注解或XML配置实现,有助于用户将操作与事务规则进行解耦。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务…

前端小练-产品宣传页面

文章目录 前言页面结构固定钉头部轮播JS特效 完整代码总结 前言 经过一个月的爆肝,花费了一个月(期间还花费了将近半个月的时间打比赛,还要备研)算是把数二高数的内容强化了一遍,接下来刷熟练度即可,可惜的…

VirtualBox Ubuntu无法安装增强功能以及无法复制粘贴踩坑记录

在VirtualBox安装增强功能想要和主机双向复制粘贴,中间查了很多资料,终于是弄好了。记录一下过程,可能对后来人也有帮助,我把我参考的几篇主要的博客都贴上来了,如果觉得我哪里讲得不清楚的,可以去对应的博…

前端生成图片验证码怎么做?

##题记:我们实现一个功能首先想一下我们需要做哪些工作,比如我们需要生成一个随机的图片验证码,我们需要一个就是点击事件获取验证码,通过接口我们去获取图片路径进行渲染就行,这里边还要牵扯一件事情就是获取一个随机…

uniapp开发小程序-实现中间凸起的 tabbar

一、效果展示: 二、代码实现: 1.首先在pages.json文件中进行tabbar的样式和列表配置,代码如下: {"pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/p…

Stable Diffusion AI绘画学习指南【本地环境搭建win+mac】

一、硬件配配置要求 系统:windows 10 / Mac os 硬盘:C 盘预留 15GB 以上,其他盘 50GB 以上,Stable Ddiffusion的很多大模型都是以 GB 起步。 显卡:4GB 以上,建议 8GB, 效率高,能玩大尺寸的图 CPU&…

Socks IP轮换:为什么是数据挖掘和Web爬取的最佳选择?

在数据挖掘和Web爬取的过程中,IP轮换是一个非常重要的概念。数据挖掘和Web爬取需要从多个网站或来源获取数据,而这些网站通常会对来自同一IP地址的请求进行限制或封锁。为了避免这些问题,数据挖掘和Web爬取过程中需要使用Socks IP轮换技术。在…

Redis秒杀:一人一单问题及初步解决

优惠券秒杀一人一单 前言一、需求以及之前存在的问题二、增加一人一单逻辑1.初步代码2.封装一人一单逻辑3.控制锁的粒度 三、事务控制问题四、总结 前言 跟随黑马虎哥学习redis: 这是我认为b站上最好的redis教程,各方面讲解透彻,知识点覆盖…

Mr. Cappuccino的第53杯咖啡——Mybatis源码分析

Mybatis源码分析 Mybatis源码分析入口1. 读取配置文件总结 2. 解析配置文件核心代码(一)核心代码(二)分析parse()方法分析build()方法 总结 3. 获取SqlSession总结 4. 获取mapper代理对象总结 5. 使用mapper代理对象执行Sql语句二…

基于SpringBoot+Vue的会员制医疗预约服务管理信息系统设计与实现(源码+LW+部署文档等)

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…