Object 类是所有类的超类,默认提供 11 个核心方法,核心用于对象比较、哈希、字符串表示、线程同步等。
Object类的常用方法
-
equals 方法
equals 方法,它的默认实现是比较两个对象的内存地址,也就是和 == 的效果一样,但实际开发中我们常需要按对象的内容比较,比如两个用户对象只要 id 相同就认为相等,这时候就需要重写 equals。
和 equals 配套的必须重写 hashCode 方法,因为 Java 的约定是如果两个对象 equals 返回 true,它们的 hashCode 必须相等;如果 hashCode 不相等,equals 一定返回 false。如果只重写 equals 不重写 hashCode,会导致对象在 HashMap HashSet 等集合中无法正确存储,比如两个 id 相同的 User 对象,equals 返回 true,但 hashCode 不同,会被当成两个不同元素存入集合。
package Object;
public class Equals {
private int id;
private String name;
public static void main(String[] args) {
Equals u1 = new Equals();
Equals u2 = new Equals();
System.out.println(u1.equals(u2));
//u1u2都是默认初始化对象,id为0,所以输出true
String s1 = "Tom";
String s2 = "Tom";
System.out.println(s1.equals(s2)); //输出true
//String 类已经重写了 equals 方法,使用时不需要重写
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Equals user = (Equals) obj;
return id == user.id;
//equals()方法重写比较对象id是否相等
}
@Override
public int hashCode() {
return Integer.hashCode(id);
}
}
== 与 equals 有什么区别?
关于==运算符
如果你比较的是基本数据类型(比如 int、double),那它就直接比数值是不是相等
但如果你比较的是对象(引用类型),则比较这两个变量是不是指向内存中同一个对象,也就是地址是否相同。
== 是比较引用地址,适合用来判断两个变量是不是指向同一个对象;
equals 是比较对象内容,但前提是这个类重写了 equals 方法(比如 String),如果没重写,那它俩效果是一样的。
hashcode和equals方法有什么关系?
在 Java 中,对于重写 equals 方法的类,通常也需要重写 hashCode 方法,并且需要遵循以下规定:
• 一致性:如果两个对象使用 equals 方法比较结果为 true,那么它们的 hashCode 值必须相同。也就是说,如果 obj1.equals(obj2) 返回 true,那么 obj1.hashCode() 必须等于 obj2.hashCode()。
• 非一致性:如果两个对象的 hashCode 值相同,它们使用 equals 方法比较的结果不一定为 true。即 obj1.hashCode() == obj2.hashCode() 时,obj1.equals(obj2) 可能为 false,这种情况称为哈希冲突。
hashCode 和 equals 方法是紧密相关的,重写 equals 方法时必须重写 hashCode 方法,以保证在使用哈希表等数据结构时,对象的相等性判断和存储查找操作能够正常工作。而重写 hashCode 方法时,需要确保相等的对象具有相同的哈希码,但相同哈希码的对象不一定相等。
-
toString 方法
toString 方法,默认返回类名加 @加对象的哈希码十六进制表示,比如 User@1b6d3586,可读性很差。实际开发中重写它是为了返回对象的具体信息,方便日志打印和调试
@Override
public String toString() {
return User id: + id + name: + name;
}
-
getClass 方法
getClass 方法,它返回对象运行时的实际类对象,和编译时类型可能不同,而且这个方法不能重写。比如父类 Animal 的子类 Dog,Animal animal = new Dog,animal.getClass 返回的是 Dog 的类对象,常用于反射场景,比如通过 getClass 获取类的属性和方法:
Animal animal = new Dog();
Class<?> clazz = animal.getClass();
System.out.println(clazz.getName()); // 输出Dog
-
clone 方法
clone 方法,用于创建对象的浅拷贝,默认是浅拷贝意味着如果对象有引用类型属性,拷贝后的对象和原对象会共享该引用属性。使用 clone 需要让类实现 Cloneable 接口,否则会抛出 CloneNotSupportedException
class Product implements Cloneable {
private String name;
private double price;
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
-
notify方法
用于多线程同步的,和 synchronized 配合使用,作用是唤醒等待当前对象锁的线程。notify 是随机唤醒一个等待线程
-
notifyAll 方法
用于多线程同步的,和 synchronized 配合使用,作用是唤醒等待当前对象锁的线程,notifyAll 是唤醒所有等待线程,比如生产者消费者模式中,生产者生产完数据后调用 notifyAll,唤醒等待的消费者线程。
-
wait 方法
wait 方法有三个重载,作用是让当前持有对象锁的线程释放锁并进入等待状态,直到被 notify notifyAll 唤醒或者等待时间到期。同样需要在 synchronized 同步块或方法中使用,否则会抛 IllegalMonitorStateException
-
finalize 方法
finalize 方法,它是对象被垃圾回收器回收前会调用的方法,默认是空实现。但现在基本不推荐使用,因为它的执行时机不确定,可能很久才执行甚至不执行,而且可能导致对象复活,影响垃圾回收效率,Java9 之后已经标记为过时,替代方案是使用 try with resources 或者 PhantomReference 来处理资源释放。
string的常用方法
• 获取长度:int length():返回字符串的长度(字符个数)。例:"abc".length() → 3
• 判断内容:boolean equals(Object obj):比较两个字符串的内容是否完全相同(区分大小写)。例:"abc".equals("ABC") → false
• 截取子串:String substring(int beginIndex):从指定索引开始截取到末尾。例:"hello".substring(2) → "llo"
• 去除空格:String trim():去除字符串首尾的空白字符(空格、制表符等)。例:" abc ".trim()→ "abc"
• 替换内容:String replace(char oldChar, char newChar):替换所有指定字符。例:"aaa".replace('a', 'b') → "bbb"
• 判断空字符串:boolean isEmpty():判断字符串长度是否为 0(注意:null 调用会报错,需先判空)。





