java的object类

object类

看下object类的结构:
在这里插入图片描述

Object是所有类的父类,任何类都默认继承Object。在Java中,如果没有指定父类,则默认为Object。这是因为Object类是Java中最基本的类,也是所有类的祖先

  1. public String toString()
    : 这个方法返回对象的字符串表示形式。通常,在打印对象时会调用此方法。默认实现返回对象的类名和哈希码的无符号十六进制表示形式。
  2. public boolean equals(Object obj)
    : 这个方法用于比较两个对象是否相等。根据 obj 的类型,它会执行类型转换并使用 equals() 方法比较对象的内容。如果两个对象相等,则返回 true;否则返回 false。
  3. public int hashCode()
    : 这个方法返回对象的哈希码值。哈希码是一个整数,代表了该对象在内存中的存储位置,它是根据对象的内容计算得出的。如果两个对象相等(即 equals() 方法返回 true),则它们的哈希码必须相等。
    hashcode存在主要是为了查找的快捷性,hashcode是用来在散列存储结构中确定对象的存储地址的。
  4. protected Object clone() throws CloneNotSupportedException
    : 这个方法创建并返回此对象的一个副本。如果对象所属的类不支持克隆,将抛出 CloneNotSupportedException 异常。
  5. public final Class<?> getClass()
    : 这个方法返回对象的运行时类。运行时类是对象所属的实际类的类对象。
  6. public final void notify()
    : 这个方法唤醒在此对象监视器上等待的单个线程。如果没有线程在等待,则什么也不做。
  7. public final void notifyAll()
    : 这个方法唤醒在此对象监视器上等待的所有线程。
  8. public final void wait()
    : 这个方法导致当前线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
  9. public final void wait(long timeout)
    : 这个方法导致当前线程等待指定的时间(以毫秒为单位)。如果在指定的时间内没有其他线程调用此对象的 notify() 方法或 notifyAll() 方法,则返回。
  10. public final void wait(long timeout, int nanos)
    : 这个方法与 wait(long timeout) 类似,但接受纳秒作为参数,以便更精确地控制等待时间。
  11. public final boolean instanceof(Class<?> cls)
    : 这个方法检查此对象是否是指定类的实例。如果是,则返回 true;否则返回 false。

一些问题和解决方案

  1. 为什么重写equals同时也要重写hashcode方法?
    Java中规定,如果两个对象相等(即equals方法返回true),那么它们的hashCode值也必须相同。如果不重写hashCode方法,那么默认情况下,每个对象的hashCode值都由其内存地址决定,这样不同的对象就有可能产生相同的hashCode值,导致在使用哈希表等数据结构时出现错误。
    因此,在重写equals方法时,也应该同时重写hashCode方法,以保证相等的对象具有相同的哈希码值,从而保证在使用哈希表等数据结构时的正确性。
  2. 怎么写hashcode?
    在 JDK 的 Integer类,Float 类,String 类等都重写了 hashCode 方法,我们自定义对象也可以参考这些类来写。比如StringLatin1的hashcode:
public static int hashCode(byte[] value) {
        int h = 0;
        for (byte v : value) {
            h = 31 * h + (v & 0xff);
        }
        return h;
    }

Integer 的hashcode:

  public static int hashCode(int value) {
        return value;
    }

比较省事的重写 hashCode 方法就是用别人的轮子

public int hashCode() {
        int result = 31*declaringClass.hashCode() + methodName.hashCode();
        result = 31*result + Objects.hashCode(classLoaderName);
        result = 31*result + Objects.hashCode(moduleName);
        result = 31*result + Objects.hashCode(moduleVersion);
        result = 31*result + Objects.hashCode(fileName);
        result = 31*result + lineNumber;
        return result;
    }

public int hashCode() {
    return Arrays.hashCode(this.ptypes);
}
  1. 为什么 String hashCode 方法选择数字31作为乘数?
    值 31 被选择是因为它是一个奇素数。如果它是偶数并且乘法溢出,信息将会丢失,因为乘以 2 相当于移位。使用素数的优势不太明显,但它是传统的。31 的一个很好的性质是,乘法可以用移位和减法来替换以获得更好的性能:31 * i == (i << 5) - i 。现代虚拟机会自动进行这种优化。
  2. equals和 == 的区别
    == 是比较运算符,用于比较两个基本数据类型或两个对象是否相等。对于基本数据类型,它比较的是值;对于对象,它比较的是地址
    而equals()是一个方法,只能比较引用数据类型。如果对象没有覆盖equals方法,那么等价于 == 。如果对象覆盖了equals方法,则根据覆盖的equals具体实现来判断。一般是比较对象内容 。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Windows下Python+PyCharm+miniconda+Cuda/GPU 安装步骤

1. 官网安装Python 3.9 Python Release Python 3.9.0 | Python.org 2. 安装pycharm https://download.jetbrains.com/python/pycharm-professional-2023.3.2.exe 3. 安装miniconda Miniconda — miniconda documentation 4. 安装完miniconda 创建虚拟环境 conda create …

Linux命令之用户账户管理whoami,useradd,passwd,chage,usermod,userdel的使用

1、查看当前用户账户 2、切换用户为root用户 3、新建用户user1&#xff0c;给用户user1设置密码为password123 4、新建用户user2&#xff0c;UID为510&#xff0c;指定其所属的私有组为group1&#xff08;group1组的标识符为500&#xff09;&#xff0c;用户的主目录为/home/us…

6.1810: Operating System Engineering 2023 <Lab7 lock: Parallelism/locking>

一、本节任务 二、要点 2.1 文件系统&#xff08;file system&#xff09; xv6 文件系统软件层次如下&#xff1a; 通过路径树我们可以找到相应的文件&#xff1a; fd&#xff08;文件描述符&#xff09;是进程用来标识其打开的文件的手段&#xff0c;每个进程有自己的文件…

C++学习笔记(三十三):c++ 宏定义

本节对c的宏定义进行描述。c使用预处理器来对宏进行操作&#xff0c;我们可以写一些宏来替换代码中的问题&#xff0c;c的宏是以#开头&#xff0c;预处理器会将所有的宏先进行处理&#xff0c;之后在通过编译器进行编译。宏简单说就是文本替换&#xff0c;可以替换代码中的任何…

高级分布式系统-第15讲 分布式机器学习--概念与学习框架

高级分布式系统汇总&#xff1a;高级分布式系统目录汇总-CSDN博客 分布式机器学习的概念 人工智能蓬勃发展的原因&#xff1a;“大” 大数据&#xff1a;为人工智能技术的发展奠定了坚实的物质基础。 大规模机器学习模型&#xff1a;具备超强的表达能力&#xff0c;可以解决…

CMU15-445-Spring-2023-Project #3 - 前置知识(lec10-14)

Lecture #10_ Sorting & Aggregation Algorithms Query Plan 数据库系统会将 SQL 编译成查询计划。查询计划是一棵运算符树。 Sorting DBMS 需要对数据进行排序&#xff0c;因为根据关系模型&#xff0c;表中的tuple没有特定的顺序。排序使用 ORDER BY、GROUP BY、JOIN…

如何在Windows 10/11的防火墙中禁止和允许某个应用程序,这里提供详细步骤

想阻止应用程序访问互联网吗&#xff1f;以下是如何通过简单的步骤阻止和允许Windows防火墙中的程序。​ 一般来说&#xff0c;大多数用户永远不需要担心应用程序访问互联网。然而&#xff0c;在某些情况下&#xff0c;你需要限制应用程序访问互联网。 例如&#xff0c;有问题…

高级定时器

本节主要介绍以下内容&#xff1a; 定时器简介 高级定时器功能框图讲解 一、定时器简介 定时器功能 &#xff1a;定时、输出比较、输入捕获、断路输入 定时器分类 &#xff1a;基本定时器、通用定时器、高级定时器 定时器资源 &#xff1a;F103有2个高级定时器、4个通…

Vue学习笔记3--全局事件总线

Vue学习笔记3—全局事件总线 1.全局事件总线可以实现任意组件间通信 X需具备的条件&#xff1a; 所有的组件都要能看见X可以调用$on $off $emitVue.prototype.x {a:1, b:2} 可以被所有组件看见VueComponent.protoype.proto Vue.prototype组件实例对象(vc)可以访问到Vue原型上…

Redis实现全局唯一Id

一、全局唯一ID 每个店铺都可以发布优惠券&#xff1a; 当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这张表中&#xff0c;而订单表如果使用数据库自增ID就存在一些问题&#xff1a; id的规律性太明显 受单表数据量的限制 场景分析&#xff1a;如果我们的…

10.9.2 std::function 代替函数指针 Page182~183

std::function是一个模板类&#xff0c;基本可作为函数指针的代替品&#xff0c;具备更多功能&#xff0c;特别是与函数对象及bind配合使用。使用std::function时&#xff0c;需要添加头文件 #include <functional> 1.定义函数指针 18行&#xff0c;定义了一个函数指针类…

大语言模型面试问题【持续更新中】

自己在看面经中遇到的一些面试题&#xff0c;结合自己和理解进行了一下整理。 transformer中求和与归一化中“求和”是什么意思&#xff1f; 求和的意思就是残差层求和&#xff0c;原本的等式为y H(x)转化为y x H(x)&#xff0c;这样做的目的是防止网络层数的加深而造成的梯…

Visual Studio 2022 成功配置QT5.12.10

目录 下载并安装Visual Studio 2022 Qt5.12.10下载 Qt5.12.10安装 Qt VS Tools for Visual Studio 2022下载 Visual Studio 2022配置 测试 下载并安装Visual Studio 2022 下载社区版并安装&#xff0c;这个比较快。 Qt5.12.10下载 官网下载很慢&#xff0c;还不如百度网…

在visual studio中调试时无法查看std::wstring

1.问题 在调试的时候发现std::wstring类型的变量查看不了&#xff0c;会显示(error)|0&#xff0c;百思不得其解。 2.解决方法 参考的&#xff1a;vs2015调试时无法显示QString变量的值&#xff0c;只显示地址_vs调试qstring的时候如何查看字符串-CSDN博客 在工具/选项/调试…

Linux网络文件共享服务2(基于NFC)

目录 一、初步了解NFS 1、概念 2、工作原理 3、NFS优势和缺点 3.1优点 3.2缺点 二、NFS软件介绍 2.1 NFS共享配置文件格式 2.2 NFS工具 2.2.1 exportfs 2.2.2 showmount 2.2.3 mount.nfs 三、NFS服务部署 1、服务器部署配置 2、客户端配置 3、服务测试 一、初步…

解决英特尔无线网卡WiFi或者蓝牙突然消失问题

winR&#xff0c;输入“devmgmt.msc”&#xff0c;检查设备管理器中的无线网卡驱动是否安装好。 访问https://www.intel.cn/content/www/cn/zh/download/19351/windows-10-and-windows-11-wi-fi-drivers-for-intel-wireless-adapters.html下载对应系统版本的英特尔无线网卡WiFi…

VMware虚拟机忘记密码操作方法

下面已openEuler虚拟机为例&#xff1a; 1、点击重启时&#xff0c;一直按esc&#xff08;鼠标点击一下&#xff0c;确保鼠标在你的虚拟机里面&#xff09; 2、一直到进入到如下页面按e键&#xff08;可能会略有不同&#xff09; 3、按e键后跳转到如下页面 4、在该页面输入 in…

软件测试|使用selenium实现文件上传

简介 文件上传是我们web自动化测试工作中经常使用的场景&#xff0c;selenium同样也是支持我们实现自动化的文件上传操作&#xff0c;本文就来给大家介绍一下selenium如何实现自动化文件上传。 input标签文件上传 一般情况下&#xff0c;文件上传的按钮是一个<input>标…

纯c++简易的迷宫小游戏

一个用c写的黑框框迷宫 适合新手入门学习 也适合大学生小作业 下面附上代码 总体思路 初始化游戏界面&#xff1a;设置迷宫的大小&#xff08;WIDTH和HEIGH&#xff09;&#xff0c;生成迷宫地图&#xff08;map&#xff09;&#xff0c;包括墙壁、空地、起点和终点。显示…

设计模式-委托模式

设计模式专栏 模式介绍模式特点应用场景委托模式在GUI编程场景的应用代码示例Java实现委托模式Python实现委托模式 委托模式在spring中的应用 模式介绍 委托模式是一种软件设计模式&#xff0c;其中一个对象&#xff08;委托对象&#xff09;将某些操作委托给另一个对象&#…