a==b
和a.equals(b)
有什么区别?先说结论:
如果 a 和 b 都是对象,则 a==b 是比较两个对象的引用,只有当 a 和 b 指向的是堆中的同一个对象才返回 true。
而 a.equals(b) 是进行逻辑比较,当内容相同时,返回true,所以通常需要重写该方法来提供逻辑一致性的比较。
a==b
和a.equals(b)
在比较对象时有着不同的作用。
当使用
a==b
进行比较时,它实际上比较的是两个对象的引用。也就是说,它检查的是两个对象是否指向内存中的同一个地址。只有当a
和b
指向的是堆中的同一个对象时,a==b
才会返回true
。例如:String a = new String("hello"); String b = new String("hello"); System.out.println(a == b); // false,a 和 b 指向不同的对象
虽然值相同,但不是指向同一个引用,所以为
false
而当使用
a.equals(b)
进行比较时,它实际上比较的是两个对象的内容。也就是说,它会调用对象的equals
方法来进行逻辑比较。通常情况下,需要重写equals
方法来提供逻辑一致性的比较。例如:public class Person { private String name; private int age; // 省略构造方法和其他代码 @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null || getClass() != obj.getClass()) { return false; } Person person = (Person) obj; return age == person.age && Objects.equals(name, person.name); } } Person p1 = new Person("Alice", 25); Person p2 = new Person("Alice", 25); System.out.println(p1.equals(p2)); // true,p1 和 p2 的内容相同
PS:需要注意的是,当重写 equals
方法时,通常也需要重写 hashCode
方法,以确保对象在放入哈希表等数据结构时能够正确工作。
评论区