Java Object 类笔记
在 Java 的世界里Object类是一切类的始祖。理解它的核心方法掌握String及其相关类的特性是每一个 Java 开发者从入门到精通的必经之路。本文将系统地梳理 Object 类的 11 个核心方法深入探讨equals与hashCode的约定并全面对比String、StringBuffer与StringBuilder的区别。一、Object 类有哪些核心方法JavaObject类是所有类的超类默认提供 11 个核心方法涵盖了对象比较、哈希、字符串表示、线程同步等方面。1.equals(Object obj)作用比较两个对象是否相等。说明默认实现比较内存地址与相同。实际开发中通常需要重写按对象的内容如字段值判断相等性。2.hashCode()作用返回对象的哈希码值。说明与equals配套使用。若两个对象equals返回true则hashCode必须相等若hashCode不等则equals必为false。如果只重写equals不重写hashCode会导致对象在HashMap、HashSet等集合中无法正确存储。3.toString()作用返回对象的字符串表示。说明默认格式为“类名 对象的十六进制哈希码”如User1b6d3586可读性差。通常重写为返回对象的具体信息便于日志打印和调试。4.getClass()作用返回对象运行时的实际类对象。说明final方法不可重写。常用于反射获取类的名称、方法、字段等信息也可用于运行时类型检查。5.clone()作用创建并返回对象的一个副本。说明用于对象的浅拷贝。使用clone需要实现Cloneable接口否则抛出CloneNotSupportedException。6.notify()作用随机唤醒一个等待当前对象锁的线程。说明必须在同步块中使用。7.notifyAll()作用唤醒所有等待当前对象锁的线程。说明必须在同步块中使用。8.wait()作用让当前线程释放对象锁并进入等待状态直到被notify/notifyAll唤醒。说明必须在同步块中调用通常放在循环中检查等待条件以避免“虚假唤醒”。9.wait(long timeout)作用让当前线程等待指定的毫秒数超时后自动唤醒。说明timeout为 0 表示无限等待。10.wait(long timeout, int nanos)作用提供更精确的时间控制毫秒 纳秒。说明实际超时时间可能受系统调度影响。11.finalize()作用垃圾回收器回收对象前调用用于执行清理工作。说明已过时Deprecated since Java 9。执行时机不确定可能影响性能甚至导致对象复活。替代方案是使用try-with-resources或PhantomReference。二、 与 equals 有什么区别对于基本数据类型比较的是值是否相同对于引用数据类型比较的是引用地址是否相同。equals()不能用于基本数据类型。Object类中的equals()默认使用比较地址。但String类重写了equals()方法先比较地址地址不同则比较内容是否相同。三、为什么重写 equals 方法时必须重写 hashCode 方法在 Java 中equals和hashCode遵循以下约定一致性如果obj1.equals(obj2)返回true那么obj1.hashCode()必须等于obj2.hashCode()。非一致性如果两个对象的hashCode相同equals不一定为true哈希冲突。如果不重写hashCode可能导致对象在哈希集合如HashMap、HashSet中无法正确存储。例如两个id相同的User对象equals返回true但hashCode不同会被当成两个不同元素存入集合。四、Java 中 String 的常用方法有哪些int length()返回字符串长度。boolean equals(Object obj)比较字符串内容是否相同区分大小写。String substring(int beginIndex)从指定索引开始截取子串。String trim()去除字符串首尾空白字符。String replace(char oldChar, char newChar)替换所有指定字符。boolean isEmpty()判断字符串长度是否为 0注意null调用会报错。五、String、StringBuffer、StringBuilder 的区别与联系1. 可变性String不可变Immutable每次修改都会生成新对象。StringBuilder / StringBuffer可变Mutable可直接修改内容。2. 线程安全性String天然线程安全。StringBuilder非线程安全适合单线程。StringBuffer线程安全方法使用synchronized适合多线程。3. 性能String性能最低频繁修改会产生大量临时对象。StringBuilder性能最高无同步开销。StringBuffer性能略低于StringBuilder因有同步开销。4. 使用场景String字符串内容固定或变化少。StringBuilder单线程下频繁修改字符串。StringBuffer多线程下频繁修改字符串。特性StringStringBufferStringBuilder不可变性不可变可变可变线程安全是是否性能低中高适用场景少量修改多线程单线程六、String 为什么是不可变的因为String底层使用final修饰的char[]数组存储字符。数组本身不可变且String类没有提供修改数组内容的方法所有“修改”操作都会返回新对象。Java Object 类深度解析这种设计带来了线程安全、字符串常量池复用、哈希值缓存等好处。总结Object类是 Java 的根类掌握其核心方法是理解 Java 面向对象的基础。equals和hashCode的约定是哈希集合正确工作的关键。String、StringBuilder、StringBuffer的选择直接影响程序性能和线程安全性。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2414284.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!