Java中==和equals的区别,包装类对比、String和new String

        对于这个问题,我们得了解基本类型和引用类型在内存中的结构,具体如下:

引用对象句柄访问:

引用对象直接指针访问:

 

        可以看出,无论哪种方式访问基本类型和引用类型的实例数据,基本类型的内存上是保存值,而引用类型的内存上是保存指针(地址)。

        == 可以理解为比较图中栈内存的数据。所以基本类型就是比较值,引用类型就是比较地址。

        equals是个方法,只有引用类型才能调用,基础类型如int等是无法调用的。该方法在Object中就存在,实际就是调用 == 来比较,代码如下:

 

         若equals不重写的话,效果等同于==,只不过equals只能被引用类型调用,==可以被所有类型数据调用。

        另外,==判断是有特殊情况的,基础类型的包装类和String就有些情况就不是对比地址了,虽然它们是引用类型。具体比较如下图:

        这里可以看到 包装类比如 Integer不用new声明,==判断就是值判断,因为JVM不会创建Integer对象,会直接在常量池创建变量;若用new 声明,则==判断是引用判断,因为JVM会创建Integer对象,声明的变量存储的是Integer实例在堆中的地址。

        int i = 1和Integer j = 1的 i和j都是在常量池中保存值1,所以两个相等。而Integer h = new Integer(1)会在堆中新建Integer(1)对象,h在常量池中保存Integer(1)对象的地址,所以j==h进行常量池数据比较为false。

        String不用new声明,首先会在常量池中找字符串值,若有则该变量保存的是这个字符串值的地址,若没有找到字符串值,则在常量池中声明新字符串,此时该变量保存的是常量池中新字符串的地址。若用new声明,则直接新建字符串对象,变量为字符串在堆中的地址。

        String x="a"会在常量池中新建字符串"a",然后x保存"a"的地址。String y="a"会因为常量池中存在"a"(x声明的"a"),所以y也直接保存"a"的地址,所以x==y是true。而String z = "ab"和String n = new String("ab")分别会在常量池和堆中新建字符串"ab"并保存它们的地址,这里由于地址一个指向常量池,一个指向堆,显然z和n不等。另外实测 z=="a"+"b"和z!=x+"b",直接固定字符串相加则是常量池查找新建字符串,而有变量参与相加则是堆新建字符串。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年第二届能源与环境工程国际会议(CFEEE 2023)

会议简介 Brief Introduction 2023年第二届能源与环境工程国际会议(CFEEE 2023) 会议时间:2023年9月1日-3日 召开地点:中国三亚 大会官网:CFEEE 2023-2023 International Conference on Frontiers of Energy and Environment Engineering 由I…

Linux系统Centos7 安装MySQL8.0详细步骤

MySql安装 1.下载wget命令 yum -y install wget 2. 在线下载mysql安装包 wget https://repo.mysql.com//mysql80-community-release-el7-3.noarch.rpm 3.MySQL的GPG升级了,需要更新,如果是新安装的MySQL,执行以下脚本即可&#xff1…

conda环境里用不了电脑系统环境里的应用ffmpeg;ffmpeg调用本地windows麦克风读取

1、 ffmpegzai conda环境里执行不了,在系统可以运行 import ffmpegstream ffmpeg.input(rD:\sound\222.mp4) stream ffmpeg.filter(stream, fps, fps25, roundup) stream ffmpeg.output(stream, rD:\sound\dummy2.mp4) ffmpeg.run(stream)会报错: Fi…

Centos 从0到N

0x00 前言 最近一直在搞虚拟机,索性写一篇记录一下全过程,免得下次再去到处查资料 0x01 ssh 首先修改配置文件 vi /etc/ssh/sshd_config 开启端口以及listen 保存后重启服务 systemctl restart sshd 开机自启 chkconfig sshd on0x02 安装基础工具…

支付宝沙箱支付详细教程(IDEA版)—2023最新版

😇作者介绍:一个有梦想、有理想、有目标的,且渴望能够学有所成的追梦人。 🎆学习格言:不读书的人,思想就会停止。——狄德罗 ⛪️个人主页:进入博主主页 🗼专栏系列:无 &#x1f33c…

基于Python+OpenCV的视频字符化(深度学习+机器视觉)含全部工程源码

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境OpenCV环境 模块实现1. 视频读取及处理2. 色素块识别与替换3. 视频合成4. 操作系统上的实现 系统测试工程源代码下载其它资料下载 前言 本项目利用 OpenCV 提供的轻量、高效的 C类和 Python 接口,实…

java抽象类中的静态方法

Java的抽象类中可以包含静态方法,即类方法。尽管抽象类不能实例化,但抽象类中的静态方法是可以用抽象类直接调用的。 下面的代码示例定义了一个抽象类AbstractDemo ,其中包含一个抽象方法method,一个public静态方法showMessage。…

Swin Transformer训练报错问题

1. 训练遇到报错问题 (1)mportError: cannot import name _pil_interp from timm.data.transforms 原因: timm.data.transforms里面没有_pil_interp,只有str_to_pil_interp、_str_to_pil_interpolation、_pil_interpolation_to_s…

AI开源路在何方丨2023智源大会精彩回顾

导读 当下,AI开源已经成为了人类开源创新的主战场,是超大规模人类智力协同的最佳组织形式。得益于开源协作持续不断地推进,AI在这个时代飞速发展。可以说如果没有开源社区建设,就不会有今天人工智能的成就。 在2023智源大会AI开源…

CSS 弹性布局

提示:这章比较重要,做复杂页面时经常会用到!会不断更新❗ 文章目录 前言主轴和侧轴flex-direction 主轴方向flex-wrap 折行justify-content 主轴排列方式flex-start:默认左对齐flex-end:右对齐center:居中s…

2018年全国硕士研究生入学统一考试管理类专业学位联考逻辑试题——纯享题目版

🏠个人主页:fo安方的博客✨ 💂个人简历:大家好,我是fo安方,考取过HCIE Cloud Computing、CCIE Security、CISP等证书。🐳 💕兴趣爱好:b站天天刷,题目常常看&a…

English Learning - L3 作业打卡 Lesson7 Day54 2023.6.29 周四

English Learning - L3 作业打卡 Lesson7 Day54 2023.6.29 周四 引言🍉句1: I daydreamed like I did as a little girl and I imagined myself walking gracefully, helping other people through my journey and snowboarding again.成分划分连读爆破语调 &#x…