《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

java 复制代码
class Person {
    String name;
    int age;
    // 构造方法省略
    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + "}";
    }
}

2. 重写 equals 和 hashCode

java 复制代码
class Student {
    int id;
    String name;
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Student s = (Student) obj;
        return id == s.id && Objects.equals(name, s.name);
    }
    
    @Override
    public int hashCode() {
        return Objects.hash(id, name);
    }
}

3. equals 与 hashCode 契约演示

java 复制代码
Map<Student, String> map = new HashMap<>();
Student s1 = new Student(1, "张三");
Student s2 = new Student(1, "张三");
map.put(s1, "A");
System.out.println(map.get(s2)); // 如果 equals 和 hashCode 都重写了会输出"A"

4. getClass 示例

java 复制代码
Object obj = "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!

👉 点击关注我,更新后第一时间收到推送!

相关推荐
元界metalite7 分钟前
SpringBoot分页接口怎么设计-pageSize不设上限会发生什么
后端
IKUN家族28 分钟前
SpringBoot日志
java·开发语言
迷迭香yy30 分钟前
Python构建转融券多空识别系统从接口到因子的全流程 IG50免费开源股票数据API接口
开发语言·python·开源
格林威36 分钟前
C#图像快速剪切:使用OpenCvSharp和Halcon优化图像剪切和CPU占用
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
DianSan_ERP41 分钟前
WMS接入电商平台自动化履约实战:一张订单从平台到出库的接口时序设计
java·前端·网络·数据库·安全·架构·自动化
liangsheng_g1 小时前
微服务本地开发零配置隔离方案
java·微服务·架构
知识分享小能手1 小时前
概理论与数理统计学习教程,从入门到精通,在数理统计中应用R软件(22)
开发语言·学习·r语言
不服老的小黑哥1 小时前
六、集合处理(collections.md)
java
IT爱学堂1 小时前
Go开发疑难杂症终结者通关指南
后端
乐观勇敢坚强的老彭1 小时前
C++信奥GESP四级的常见题型和解题模板速查表
开发语言·c++