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

news2024/12/23 10:17:12

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

引用对象句柄访问:

引用对象直接指针访问:

 

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

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

        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.coloradmin.cn/o/689095.html

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

相关文章

Spring Framework远程代码执行漏洞(CVE-2022-22965)

Spring Framework远程代码执行漏洞(CVE-2022-22965) 一、漏洞描述 springframework 是spring 里面的一个基础开源框架,主要用于javaee的企业开发。 2022年3月30日,Spring框架曝出RCE 0day漏洞,攻击者通过该漏洞可远…

计网之基础篇

因特网协议概述 常用协议应用层HTTP(超文本传输协议)、FTP(文件传输协议)、SMTP(简单邮件传输协议)、DNS(域名系统)、DHCP(动态主机配置协议)、SNMP&#xff…

erlang安装问题(State machine user_ dru terminating)

输入erl 出现错误 State machine user_ dru terminating 主要原因是安装的erlang版本太高导致,建议选择对应rabbitmq并且是中版本的。新版本会有各种各样适配问题。如果现在26 建议选用25中间 对应rabbitmq低一个版本,稳定性更好

螺旋矩阵(顺时针遍历矩阵)

leetcode 54.螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 和剑指office29题相似; 思路:既然是顺时针遍历一圈,那么我们就分别从上边,右边,下…

SQL-游标-更新删除-多列指向

--切换数据库 use MyDatabase--创建游标(scroll:滚动游标) declare mycur cursor scroll for select EmpNo from Employee --打开游标 open mycur --关闭游标 close mycur --删除游标 deallocate mycur--提取第一行 --利用游标进行数据的修改 fetch absolute 2 from…

【django中处理静态的数据 css js img】

django中处理静态的数据 css js img 1.创建django项目2.打开项目3.配置settingpy中找到STATIC_URL3.1静态资源 4.创建静态资源文件夹5.开启服务6. 网页请求7.使用模板 进行编写 并请求8.在模板中进行 图片的请求9.模板中使用动态url {% static %}10 static的 动态url加载 1.创建…

C++读取易语言字节集图片opencv识别滑块

易语言字节集在C中其实是字节数组的形式,这边做的是一个本地滑块识别的,识别已经实现,主要解决读入字节集的问题,因为图片的大小问题,直接传字节集恐怕不行,所以在易语言处理图片,然后在内容中C…

软考高级系统架构设计师(九) 作文模板-微服务架构(待继续完善)

目录 举一反三-论微服务架构及其应用 ps: 更多微服务信息 ps: 微服务与SOA区别 微服务架构举例 微服务的落地技术 微服务的技术可大致分为五类 举一反三-论微服务架构及其应用 论微服务架构及其应用 微服务提倡将单一应用程序划分成一组小的服务,服务之间互相…

vue 将登录后信息放入cookie中,后端请求接口携带

第一步 import Cookies from "js-cookie";//将需要的信息放入cookie Cookies.set("deptId", res.user.dept.deptId, { expires: 30 });引入cookies import Cookies from "js-cookie";// 查询参数queryParams: {deptName: undefined,status: un…

Rust语言从入门到入坑——(9)Rust 生命周期

文章目录 0、引入1、生命周期注释2、结构体中使用字符串切片引用3、静态生命周期4、泛型、特性与生命周期协同作战5、总结 0、引入 Rust 生命周期机制是与所有权机制同等重要的资源管理机制,之所以引入这个概念主要是应对复杂类型系统中资源管理的问题。 引用是对…

【云原生丶Docker】DockerFile完全指南

DockerFile构建过程 DockerFile 是Docker的一个配置文件,本质上来说它只是一个文本文件,它是用来构建Docker镜像的。DockerFile配置文件中包含了一系列的指令和配置信息,用于描述如何构建镜像以及如何运行容器。通过编写 Dockerfile&#xf…

【c++11】新的类功能和可变参数包

c11 新增默认成员函数类成员变量初始化关键字defaultdelete 委托构造 可变参数包递归展开参数包逗号表达式展开参数包 结语 新增默认成员函数 原来c类中,有6个默认成员函数: 构造函数析构函数拷贝构造函数拷贝赋值重载取地址函数const 取地址重载 默认…

将mp4视频推流rtsp,并转为http直播流,在前端显示

最近有个需求,在vue页面的video组件播放直播流,本来想用flv.js,但是必须要flv格式才行,所以还是用原生video播放http直播流。 1. 将本地mp4推流rtsp 下载并解压EasyDarwin,双击EasyDarwin.exe运行,在控制…

【python】web应用开发DRF框架

DRF 【python】web应用开发DRF框架 Django rest_framework, 简称 drf, 可以更方便的使用django写出符合 RESTful 规范的接口, (缩减编写api接口的代码) Django REST framework是一个建立在Django基础之上的Web应用开发框架(Django的一个app),可以快速的开发REST A…

【IMX6ULL驱动开发学习】12.Linux驱动之设备树

承接上一篇博客 【IMX6ULL驱动开发学习】11.驱动设计之面向对象_分层思想(学习设备树过渡部分) 代码获取:https://gitee.com/chenshao777/imx6-ull_-drivers 我后面将三个层合并了(实际上只有前两层),合并…

【Java入门】注释、关键字、常量、变量、数据类型

注释: 作用 : 可以记录代码所实现的功能,方便程序员或代码编写者阅读代码以及方便他人更好理解代码 注释分类: 单行注释 格式: //注释信息多行注释 格式: /注释信息/文档煮熟 格式:/** 注释信息*/ /***…

TCP的socket API

1、核心类 ServerSocket :服务器使用的socket Socket : 服务器和客户端都会使用的socket accept进行的工作是拉客 对应操作系统来说,建立TCP连接是内核的工作 accept要干的就是等连接建立好了,把这个连接给拿到应用程序中。 如果当前连接…

chatgpt赋能python:Python获取文件后缀名

Python获取文件后缀名 在Python编程中,经常需要获取文件的后缀名,例如在处理文件上传、下载、压缩等操作时,需要对文件后缀名进行判断和处理。本文将介绍Python获取文件后缀名的两种常用方法。 方法一:使用split()函数 Python的…

【C语言初阶(2)】循环语句:while 循环

文章目录 1. while 语句介绍1.1 语法结构1.2 while 语句执行的流程 2. while 语句中的 break 和 continue2.1 break 介绍2.2 continue 介绍 我们已经掌握了 if 语句,当条件满足的情况下,if 语句的后的语句执行,反之不执行; 但是 i…

ChatGPT最新版多功能批量写作工具激发创作的无限可能

随着科技的不断发展,人工智能逐渐渗透到各个领域,其中包括写作领域。近年来,OpenAI推出的ChatGPT最新版多功能批量写作工具,为写作者们带来了全新的创作体验。这一工具不仅能够帮助写作者提高工作效率,还能够激发创作的…