你还记得java核心基础类Object么?

Object 类的常见方法有哪些?

Object 类是一个特殊的类,是所有类的父类。它主要提供了以下 11 个方法:

/**
* 尚硅谷2024新版3小时速通Docker教程
* https://www.sanzhishu.top/2696.html
*/// native 方法,用于返回当前运行时对象的 Class 对象,使用了 final 关键字修饰,故不允许子类重写
public final native Class<?> getClass()// native 方法,用于返回对象的哈希码,主要使用在哈希表中,比如 JDK 中的 HashMap
public native int hashCode()// 用于比较 2 个对象的内存地址是否相等,String 类对该方法进行了重写以用于比较字符串的值是否相等
public boolean equals(Object obj)// native 方法,用于创建并返回当前对象的一份拷贝
protected native Object clone() throws CloneNotSupportedException// 返回类的名字实例的哈希码的 16 进制的字符串。建议 Object 所有的子类都重写这个方法
public String toString()// native 方法,并且不能重写。唤醒一个在此对象监视器上等待的线程(监视器相当于就是锁的概念)。如果有多个线程在等待只会任意唤醒一个
public final native void notify()// native 方法,并且不能重写。跟 notify 一样,唯一的区别就是会唤醒在此对象监视器上等待的所有线程,而不是一个线程
public final native void notifyAll()// native方法,并且不能重写。暂停线程的执行。注意:sleep 方法没有释放锁,而 wait 方法释放了锁 ,timeout 是等待时间
public final native void wait(long timeout) throws InterruptedException// 多了 nanos 参数,这个参数表示额外时间(以纳秒为单位,范围是 0-999999)。 所以超时的时间还需要加上 nanos 纳秒
public final void wait(long timeout, int nanos) throws InterruptedException// 跟之前的2个wait方法一样,只不过该方法一直等待,没有超时时间这个概念
public final void wait() throws InterruptedException// 实例被垃圾回收器回收的时候触发的操作
protected void finalize() throws Throwable { }

== 和 equals() 的区别

  • == 对于基本类型和引用类型的作用效果是不同的:

    • 对于基本数据类型来说,== 比较的是值。
    • 对于引用数据类型来说,== 比较的是对象的内存地址。 Java 只有值传递,所以对于 == 来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址。
  • equals() 不能用于判断基本数据类型的变量,只能用来判断两个对象是否相等。equals()方法存在于Object类中,而Object类是所有类的直接或间接父类,因此所有的类都有equals()方法。equals() 方法存在两种使用情况:

    • 类没有重写 equals()方法:通过equals()比较该类的两个对象时,等价于通过“==”比较这两个对象,使用的默认是 Object类equals()方法。
    • 类重写了 equals()方法:一般我们都重写 equals()方法来比较两个对象中的属性是否相等;若它们的属性相等,则返回 true,即认为这两个对象相等。String 中的 equals 方法就是被重写过的。

hashCode() 是什么?返回值是内存地址吗?

  1. hashCode方法用于返回对象的哈希码(散列码)值,hashCode值是一个整数值,这个方法可以提高哈希表(如Hashtable提供的哈希表)的性能,确定该对象在哈希表中的索引位置。

  2. hashCode() 定义在 Object 类中,这就意味着 Java 中的任何类都包含有 hashCode() 函数。hashCode在Object类中有native修饰,是本地方法,该方法的方法体不是Java实现的,是由C/C++实现的,最后编译为.dll文件,然后由Java调用。

  3. hashCode 可以是内存地址,也可以不是内存地址,在 Oracle OpenJDK8 中有六种生成方式来生成 hashCode,默认使用的是一种随机数生成的方法,这是由于垃圾回收时对象需要发生移动,因此使用内存地址会带来不便。

为什么要有 hashCode()?

Java的集合有两类,一类是 List,还有一类是 Set。前者有序可重复,后者无序不重复。当我们在Set中插入的时候怎么判断是否已经存在该元素呢,可以通过equals方法。但是如果元素太多,用这样的方法就会比较慢。

于是有人发明了哈希算法来提高集合中查找元素的效率。 这种方式将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将哈希码分组,每组分别对应某个存储区域,根据一个对象的哈希码就可以确定该对象应该存储的那个区域。

hashCode 方法返回的就是一个哈希码值,当集合要添加新的元素时,先调用这个元素的 hashCode 方法,就一下子能定位到它应该放置的位置上。如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了,就调用它的 equals 方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。这样一来实际调用 equals 方法的次数就大大降低了,相应就大大提高了执行速度。

hashCode() 和 equals() 都是用于比较两个对象是否相等。

  • 那为什么 JDK 还要同时提供这两个方法呢?

    这是因为在一些容器(比如 HashMap、HashSet)中,有了 hashCode() 之后,判断元素是否在对应容器中的效率会更高。我们在前面也提到了添加元素进HashSet的过程,如果 HashSet 在对比的时候,同样的 hashCode 有多个对象,它会继续使用 equals() 来判断是否真的相同。也就是说 hashCode 帮助我们大大缩小了查找成本。

  • 那为什么不只提供 hashCode() 方法呢?

    这是因为两个对象的hashCode 值相等并不代表两个对象就相等。

  • 那为什么两个对象有相同的 hashCode 值,它们也不一定是相等的?

    因为 hashCode() 所使用的哈希算法也许刚好会让多个对象传回相同的哈希值。越糟糕的哈希算法越容易碰撞,但这也与数据值域分布的特性有关(所谓哈希碰撞也就是指的是不同的对象得到相同的 hashCode)。

为什么重写 equals() 时必须重写 hashCode() 方法?

之前在 HashSet 检查元素重复的过程中,判断的过程是:

  • 如果两个对象的hashCode 值相等,那这两个对象不一定相等(哈希碰撞)。
  • 如果两个对象的hashCode 值相等并且equals()方法也返回 true,我们才认为这两个对象相等。
  • 如果两个对象的hashCode 值不相等,我们就可以直接认为这两个对象不相等。

如果重写 equals() 时没有重写 hashCode() 方法的话,就可能会导致 hashCode 值却不相等被判断为不同的对象,但是事实上两个对象是重复的(equals 为 true)。

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

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

相关文章

【Linux】使用 iptables 验证访问HDFS 所使用到的端口

目录 ​编辑 一、实操背景 二、iptables 简介 三、模拟操作 一、实操背景 背景&#xff1a; 在客户有外网的服务器需要访问内网大数据集群HDFS&#xff0c;使用iptable模拟测试需要开放的端口。 二、iptables 简介 具体介绍看文章&#xff1a; 【Linux】Iptables 详解与实战…

并发控制:确保数据一致性的策略

引言 ​ 在现代软件开发中&#xff0c;尤其是在涉及高并发场景的应用&#xff0c;如在线购物、金融交易等&#xff0c;保证数据操作的原子性和一致性是至关重要的。本文将深入探讨并发环境下常见的问题&#xff0c;以及如何通过先进的技术手段确保数据的准确性和安全性。 案例…

安全生产管理系统——特殊作业管控

特殊作业环节面临事故多发、频发、死亡率高&#xff0c;如何做到有效管理是一大考验&#xff0c;进行系统全面的规整很有必要。安全生产管理系统中特殊作业管理通过整合资源和采用信息化技术对动火、受限空间、盲板抽堵、高处、吊装、临时用电、动土、断路等特殊作业全过程管理…

让UI和前端相亲相爱的秘诀:与人方便,自己方便。

在实际项目开发中&#xff0c;UI设计师和前端开发人员经常互撕&#xff0c;这背后的原因是什么&#xff1f;有什么办法可以避么&#xff1f;贝格前端工场在这里为大家解读一下。 一、UI和前端互厮的原因有哪些&#xff1f; 导致UI和前端在写作过程中出现盲区导致互撕的原因可…

HTML表单深度解析:构建互动的网页界面

表单是HTML中用于收集用户输入信息的重要元素&#xff0c;是网页与用户交互的关键组件。以下是一个典型的HTML表单示例&#xff0c;我们将会详细解析其中的各个元素及属性含义。 <form action"https://xx.xxx.xx/search" target"_self" method"ge…

SAP 外币金额汇率转换

一、说明 汇率维护在ERP中可以使用事务代码OB07或者OB08&#xff0c;每次不同币别的汇率更改在正式生产系统中都会新创建一条记录&#xff0c;保存之后会存储在表TCURR中&#xff0c;可以通过函数CONVERT_TO_LOCAL_CURRENCY转换获取&#xff08;注意函数Exporting中各个参数一定…

代码随想录算法训练营DAY38| 理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

理论基础 动态规划的解题步骤 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 509. 斐波那契数 题目链接&#xff1a;509. 斐波那契数 class Solution(object):def fib(self, n):""":t…

第二十章 迭代器模式

目录 1 迭代器模式介绍 2 迭代器模式原理 3 迭代器模式实现 4 迭代器模式应用实例 5 迭代器模式总结 1 迭代器模式介绍 迭代器模式(Iterator pattern)又叫游标&#xff08;Cursor&#xff09;模式&#xff0c;它的原始定义是&#xff1a;迭代器提供一种对容器对象中的各…

如何使用new和delete操作符进行动态内存分配和释放?

在C中&#xff0c;new 和 delete 操作符用于在堆&#xff08;heap&#xff09;上动态地分配和释放内存。这是管理内存的一种重要方式&#xff0c;特别是在需要创建可变数量或生命周期与程序执行流程不一致的对象时。 使用 new 进行动态内存分配 当你使用 new 操作符时&#x…

Redis 五种基本数据类型及场景

Spring Boot 与 Redis 的集成可以使用 Redis 提供的五种基本数据类型来解决不同的使用场景。以下是每种类型及其使用场景和示例代码。 1. String 使用场景&#xff1a;缓存简单的键值对&#xff0c;如计数器、字符串缓存等。 示例&#xff1a; Autowired private StringRed…

展出特种级水下机器人(博雅工道) —2024青岛军博会(智能装备与通信技术)

深蓝探索&#xff0c;智慧融合 —— 2024中国军民两用智能装备与通信技术产业展览会 在科技的浪潮中&#xff0c;我们迎来了一个全新的时代——智能装备与通信技术正重塑着我们的世界。2024年&#xff0c;中国将举办一场具有里程碑意义的科技盛会——"2024中国军民两用智…

下载mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar操作教程

1、下载地址&#xff1a;MySQL :: Download MySQL Community Server (Archived Versions) 2、截图如下

electron录制工具-视频保存、编辑页面

效果如下 electron录屏-保存录制视频 资源 导出视频使用了 mp4-wasm&#xff0c;基本使用&#xff0c;可参考 此文 想法 1、点击按钮导出&#xff0c;弹出选择保存文件夹 2、保存成功后&#xff0c;自动打开保存后文件夹窗口并关闭窗口 实现 获取保存文件夹路径&#xff0…

Python有哪些就业方向?就业市场广阔!

Python是一种跨平台的计算机程序设计语言&#xff0c;是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python语言在人工智能的发展下&#xff0c;越来越多计算机企业开始广泛使用&#xff0c;同时Python的就业方向也逐渐广阔。 YesPMP为学习Python的技术人员…

linux中acl策略+文件权限

文档归属的局限性 - 任何人只属于三种角色&#xff1a;属主 属组 其他人- 无法实现更精细的控制 acl访问策略 - 能够对个别用户个别组设置独立的权限- 大多数挂载ext3/4,xfs文件系统默认已支持 Usage: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...setfacl [选项] u:用户名…

如何 用JavaSpringBoot生成二维码与条形码

前言 在当今的数字化转型浪潮中&#xff0c;二维码已经成为了一种不可或缺的信息交流手段。从产品标签到活动宣传单&#xff0c;再到电子支付&#xff0c;二维码的应用无处不在。本文将详细指导您如何在Spring Boot应用程序中集成ZXing库&#xff0c;以实现QR码的创建和解析功能…

ORA-10458 ORA-01152 :file 1 was not restored from a sufficiently old backup

问题 dg搭建后开库报错 SQL> alter database open; alter database open * ERROR at line 1: ORA-10458: standby database requires recovery ORA-01152: file 1 was not restored from a sufficiently old backup ORA-01110: data file 1: /u01/app/oracle/oradat…

部署大模型LLM

在autodl上部署大模型 windows运行太麻烦&#xff0c;环境是最大问题。 选择云上服务器【西北B区 / 514机】 cpp (c c plus plus) 纯 C/C 实现&#xff0c;无需外部依赖。针对使用 ARM NEON、Accelerate 和 Metal 框架的 Apple 芯片进行了优化。支持适用于 x86 架构的 AVX、…

基于文本和图片输入的3D数字人化身生成技术解析

随着虚拟现实、增强现实和元宇宙等技术的飞速发展,对高度逼真且具有表现力的3D数字人化身的需求日益增长。传统的3D数字人生成方法往往需要依赖大量的3D数据集,这不仅增加了数据收集和处理的成本,还限制了生成的多样性和灵活性。为了克服这些挑战,我们提出了一种基于文本提…

Elasticsearch出现Connection reset by peer

Elasticsearch出现Connection reset by peer分析 1.异常&#xff1a; 2024-06-13 13:17:10.539 WARN [http-nio-30411-exec-9]com.longdaotech.config.ESConfig -onFailure node:[hosthttp://192.168.239.253:9200] 2024/6/13 13:17:10 2024-06-13 13:17:10.541 WARN [http-n…