news 2026/5/25 13:10:39

《Java 100 天进阶之路》第21篇:Java Object类

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《Java 100 天进阶之路》第21篇:Java Object类

第21篇:Java Object类


📌系列导航:《Java 100 天进阶之路》完整目录 |
⬅️ 上一篇:第20篇:Java接口的作用和意义 |
➡️ 下一篇:第22篇:Java字符串简介


一、核心知识点

  • Object 是所有类的父类
  • 核心方法:equals()hashCode()toString()getClass()clone()finalize()(已过时)
  • equals()==的区别
  • equals()hashCode()的契约关系

二、通俗讲解(1分钟开心学)

Object 类是 Java 类层次的根,每个类都直接或间接继承 Object。它定义了所有对象通用的行为。

常用方法

  • toString():返回对象的字符串表示,默认是类名@哈希码,通常需要重写。
  • equals(Object obj):比较对象是否“相等”。默认实现是==(比较引用),需要重写来比较内容。
  • hashCode():返回对象的哈希码,用于哈希表(如 HashMap)。重写 equals 时必须重写 hashCode。
  • getClass():返回对象的运行时类。
  • clone():创建并返回对象的拷贝(需要实现 Cloneable 接口)。

equals 和 == 区别

  • ==对于基本类型比较值,对于引用类型比较内存地址。
  • equals()可以被重写,比如 String 的比较内容。

equals 和 hashCode 契约

  • 如果两个对象 equals 返回 true,它们的 hashCode 必须相等。
  • 如果 hashCode 相等,equals 不一定为 true。
  • 重写 equals 不重写 hashCode,会导致在 HashMap/HashSet 中该对象无法正确工作。

三、实操代码案例 + 场景说明

场景:自定义一个 Person 类,使其能正确用于 HashSet 和打印调试。

1. 重写 toString

classPerson{Stringname;intage;// 构造方法省略@OverridepublicStringtoString(){return"Person{name='"+name+"', age="+age+"}";}}

2. 重写 equals 和 hashCode

classStudent{intid;Stringname;@Overridepublicbooleanequals(Objectobj){if(this==obj)returntrue;if(obj==null||getClass()!=obj.getClass())returnfalse;Students=(Student)obj;returnid==s.id&&Objects.equals(name,s.name);}@OverridepublicinthashCode(){returnObjects.hash(id,name);}}

3. equals 与 hashCode 契约演示

Map<Student,String>map=newHashMap<>();Students1=newStudent(1,"张三");Students2=newStudent(1,"张三");map.put(s1,"A");System.out.println(map.get(s2));// 如果 equals 和 hashCode 都重写了会输出"A"

4. getClass 示例

Objectobj="hello";System.out.println(obj.getClass().getName());// java.lang.String

四、避坑要点

错误/误区后果正确做法
重写 equals 时忘了先判断this == obj性能略低,但功能正常加上if (this == obj) return true;
equals 参数写成具体类(如equals(Student s)这是重载,不是重写,多态失效参数必须是Object obj
hashCode 返回常数值哈希表退化为链表,性能极差使用Objects.hash()或组合字段哈希
使用Objects.equals(a, b)代替a.equals(b)前者 null 安全,后者可能 NPE不确定是否为 null 时用Objects.equals

五、面试高频考点

Q1:为什么重写 equals 必须重写 hashCode?

保证在哈希集合中,equals 相等的对象有相同的哈希桶位置,否则会导致重复元素或无法找到。

Q2:Object 类中的clone()为什么是 protected?

设计上希望由子类决定是否支持克隆(通过实现 Cloneable 接口),并重写为 public。

Q3:finalize()方法有什么问题?

执行时机不确定,且可能导致对象复活,自 Java 9 起已废弃,推荐使用Cleaner或 try-with-resources。

六、练习题

  1. 写一个Point类,重写 equals 和 toString。
  2. 解释:String s1 = "abc"; String s2 = new String("abc"); s1 == s2 的结果?s1.equals(s2) 的结果?
  3. 如果不重写 hashCode,将对象放入 HashMap 会出现什么问题?写代码验证。

📊 你的学习进度

  • 当前:第21篇 / 共44篇 ·第三阶段:字符串、Buffer、枚举、类加载(第21~25篇)
  • ✅ 已完成:第1~20篇
  • 📖 正在学:第21篇
  • ⏳ 待学习:第22~44篇

👉 📚 完整目录 & 学习指南 | 🔥 订阅本专栏,不错过每一篇

💡 本专栏每篇都包含:避坑表 + 面试高频考点 + 练习题。每天30分钟,100天拿offer!


下一篇文章预告

《Java字符串简介》

内容简介:String的不可变性、字符串常量池、StringBuilder与StringBuffer的区别、拼接效率对比。

💡 学完这篇,你将彻底掌握字符串的使用,面试再问“String为什么不可变”轻松回答。

📌《Java 100 天进阶之路 | 从入门到上岗就业》每天一篇,建议收藏 + 关注,一起100天拿offer!
👉 点击关注我,更新后第一时间收到推送!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/25 13:09:58

通过用量看板清晰观测Taotoken的API调用成本与消耗

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 通过用量看板清晰观测Taotoken的API调用成本与消耗 对于将大模型能力集成到产品中的团队而言&#xff0c;API调用成本是项目预算与…

作者头像 李华
网站建设 2026/5/25 13:08:16

Java 第三章第四章 案例教程

Java 第三章&第四章 案例教程 说明:本教程承接前两章,深入讲解面向对象核心特性与常用类。第三章聚焦继承、多态、抽象类、接口;第四章讲解异常处理、常用类(String、StringBuilder、ArrayList、Math、日期时间)。通过“图形绘制系统”和“学生信息管理系统”实战串联…

作者头像 李华
网站建设 2026/5/25 13:04:01

百叶窗结构设计优化,减少噪声

&#x1f393;作者简介&#xff1a;科技自媒体优质创作者 &#x1f310;个人主页&#xff1a;莱歌数字-CSDN博客 211、985硕士&#xff0c;从业16年 从事结构设计、热设计、售前、产品设计、项目管理等工作&#xff0c;涉足消费电子、新能源、医疗设备、制药信息化、核工业等…

作者头像 李华
网站建设 2026/5/25 13:03:23

024、NPU指令集架构(ISA)概述:从CISC到VLIW

024、NPU指令集架构(ISA)概述:从CISC到VLIW 去年冬天调试一块国产NPU芯片的卷积算子,跑ResNet-50前向推理,死活比理论算力低了一个数量级。抓了三天波形,最后发现是指令发射槽的冲突——两条MAC指令争同一个数据总线,硬件自动插入三个空泡周期。那一刻我盯着逻辑分析仪…

作者头像 李华
网站建设 2026/5/25 13:03:01

单向晶闸管开关电路基础知识及Multisim电路仿真

目录 2.1.3 单向晶闸管开关电路 2.1.3.1 单向晶闸管开关电路基础知识 一、电路结构与核心元件 二、工作原理详解 三、核心特性与关键要点 四、常见应用场景 五、关断方式说明 2.1.3.2 单向晶闸管开关电路Multisim电路仿真 一、初始状态:晶闸管关断(第 1 个电路) 二…

作者头像 李华