当前位置: 首页 > news >正文

Java基础Object中常见问题解析

今天复习了一下Java基础知识,以下是复习的内容:

问题1:

== 与 equals 有什么区别?

  1. == 运算符(永远比较引用):

    • 对于任何对象类型的变量(包括 String 和其他所有类), == 比较的是两个变量指向的对象在内存中的地址(引用)是否相同。它检查两个引用是否指向堆内存中的 同一个对象
    • 对于基本数据类型(intdoublecharboolean 等), == 比较的是两个变量存储的实际值是否相等。因为基本数据类型存储在栈内存中,直接包含值本身,没有引用的概念。
  2. .equals() 方法(比较内容 - 具体行为由类决定):

    • .equals() 是定义在 Object 类中的一个方法。所有Java对象都继承了这个方法。
    • 默认行为(未重写): 在 Object 类中,.equals() 的默认实现 就是使用 == 来比较引用地址!所以默认情况下,对于任何自定义类(没有重写 .equals()), obj1.equals(obj2) 和 obj1 == obj2 是完全等价的,都是比较引用地址。
    • 重写行为: 很多Java内置类(尤其是那些表示值的类)重写了 .equals() 方法 来提供“逻辑相等”或“内容相等”的比较。
      • String 类: 这正是你所理解的:str1.equals(str2) 会比较两个 String 对象包含的字符序列是否完全相同,与它们的内存地址无关
      • 包装器类 (IntegerDoubleBooleanCharacter 等): 这些类也重写了 .equals() 来比较它们包装的基本类型的值是否相等。
      • 集合类 (ListSetMap 等): 这些类通常重写 .equals() 来比较集合中的元素是否相同(顺序、数量、元素相等性)。
      • 自定义类: 默认比较引用地址。 如果你希望根据对象的某些属性(字段值)来定义两个对象是否“相等”,你必须自己重写 .equals()(和 .hashCode())方法来实现这种“内容比较”逻辑。否则,默认行为就是 ==

关键原则:

  1. == 永远比较:
    • 对象 -> 引用地址
    • 基本类型 -> 值
  2. .equals() 比较什么由对象的类决定:
    • 默认 (Object 实现) -> 引用地址 (等同于 ==)
    • 重写后 (如 String, 包装类, 集合类, 或你自定义的类) -> 内容/逻辑相等性 (具体看实现)

结论总结:

比较类型== 运算符.equals() 方法
字符串 (String)比较引用地址 (是否同一个对象)比较内容 (字符序列是否相同)
非字符串对象比较引用地址 (是否同一个对象)取决于类是否重写:<br> * 未重写 (Object 默认):比较引用地址 (等同于 ==)<br> * 已重写:比较内容/逻辑相等 (由重写逻辑决定)
基本数据类型比较值本身不适用 (基本类型不是对象,没有方法)

问题2:

hashcode和equals方法有什么关系?

强制关系(Java规范规定)

  1. 一致性

    • 如果两个对象通过equals()比较是相等的 → 它们的hashCode()必须返回相同的整数值。
    • 如果两个对象通过equals()比较是不相等的 → 它们的hashCode()不一定要不同(但不同可提升哈希表性能)。
  2. 反向不成立

    • 如果两个对象的hashCode()相同 → 它们不一定要通过equals()比较相等(哈希冲突是允许的)。
    • 如果hashCode()不同 → 对象一定不相等(可直接跳过equals()比较)。

那么为什么需要这种关系呢?

主要是为了基于哈希的集合(如 HashMap, HashSet, Hashtable)的高效运作:

  1. hashCode() 的作用

    • 快速定位对象在哈希表中的桶(bucket)。
    • 减少后续equals()调用的次数(只需比较同一桶内的对象)。
  2. equals() 的作用

    • 在哈希冲突时精确比较对象的逻辑相等性。

为了不破坏这个关系,我们必须做到:

  1. 重写equals()时必须重写hashCode()
  2. 使用相同字段:计算hashCode()的字段必须与equals()比较的字段完全一致。
  3. 保证不可变性:参与计算的字段不应在对象生命周期内改变(或避免用作哈希键)。

问题3:

简单谈一下String、StringBuffer、StringBuilder的区别和联系

特性StringStringBufferStringBuilder
可变性❌ 不可变✅ 可变✅ 可变
线程安全✅ 安全(天生不可变)✅ 安全(方法用 synchronized 修饰)❌ 不安全
性能低(频繁操作时) 较高(线程安全场景) 最高(无锁开销)
适用场景常量、不需修改的字符串多线程环境字符串操作单线程环境字符串操作

http://www.dtcms.com/a/336595.html

相关文章:

  • Redis面试精讲 Day 24:Redis实现限流、计数与排行榜
  • 数字货币的法律属性与监管完善路径探析
  • SCAI采用公平发射机制成功登陆LetsBonk,60%代币供应量已锁仓
  • SpringBoot中,接口加解密
  • C语言课程开发
  • 【前端基础】flex布局中使用`justify-content`后,最后一行的布局问题
  • Java 基础 -- Java 基础知识
  • 2025-08-17 李沐深度学习18——循环神经网络基础
  • Spring Cloud系列—Seata部署
  • 照相机标定-动手学计算机视觉16
  • easya2a: 一键将 LangChain Agent 发布为 A2A 服务
  • Matlab数字图像处理——基于BM4D压缩感知的三维图像信号重构算法
  • 知识点汇集-web
  • 第三十八天(Node.JS)
  • 【LeetCode 热题 100】(八)二叉树
  • 如何使用java写一个agent
  • 说一下分离读写
  • c_str()函数的详细解析
  • 力扣438:找到字符串中所有的字母异位词
  • ACCESS/SQL SERVER保存软件版本号为整数类型,转成字符串
  • 第13章《远程处理:一对一及一对多》——PowerShell Remoting 学习笔记
  • Windows_Server软件定义网络架构
  • MXFP4量化:如何在80GB GPU上运行1200亿参数的GPT-OSS模型
  • 编程算法实例-阶乘
  • 天地图开发的优点
  • Steam 上传游戏包体操作步骤
  • Win11 文件资源管理器预览窗格显示 XAML 文件内容教程
  • K8S集群环境搭建(一)
  • STL 容器
  • 华东师范上海AiLab商汤!NaviMaster:学习适用于GUI和具身导航任务的统一策略