彻底搞懂==和equals的区别

2023-10-27

概述:一提==和equals的区别很多人就会说前者是比较地址(即是否是同一个对象)而equals则是比较对象的内容是否一样,其实这是太正确的,接下来仔细分析这俩者的区别

1.基本数据类型存储的位置

参考文章

2.==

==对于基本数据类型是比较值,而对于引用数据类型是比较的它们的实际对象在堆中的地址。

3.为什么所有的java类都是Object类的子类

编译器编译的时候自动进去的。

一般对于这种靠虚拟机运行的语言(如Java、C#等)会有两种方法处理默认继承问题。

1、在编译源代码时,当遇到没有父类的类时,编译器会将其指定一个默认的父类(一般为Object),而虚拟机在处理到这个类时,由于这个类已经有一个默认的父类了,因此,VM仍然会按着常规的方法来处理每一个类。对于这种情况,从编译后的二进制角度来看,所有的类都会有一个父类。

2、编译器仍然按着实际代码进行编译,并不会做额外的处理。如果一个类没有显式地继承于其他的类,编译后的代码仍然没有父类。然后由虚拟机运行二进制代码时,当遇到没有父类的类时,就会自动将这个类看成是Object类的子类(一般这类语言的默认父类都是Object)。

从上面两种情况可以看出,第1种情况是在编译器上做的文章,也就是说,当没有父类时,由编译器在编译时自动为其指定一个父类。第2种情况是在虚拟机上做文章,也就是这个默认的父类是由虚拟机来添加的,

其实Java就属于第一种。

具体验证

(1)编写一个类

public class Test{
         public Test();
          public static void main(java.lang.String[]){};
}

(2)进行编译成.class,再反编译成txt

(3)反编译结果

public class Test extends java.lang.Object{
            public Test();
           public static void main(java.lang.String[]){};
}

4.equals

Object源码

public boolean equals(Object obj) {
        return (this == obj);
    }

可以看到equals其实就是==,那为什么很多人会有很多会有我说的刚才错误的观念呢,其实是因为java的许多内置类已经重写了equals方法并且人们也习惯用Equals来比较内容。(例如String类以及包装类)

String类的equals方法源码

 public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

Integer类的equals方法源码

public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }
public int intValue() {
        return value;
    }

还有其它包装类就不展示了

5.包装类需要注意的地方(面试考点)

参考文章
包装类的缓存池在哪块存储区域还未找到答案,如果有大佬知道希望能说一下

6.HashCode

参考文章

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

彻底搞懂==和equals的区别 的相关文章

  • 文件处理File

    初始 在删除文件时出现异常 try 多个Excel导出进行压缩 存放到临时文件夹 没有则创建文件夹 ZipUtils toZip folder getPath response getOutputStream false 删除临时文件和文件
  • Android顶部菜单栏 Title等的实现方法

    刚才介绍了关于底部菜单栏的实现方法 接下来介绍下顶部的实现 我是将麻烦的内容都封装成类了 大家使用的时候直接继承 里面的原理如果想知道的话就看源码啦 好啦 不多说 上菜 首先你需要引入两个类 BaseLayout与BaseTitleActi
  • (28)[AISTATS15] Joint Learning of Words and Meaning Representations for Open-Text Semantic Parsing

    计划完成深度学习入门的126篇论文第二十八篇 蒙特利尔大学的Bengio领导关于Joint Learning用于Open Text研究语义分析及意义表示的论文 ABSTRACT INTRODUCTION 摘要 Open text语义分析器
  • 【Python】蓝桥杯真题讲解

    第一题 难度系数 1 满分 50 分 编程实现 用 1 3 5 8 这几个数字 能组成的互不相同且无重复数字的三位数各是多少 总共有多少个 输入 无 输出 多行数字 每行一个三位数组成的三位数的总个数 将程序命名为 lq001 评判标准 1
  • Java后端技术-Maven学习笔记

    目录 Maven安装配置 Maven私服搭建之Nexus 安装Nexus 对接Nexus Maven安装配置 官网下载地址https maven apache org download cgi 配置文件修改 配置maven conf set
  • 变量和数据类型

    了解什么是变量 为什么需要它 计算机中的内存分类 RAM 运行时存储 我们的计算机程序 在运行的时候 数据就会临时存储在RAM中 如果不持久化 或者突然断电 它的数据就丢失了 ROM 只读存储 持久化存储 文件存储 如 磁盘 我们在说电脑多
  • Docker 部署 Nginx、frp 实现内网穿透

    原文链接 https waynegong cn posts 8279 html 由于没有公网 IP 加上黑群晖没有洗白 无法进行外网的远程连接 通过 frp 内网穿透后可以通过 sub domain com xxx 的形式访问到内网的 we
  • AD生成PCB引脚出现绿色

    引脚出现绿色是因为引脚之间的间距过窄 与AD默认的连线之间的规则冲突 解决办法 https blog csdn net qq 41862220 article details 90548806
  • vue路由守卫

    vue中路由守卫 路由守卫 一共有三种 一个全局路由守卫 一个是组件内路由守卫 一个是router独享守卫 全局路由守卫 全局前置守卫 从名字全局前置守卫不难理解 它是全局的 即对 整个单页应用 SPA 中的所有路由都生效 所以当定义了全局
  • Anaconda使用conda管理技巧汇总

    0 conda概述 如果你以前使用pip和virtualenv 使用conda你可以完成所有的操作 pip是一个包管理器而virtualenv是一个环境管理器 Conda兼具两者的功能 Task Conda package and envi
  • web前端基础(一)——HTML+CSS

    系列文章目录 web前端基础 一 HTML CSS 目录 系列文章目录 前言 HTML HTML的介绍 1 html的定义 2 html的作用 HTML的基本结构 1 结构代码 2 浏览网页文件 vscode的下载与使用 1 vscode
  • matlab实现大律法,Otsu算法(大律法或最大类间方差法)

    Otsu算法 大律法或最大类间方差法 2013 03 07 10 54 02 Otsu算法 大律法或最大类间方差法 一 Otsu最大类间方差法原理 利用阈值将原图像分成前景 背景两个图象 前景 用n1 csum m1来表示在当前阈值下的前景
  • 在 Docker 内运行 Cronjob:初学者指南

    当涉及到按设定的时间间隔自动运行或可以由另一个事件触发的调度作业和程序时 您有很多选择 您可以使用通用实用程序 如 cron macOS 或 Linux 中的内置调度程序 或专用工具 如 AWS Lambda Cron 虽然不如 AWS L
  • 如何在 Python 中安装 OpenCV

    OpenCV 开源计算机视觉 是一个免费的开源计算机视觉和机器学习算法库 可用于处理和分析图像和视频 它广泛用于各种应用 包括对象检测 图像和视频处理以及增强现实 在本文中 我们将介绍在 Python 中安装 OpenCV 的两种不同方法
  • 如何在 Ubuntu 20.04 上安装 PHP(8.1、7.4 和 5.6)

    在本文中 我们将了解如何在 Ubuntu 操作系统上安装 PHP 脚本语言 PHP 脚本语言是创建动态网站最流行的选项之一 它也用于各种其他环境 它是一种开源编程语言 代表 PHP 超文本预处理器 我们稍后会解释所有这些意味着什么 如果您需
  • Magento 2 性能优化技巧

    随着科技的进步 人们的注意力持续时间在缩短 eBay 旗下的 Magento 是当今用于发展在线业务的最广泛使用的电子商务平台之一 虽然 在选择电子商务 CMS 或平台 例如 WooCommerce Shopify 等 时 您有很多选择 但
  • 如何使用 PHP 获取头像

    当您创建应用程序并希望在其个人资料图片上显示用户的图像时 这可能是您从 Gravatar 帐户获取用户图像的更好选择 我们可以从那里简单地使用他们的电子邮件地址获取图像
  • 如何使用 Wget 忽略 SSL 证书检查

    Wget 是一个免费且功能强大的实用程序 可通过 Cygwin 适用于大多数类 Unix 操作系统 包括 Linux Mac 和 Windows 它允许您使用各种协议 例如 HTTP HTTPS 和 FTP 从服务器检索文件和网页 但是 在
  • 将 Bash 脚本转换为二进制

    Bash shell 是类 Unix 操作系统的主要组成部分 以其脚本化能力而广为人知 然而 这些脚本通常存储为纯文本文件 因此很容易受到检查和更改 在某些情况下 您可能希望将这些 Bash 脚本转换为二进制格式 以提高安全性 效率和可移植
  • 如何在 Ubuntu 上使用 Apache 安装 Mod_Pagespeed

    网站速度缓慢是大多数软件工程师和系统管理员面临的主要问题 他们不断尝试通过各种方式优化速度 那么问题来了 如何提高网站速度呢 提高网站速度的最佳方法是什么 Google 为 Apache 用户提供了 mod pagespeed 模块 可通过

随机推荐

  • 如何在 Linux 中将 PDF 转换为图像

    在本文中 您将学习如何在 Linux 命令行界面中将 PDF 文件转换为图像 Pdftoppm 将可移植文档格式 PDF 文件转换为彩色图像文件 如 PNG JPG 等 Pdftoppm 读取 PDF 文件并为每一页创建一个 PPM 图像
  • 如何在 Ubuntu 18.04 上安装 MySQL 8.0

    MySQL 是最流行的关系数据库管理系统 假设互联网上运行的网站中有三分之一使用 MySQL MySQL 官方团队提供了 MySQL 8 的 Debian 软件包 以便在 Ubuntu 系统上安装 本教程将帮助您在 Ubuntu 18 04
  • 在 CentOS 5/6 和 RHEL 5/6 上安装 PostgreSQL 9.1

    PostgreSQL 是一个开源的对象关系型 高度可扩展 兼容 SQL 的数据库管理系统 本文将帮助您在 CentOS 5 6 和 RHEL 5 6 上安装 PostgreSQL 9 1 第1步 添加 PostgreSQL Yum 存储库
  • 如何使用 PowerShell 从 Windows 命令行发送电子邮件

    发送电子邮件是当今数字时代的一项基本任务 作为系统管理员 您可能需要从命令行发送电子邮件以自动执行此任务 在本文中 我们将向您展示如何使用 PowerShell 从 Windows 命令行发送电子邮件 从而简化您的电子邮件通信并提高您的工作
  • 如何在 Ubuntu 20.04 上安装 Elasticsearch

    Elasticsearch 是一个开源分布式全文搜索和分析引擎 它支持 RESTful 操作 允许您实时存储 搜索和分析大量数据 Elasticsearch 是最流行的搜索引擎之一 为具有复杂搜索要求的应用程序 例如大型电子商务商店和分析应
  • Bash while 循环

    循环是编程语言的基本概念之一 当您想要多次运行一系列命令直到满足特定条件时 循环会很方便 在 Bash 等脚本语言中 循环对于自动执行重复任务非常有用 Bash 脚本中有三种基本的循环结构 for loop while循环 并且直到循环 本
  • 在 Python 中解析 JSON 数据

    JSON 是一种人类可读的基于文本的数据格式 它与语言无关 用于应用程序之间的数据交换 在本文中 我们将解释如何在 Python 中解析 JSON 数据 Python JSON The json允许您对 JSON 数据进行编码和解码的模块是
  • 如何在 CentOS 7 上安装 Google Chrome 网络浏览器

    谷歌浏览器是世界上使用最广泛的网络浏览器 它是专为现代网络构建的快速 易于使用且安全的浏览器 Chrome 不是开源浏览器 也不包含在 CentOS 存储库中 它是基于Chromium 一个开源浏览器 可在EPEL 存储库 本教程介绍如何在
  • Bash 中断并继续

    循环允许您多次运行一个或多个命令 直到满足特定条件 但是 有时您可能需要更改循环流程并终止循环或仅终止当前迭代 在巴什中 break and continue语句允许您控制循环执行 Bash break陈述 The break语句终止当前循
  • 如何在 Ubuntu 18.04 上安装和使用 FFmpeg

    FFmpeg 是一个免费的开源命令行工具 用于对多媒体文件进行转码 它包含一组共享的音频和视频库 例如libavcodec libavformat和libavutil 使用 FFmpeg 您可以在各种视频和音频格式之间进行转换 设置采样率以
  • 如何在 Ubuntu 20.04 上安装 Webmin

    Webmin 是一个用于管理 Linux 服务器的开源 Web 控制面板 它允许您管理系统用户 组 磁盘配额以及安装和配置 Web ssh ftp 电子邮件和数据库服务器 With Webmin 您可以通过网络浏览器配置系统的几乎每个方面
  • Linux 中的 Wc 命令(统计行数、字数和字符数)

    在 Linux 和类 Unix 操作系统上 wc命令允许您计算每个给定文件或标准输入的行数 字数 字符数和字节数并打印结果 在本教程中 我们将向您展示如何使用wc通过简单实用的例子进行指挥 如何使用wc命令 语法为wc命令如下 wc OPT
  • 如何在 Ubuntu 20.04 上安装 Python 3.9

    Python 是世界上最流行的编程语言之一 它是一种多功能语言 用于构建各种应用程序 从简单的脚本到复杂的机器学习算法 凭借其简单易学的语法 Python 成为初学者和经验丰富的开发人员的热门选择 Python 3 9 是 Python 语
  • 如何修复 WordPress 白屏死机

    如果您有 WordPress 网站 则其中之一最常见的错误您可能会遇到白屏死机 WSOD 然而 经历它可能会很可怕 因为您可能想知道 WSOD 的根本原因 并且不知道下一步 WSOD 可能有多种可能的原因 确定它们并不容易 特别是如果您不熟
  • 如何在 CentOS 7 上安装 Go

    Go 通常称为 golang 是由 Google 创建的现代开源编程语言 许多流行的应用程序 包括 Kubernetes Docker Hugo 和 Caddy 都是用 Go 编写的 在本教程中 我们将向您展示如何在 CentOS 7 系统
  • 如何在 Ubuntu 18.04 上安装 VirtualBox

    虚拟盒子是一款开源跨平台虚拟化软件 允许您同时运行多个来宾操作系统 虚拟机 在本教程中 我们将向您展示如何在 Ubuntu 18 04 计算机上安装 VirtualBox 的两种不同方法 第一种方法描述了从 Oracle 存储库安装 Vir
  • 转化为布尔值的规则

    对于基本类型的数据 null和undefined直接转化为false 字符串 空字符串转化为false 其他全为true 数字 0和NaN转化为false 其他全为true 对于引用类型数据 全为true 所以 的结果是true 分析 中
  • 电脑数据恢复,哪种方法靠谱?

    信息化时代 电脑的需求增加了 那么很多的数据都会保存在电脑上面 万一数据丢失了 那么有什么办法能恢复呢 要想恢复电脑里面丢失的数据 也不是没有办法找回的 可以借助专业的数据恢复软件EasyRecovery进行恢复 访问http wm mak
  • 【Linux】配置网络和firewall防火墙(超详细介绍+实战)

    Liunx学习记录篇 篇一 Linux VMware安装unbuntu18 04虚拟机 超详细步骤 附镜像文件 篇二 Linux ubuntu18 04系统基础配置及操作 篇三 Linux 用户与组的操作详细介绍 篇四 Linux 管理Li
  • 彻底搞懂==和equals的区别

    概述 一提 和equals的区别很多人就会说前者是比较地址 即是否是同一个对象 而equals则是比较对象的内容是否一样 其实这是太正确的 接下来仔细分析这俩者的区别 文章目录 1 基本数据类型存储的位置 2 3 为什么所有的java类都是