美文网首页
面试:Object方法有哪些?

面试:Object方法有哪些?

作者: Android_冯星 | 来源:发表于2020-04-27 22:47 被阅读0次
    image.png

    registerNatives

    getClass()

    可以返回这个实体的Class对象,可以用来获得这个类的元数据。在反射中经常使用。

    clone方法

    被用来拷贝一个新对象。在Java中使用等号只是拷贝对象的引用并不是对象,需要拷贝对象的时候,可以借助clone方法。

    toString方法

    toString提供对象的字符串表示形式。

    类Object的默认toString()方法返回一个字符串,该字符串包括该对象的类名称,"@"字符以及该对象的哈希码的无符号十六进制表示形式。

    例如:
    Student@4554617c
    
    

    hashCode方法

    hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。

    对于每个对象,JVM都会生成一个唯一的数字,即哈希码。它为不同的对象返回不同的整数。
    针对上面的toString方法的演示代码中,添加一个hashcode方法,指定对象的哈希码。

    @Override
        public int hashCode() {
            return 200;
        }
    

    打印的结果将为:

    Student@c8
    

    其中c8是16进制表示,转化为10进制就是12 * 16 + 8 = 200,正好是hashcode的返回值。

    equals方法

    被用来比较两个对象是否相等。在重写equals的时候也需要重写hashCode方法。

    HashMap和Hashset中判断两个对象是否相等,首先比较hashCode,如果hashCode相等才回执行equals方法。

    finalize方法

    这个方法在垃圾回收之前被执行,可以通过重写finalize方法来重置系统资源,执行清理活动并且最大程度的减少内存泄露。

    wait方法

    调用线程放弃锁并且进入睡眠状态,直到其他线程进入同一个monitor并且执行notify唤醒线程。

    notify,notifyAll 方法

    和wait相反,用于唤醒线程。

    衍生的面试题

    为什么重写了equals就必须重写hashCode

    equals()相等的两个对象,hashcode()一定相等;

    equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。
    换句话说,equals()方法不相等的两个对象,hashcode()有可能相等。(我的理解是由于哈希码在生成的时候产生冲突造成的)。

    wait()方法与sleep()方法的区别

    • 这两个方法来自不同的类分别是Thread和Object

    • 最主要是sleep方法没有释放锁,而wait方法释放了锁

    equals() 的作用是什么?

    equals() 的作用是 用来判断两个对象是否相等。

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

    既然Object.java中定义了equals()方法,这就意味着所有的Java类都实现了equals()方法,所有的类都可以通过equals()去比较两个对象是否相等。 但是,我们已经说过,使用默认的“equals()”方法,等价于“==”方法。因此,我们通常会重写equals()方法:若两个对象的内容相等,则equals()方法返回true;否则,返回fasle。

    下面根据“类是否覆盖equals()方法”,将它分为2类。

    • (01) 若某个类没有覆盖equals()方法,当它的通过equals()比较两个对象时,实际上是比较两个对象是不是同一个对象。这时,等价于通过“==”去比较这两个对象。
    • (02) 我们可以覆盖类的equals()方法,来让equals()通过其它方式比较两个对象是否相等。通常的做法是:若两个对象的内容相等,则equals()方法返回true;否则,返回fasle。

    equals() 与 == 的区别是什么?

    ==
    • 若操作数的类型是基本数据类型,则该关系操作符判断的是左右两边操作数的值是否相等
    • 若操作数的类型是引用数据类型,则该关系操作符判断的是左右两边操作数的内存地址是否相同。也就是说,若此时返回true,则该操作符作用的一定是同一个对象
    equals() :

    在Object类中,equals方法是用来比较两个对象的引用是否相等,即是否指向同一个对象。

    但是一般像String就重写了equels方法,重写规则:

    • 先 比较引用是否相同(是否为同一对象),
    • 再 判断类型是否一致(是否为同一类型),
    • 最后 比较内容是否一致
    equals 重写原则

    对象内容的比较才是设计equals()的真正目的,Java语言对equals()的要求如下,这些要求是重写该方法时必须遵循的:

    • 对称性: 如果x.equals(y)返回是“true”,那么y.equals(x)也应该返回是“true” ;

    • 自反性: x.equals(x)必须返回是“true” ;

    • 类推性: 如果x.equals(y)返回是“true”,而且y.equals(z)返回是“true”,那么z.equals(x)也应该返回是“true” ;

    • 一致性: 如果x.equals(y)返回是“true”,只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是“true” ;

    任何情况下,x.equals(null)【应使用关系比较符 ==】,永远返回是“false”;x.equals(和x不同类型的对象)永远返回是“false”

    hashCode() 和 equals()

    • 原则 1 : 如果 x.equals(y) 返回 “true”,那么 x 和 y 的 hashCode() 必须相等 ;

    • 原则 2 : 如果 x.equals(y) 返回 “false”,那么 x 和 y 的 hashCode() 有可能相等,也有可能不等 ;

    • 原则 3 : 如果 x 和 y 的 hashCode() 不相等,那么 x.equals(y) 一定返回 “false” ;

    • 原则 4 : 一般来讲,equals 这个方法是给用户调用的,而 hashcode 方法一般用户不会去调用 ;

    • 原则 5 : 当一个对象类型作为集合对象的元素时,那么这个对象应该拥有自己的equals()和hashCode()设计,而且要遵守前面所说的几个原则。

    hashcode是系统用来快速检索对象而使用

    相关文章

      网友评论

          本文标题:面试:Object方法有哪些?

          本文链接:https://www.haomeiwen.com/subject/mqxpwhtx.html