news 2026/8/19 15:48:10

所有类都有的方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
所有类都有的方法

Object类是所有类的父类,因此所有类都继承Object类的方法

1. equals() 方法:逻辑相等性

2. hashCode() 方法:哈希散列值

hashCode()返回对象的哈希码(int值),主要用于哈希表数据结构(如HashMapHashSet)中快速定位对象。

核心契约

  1. 一致性:在程序同一执行期间,若对象属性未变,多次调用hashCode()必须返回相同的整数。

  2. 等价性:如果a.equals(b)true,则a.hashCode() == b.hashCode()必须成立。

  3. 不等价性(非强制):如果a.equals(b)falsehashCode()不必不同。但分散的哈希值能提升哈希表性能

3. 为什么重写 equals() 必须重写 hashCode()?

这是一个经典陷阱。核心原因在于破坏哈希表的契约

HashSet为例:

  • 存储时:先计算对象的hashCode()定位到桶(数组索引),若桶中无元素则直接存入;若有元素,再通过equals()比较是否重复。

  • 查找时:同样先通过hashCode()定位,再通过equals()确认。

如果只重写equals()而不重写hashCode()

  • obj1obj2在逻辑上相等(equals返回true)。

  • 但它们的hashCode()不同(因为默认返回内存地址映射)。

  • 存入HashMap时,两个对象会被分配到不同的桶中,导致集合中同时存在两个“逻辑相同”的对象,违反Set的唯一性,且无法通过obj1查找出obj2

重要结论

  • 两个不同对象的hashCode()有极小概率相同(哈希碰撞)。

  • 如果hashCode()不同,则两个对象一定不相等(利用这一点可快速排除不等对象)。

4. HashMap 底层结构简述

理解hashCodeequals的协作,离不开对HashMap结构的认知:

  • 数组(Node<K,V>[] table):作为哈希桶,通过(n - 1) & hash计算索引定位。

  • 链表:当发生哈希碰撞时,新节点以链表形式挂在数组同一索引下。

  • 红黑树(JDK 1.8+):当链表长度超过阈值(默认8)且数组长度大于64时,链表转为红黑树,将查找复杂度从 O(n) 优化至 O(log n)。

查找流程

  1. 计算key.hashCode()定位桶。

  2. 若桶内无节点,返回null

  3. 若桶内有节点,通过equals()在链表/树中查找匹配的键。

5. toString() 方法:对象的字符串表示

toString()方法,本身返回的是地址

输出一个对象,默认调用toString()方法,输出对象所属类型和内存地址

可以重写toString()方法

6.getClass() 方法——运行时类信息

getClass()Object类中一个非常重要的方法,它返回当前对象的运行时类信息。

获取运行时类型:返回的是对象实际的Class对象,而不是引用声明的类型。

Object obj = new String("Hello"); System.out.println(obj.getClass()); // class java.lang.String System.out.println(obj.getClass().getName()); // java.lang.String

final 方法,不可重写:由 JVM 原生实现,保证所有对象都能获取到准确的类信息。

与反射机制紧密相关:通过Class对象可以获取类的构造器、方法、字段等信息,是实现反射的入口。

Class<?> clazz = obj.getClass(); Method[] methods = clazz.getDeclaredMethods(); // 获取所有方法

7. 线程协作:wait() / notify() / notifyAll()

这三个方法属于Object类,因为它们操作的是对象监视器(锁)

7.1notify()和notifyAll()方法

当一个线程调用wait()进入等待状态,会让出CPU,不参与竞争,调用notify()唤醒等待的线程,notifyAll()唤醒全部线程

7.2wait()方法

wait() 与 sleep() 的核心区别

特性wait()sleep()
所属类ObjectThread
锁要求必须在同步块/同步方法中持有锁不需要持有锁
锁释放释放当前对象锁不释放任何锁
唤醒方式需由notify()/notifyAll()唤醒,或超时自动唤醒时间到期自动唤醒,或interrupt()中断
使用场景线程间通信(生产者-消费者模式)让线程暂停执行一段时间
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/19 15:46:15

Autojs基础-文件系统(files)

1.前言 脚本开发过程中&#xff0c;考虑成本等多种因素&#xff0c;不会配置云端数据库。我们可以将数据通过文件系统保存到本地txt文件&#xff0c;当我们需要数据时&#xff0c;再通过文件系统取出。除了保存基本文件外&#xff0c;我们也可以将脚本图片等资源在脚本初次启动…

作者头像 李华
网站建设 2026/8/19 15:43:25

Zephyr RTOS从入门到实战:环境搭建、构建系统与应用开发详解

1. 项目缘起&#xff1a;为什么是Zephyr&#xff1f; 如果你最近在嵌入式圈子里混&#xff0c;或者开始关注物联网、边缘计算这些领域&#xff0c;大概率会频繁听到“Zephyr”这个名字。它不再是那个只存在于小众极客讨论中的项目&#xff0c;而是正迅速成为新一代嵌入式实时操…

作者头像 李华
网站建设 2026/8/19 15:37:44

毕业论文选题毫无头绪,有哪些实用的AI论文工具推荐?

毕业季一到&#xff0c;不少同学卡在开题报告的第一步&#xff1a;选题定不下来、研究背景和意义分不清、文献综述无从下手、研究方法和技术路线逻辑混乱&#xff0c;对着空白文档熬上几周也写不出完整框架。尤其是零基础、在职读研、跨专业的学生&#xff0c;对高校开题规范完…

作者头像 李华
网站建设 2026/8/19 15:37:19

FreeRTOS临界区失效?深度解析Cortex-M中断优先级配置陷阱

1. 问题现场&#xff1a;一个看似简单的临界区保护失效那天下午&#xff0c;我正在调试一个基于STM32和FreeRTOS的嵌入式项目。项目里有一个共享的环形缓冲区&#xff0c;用于在中断服务程序&#xff08;ISR&#xff09;和多个任务之间传递数据。为了防止数据竞争&#xff0c;我…

作者头像 李华
网站建设 2026/8/19 15:36:18

分布式存储升级前,先做哪些确认

分布式存储升级前&#xff0c;先做哪些确认 分布式存储升级的难点常在新旧节点共存&#xff0c;而不是二进制替换本身。升级计划应先回答三个问题&#xff1a;协议是否兼容、未完成的日志如何处理、元数据是否可以读回。没有答案&#xff0c;就不应开始滚动发布。 三项确认 第一…

作者头像 李华