第四篇文章:Object类(equals方法和hashcode方法)

Object类是所有类的父类,这意味着所有类都会具有Object类里面的方法

它里面有11个方法:

//用于返回当前运行时对象的 Class 对象,使用了 final 关键字修饰,故不允许子类重写
public final native Class getClass()

//用于返回对象的哈希码
public native int hashCode()

//用于比较 2 个对象的内存地址是否相等,String 类对该方法进行了重写以用于比较字符串的值是否相等
public boolean equals(Object obj)

//用于创建并返回当前对象的一份拷贝
protected native Object clone() throws CloneNotSupportedException

//返回类的名字实例的哈希码的 16 进制的字符串。建议 Object 所有的子类都重写这个方法。
public String toString()

//final方法不能重写。唤醒一个正在等待的线程,如果有多个线程在等待只会任意唤醒一个
public final native void notify()

//native 方法,并且不能重写。跟 notify 一样,唯一的区别就是会唤醒在此对象监视器上等待的所有线程,而不是一个线程
public final native void notifyAll()

//final方法,所以不能重写。暂停线程的执行。注意:sleep 方法没有释放锁,而 wait 方法释放了锁 //timeout 是等待时间
public final native void wait(long timeout) throws InterruptedException

//多了 nanos 参数,这个参数表示额外时间(以毫微秒为单位,范围是 0-999999)。所以超时的时间还
//需要加上 nanos 毫秒
public final void wait(long timeout, int nanos) throws InterruptedException

//跟之前的2个wait方法一样,只不过该方法一直等待,没有超时时间这个概念
public final void wait() throws InterruptedException

//实例被垃圾回收器回收的时候触发的操作
protected void finalize() throws Throwable { }

这里主要介绍两个方法:equals方法和hashcode方法

1.equals方法

Object类中的equals方法比较的是对象的内存地址

String类中的equals方法重写了,比较的是对象的值(只要值相等即可,不用内存地址相同)

Object类中的equals方法:

public boolean equals(Object obj) 
{
     return (this == obj);
}

String类中的equals方法

@Override
public boolean equals(Object anObject)
{
    if (this == anObject) 
    {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

2.hashcode方法

hashcode()方法返回的是一个整数,叫做哈希码或者散列码

所以说每个对象都有一个哈希值

相等的两个对象散列值一定相等,但是散列值相同的两个对象不一定相等

对象加入到HashSet中的过程:

将对象加入HashSet的时候,HashSet会计算出对象的hashcode值,以此来判断对象加入的位置,

同时会和其他已经加入的对象的hashcode值作比较,

如果没有相等的hashcode值,HashSet会假设这个对象之前没有出现过

如果有相等的hashcode值,HashSet会通过equals方法来进一步判断这两个hashcode值相等的对象是否真的相同(这样可以大大减少equals的次数,大大提高执行速度,也就是说有了hashcode方法,判断元素是否在容器内的效率会更高)

总结:

对象相等,哈希值一定相等,而且equals()方法比较这两个对象返回结果是true

如果两个对象哈希值相等,两个对象不一定相等

如果两个对象哈希值不相等,两个对象一定不相等

其他方法:

3.toString()方法:返回值的形式是类名@这个对象的散列码的无符号十六进制表示

 4.clone()方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值