面试题——Object 都有哪些方法详细描述

  • getClass()
    • final方法,获得运行时类型;

  • hashCode()
    • 该方法用于哈希查找,可以减少在查找中使用equals的次数,重写equals方法一般都要重写hashCode()
  • equals(bject obj)
    • Object源码中使用的是==,即比较地址相等

    • 引申
      ==和equals的区别:

      ==:基本数据类型,直接对值进行比较;引用数据类型,对地址进行比较;遇到运算法才会自动拆箱;
      equals:类未复写equals方法,则使用equals方法比较两个对象时,相当于==比较; 复写equals方法,比较两个对象时,则走复写之后的判断方式

    public static void main(String args[]){
        Integer a = 1;
        Integer b = 2;
        Integer c = 3;
        Integer d = 3;
        Integer e = 200;
        Integer f = 200;
        Long g = 3L;
        int x = 3;
        long y = 3L;
        // 虽然x和y的类型不同,但可以进行直接比较
        System.out.println(x==y);//true
        //Error:(26, 30) java: 不可比较的类型: java.lang.Integer和java.lang.Long
       // System.out.println((c == g));
       //[-128,127]之间,可以自动拆箱
        System.out.println(c == d);//true
        //[-128,127]外的,不能进行自动拆箱,相当于两个对象==
        System.out.println(e==f);//false
        System.out.println(e.intValue() == f.intValue());//true
        
        System.out.println(c==(a+b));//true
        System.out.println(c.equals(a+b));//true
         //遇到运算符+,自动拆箱
        System.out.println(g==(a+b));//true
        System.out.println(g.equals(a+b));//false
    }
    

关于hashCode与equals
对于两个对象,如果调用equals方法得到的结果为true,那么两个对象的hashCode值必定相等;
如果equals方法得到的结果为false,则两个对象的hashCode不一定不相等;
如果两个对象的hashcode值不相等,则equals方法得到的结果必定为false;
如果两个对象的hashcode值相等,equals方法得到的结果未知。


  • clone()
    • protected native修饰
    • 实现对象的浅复制,只有实现了Cloneable接口[Cloneable接口是不包含任何方法的!其实这个接口仅仅是一个标志]才可以调用该方法,直接调用Object.clone方法会抛出异常CloneNotSupportedException异常
  • toString()
    • 一般子类都有该方法,也可自己重写
  • notify()
    • 唤醒在该对象上等待的某个线程
  • notifyAll()
    • 唤醒该对象上所有等待的线程
  • wait()
    • 使当前线程等待该对象的锁,当前线程必须是该对象的拥有者;
    • 当前线程会一直等待,知道获得锁或者被中断;
    • wait(long timeout):设定一个超时间隔,若在规定的时间内没有获得锁就返回
  • finalize()
    • 释放资源;
    • 不能直接调用该方法:该方法在垃圾回收的时候一定会被执行,若在此之前被执行的话,第一次已经释放掉资源,那么第二次释放资源的时候就会报错,所以finalize方法的访问权限和父类保持一致,为protected
      public :同一个类、同一个包、子类、不同包都可访问;
      protected:同一个类、同一个包、子类
      private:同一个类
      default:同一类、同一个包可访问
package java.lang;

public class Object {

    private static native void registerNatives();
    static {
        registerNatives();
    }

    public final native Class<?> getClass();

    public native int hashCode();

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

    protected native Object clone() throws CloneNotSupportedException;

    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

    public final native void notify();

    public final native void notifyAll();

    public final native void wait(long timeout) throws InterruptedException;

    public final void wait(long timeout, int nanos) throws InterruptedException {
        if (timeout < 0) {
            throw new IllegalArgumentException("timeout value is negative");
        }

        if (nanos < 0 || nanos > 999999) {
            throw new IllegalArgumentException(
                                "nanosecond timeout value out of range");
        }

        if (nanos > 0) {
            timeout++;
        }

        wait(timeout);
    }

    public final void wait() throws InterruptedException {
        wait(0);
    }
    protected void finalize() throws Throwable { }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值