Java(二十九)Object类 hashcode equals方法

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()方法,你可以按照以下步骤进行操作:

  1. 重写equals()方法:
  2. 确定你希望用于比较相等性的属性,这些属性应该包括在equals()方法的比较中。
  3. 检查是否比较的是同一个对象,如果是,直接返回true。
  4. 检查对象是否为null,或者是否是与你的类不兼容的类型,如果是,返回false。
  5. 使用instanceof关键字检查两个对象是否属于同一类。
  6. 将对象强制转换为你的类类型。
  7. 逐个比较对象的属性,如果所有属性都相等,返回true,否则返回false。
  8. 重写hashCode()方法:
  9. 定义一个hashCode变量,并初始化为一个非零奇数。
  10. 对每个参与equals()比较的属性,计算它们的哈希码并结合到hashCode变量中,可以使用Objects类的hash()方法或者自定义方式。
  11. 返回计算得到的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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛定谔的猫1981

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值