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


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

    它里面有11个方法:

    1. //用于返回当前运行时对象的 Class 对象,使用了 final 关键字修饰,故不允许子类重写
    2. public final native Class getClass()
    3. //用于返回对象的哈希码
    4. public native int hashCode()
    5. //用于比较 2 个对象的内存地址是否相等,String 类对该方法进行了重写以用于比较字符串的值是否相等
    6. public boolean equals(Object obj)
    7. //用于创建并返回当前对象的一份拷贝
    8. protected native Object clone() throws CloneNotSupportedException
    9. //返回类的名字实例的哈希码的 16 进制的字符串。建议 Object 所有的子类都重写这个方法。
    10. public String toString()
    11. //final方法不能重写。唤醒一个正在等待的线程,如果有多个线程在等待只会任意唤醒一个
    12. public final native void notify()
    13. //native 方法,并且不能重写。跟 notify 一样,唯一的区别就是会唤醒在此对象监视器上等待的所有线程,而不是一个线程
    14. public final native void notifyAll()
    15. //final方法,所以不能重写。暂停线程的执行。注意:sleep 方法没有释放锁,而 wait 方法释放了锁 //timeout 是等待时间
    16. public final native void wait(long timeout) throws InterruptedException
    17. //多了 nanos 参数,这个参数表示额外时间(以毫微秒为单位,范围是 0-999999)。所以超时的时间还
    18. //需要加上 nanos 毫秒
    19. public final void wait(long timeout, int nanos) throws InterruptedException
    20. //跟之前的2个wait方法一样,只不过该方法一直等待,没有超时时间这个概念
    21. public final void wait() throws InterruptedException
    22. //实例被垃圾回收器回收的时候触发的操作
    23. protected void finalize() throws Throwable { }

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

    1.equals方法

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

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

    Object类中的equals方法:

    1. public boolean equals(Object obj)
    2. {
    3. return (this == obj);
    4. }

    String类中的equals方法

    1. @Override
    2. public boolean equals(Object anObject)
    3. {
    4. if (this == anObject)
    5. {
    6. return true;
    7. }
    8. if (anObject instanceof String) {
    9. String anotherString = (String)anObject;
    10. int n = value.length;
    11. if (n == anotherString.value.length) {
    12. char v1[] = value;
    13. char v2[] = anotherString.value;
    14. int i = 0;
    15. while (n-- != 0) {
    16. if (v1[i] != v2[i])
    17. return false;
    18. i++;
    19. }
    20. return true;
    21. }
    22. }
    23. return false;
    24. }

    2.hashcode方法

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

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

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

    对象加入到HashSet中的过程:

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

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

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

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

    总结:

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

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

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

    其他方法:

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

     4.clone()方法

  • 相关阅读:
    三角换元积分法
    Tomcat最大并发数及在线用户数
    自动控制原理《线性系统的时域分析》
    XML十六进制无效的字符(0x0b 0x0c 0x02)
    Starlink全系卫星详细介绍,波段频谱、激光星间链路技术、数据传输速率等等
    计算机毕业设计Java航空售票系统(源码+系统+mysql数据库+lw文档)
    为什么要把ip和mac地址绑定
    小白都能看懂得Xxl-job安装教程
    LeetCode 15. 三数之和(C++)
    SSL_CTX_use_certificate:ca md too weak
  • 原文地址:https://blog.csdn.net/weixin_47414034/article/details/127087228