Object类
Java.java.lang包下的核心类,Object类是所有类的父类,任何一个类如果没有明确的继承一个父类的话,那么它就是Object的子类;IDEA中点两下shift方法看object类。
Object 提供9种方法(Clone、equals、 hashcode、wait、notify、notifyall、finalize、toString、getClass)
equals 方法和 hashCode 方法是 Object 类中的两个基础方法,它们共同协作来判断两个对象是否相等。 equals()方法用于比较两个对象是否相等。根据默认实现,它比较的是对象的引用是否相等,即比较两个对象是否是同一个实例。但是,通常情况下,我们需要根据对象的属性来确定它们是否相等,因此,我们需要重写equals()方法
hashCode 方法
hash code是一种编码方式,在Java中,每个对象都会有一个hashcode,Java可以通过这个hashcode来识别一个对象。hashtable等结构,就是通过这个哈希实现快速查找键对象。返回值是int类型的散列码。
User user = new User();
int userHashCode = user.hashCode();
System.out.println(userHashCode);
equals方法
equals(Object obj) public boolean equals(Object obj);
用于比较对象是否相等,可通过重写equals()获取不同效果。返回布尔类型的值。
如果需要重写equals方法,应该重写hashcode方法.原生equals是比较对象是否相同,hashcode内存地址换算出来的一个值,如果只重写equals方法,而不重写hashCode方法的话,就回出现因为equals()两个对象相同,但是原先的hashCode()对应的值不同
要实现equals()和hashCode()方法,你可以按照以下步骤进行操作:
- 重写equals()方法:
- 确定你希望用于比较相等性的属性,这些属性应该包括在equals()方法的比较中。
- 检查是否比较的是同一个对象,如果是,直接返回true。
- 检查对象是否为null,或者是否是与你的类不兼容的类型,如果是,返回false。
- 使用instanceof关键字检查两个对象是否属于同一类。
- 将对象强制转换为你的类类型。
- 逐个比较对象的属性,如果所有属性都相等,返回true,否则返回false。
- 重写hashCode()方法:
- 定义一个hashCode变量,并初始化为一个非零奇数。
- 对每个参与equals()比较的属性,计算它们的哈希码并结合到hashCode变量中,可以使用Objects类的hash()方法或者自定义方式。
- 返回计算得到的hashCode变量。
下面是一个示例,展示了如何在一个简单的Person类中实现equals()和hashCode()方法:
import java.util.Objects;
public class Person {
private String name;
private int age;
// 构造函数、getter和setter方法省略
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return age == person.age &&
Objects.equals(name, person.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
public class User {
private String name;
public User(String name) {
this.name = name;
}
// 重写equals
@Override
public boolean equals(Object o) {
if (o instanceof User) {
User u = (User) o;
if (this.name.equals(u.name)) return true;
else return false;
} else {
return false;
}
}
}
public class Main {
public static void main(String[] args) {
User u1 = new User("张三");
User u2 = new User("张三");
System.out.println(u1.equals(u2));
System.out.println(u1.hashCode());
System.out.println(u2.hashCode());
}
}
打印输出:
true
23934342
22307196
toString方法
public String toString(); 其返回值是String类型,返回类名和它 的引用地址。可以通过重写toString(),在打印对象时获得理想的格式。
User user = new User();
user.setRealName("张三");
user.setEmail("zhangsan@163.com");
System.out.println(user);
重写toString前:
打印输入:
org.xinhua.entity.User@bdf5e5 // 输入的是类名+地址
重写toString:
@Override
public String toString() {return "获取到的姓名是:" + this.getRealName() + ",邮箱是:" + this.getEmail(); }
打印输出:
获取到的姓名是:张三,邮箱是:zhangsan@163.com