Java中Object类(内含两个面试题)

Object类中常用的方法:

返回值类型方法名作用

protected Object

clone()创建并返回此对象的一个副本
booleanequals(Object obj)指示某个其它对象是否与此对象“相等”
protected voidfinalize()

但垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法

Class<?extends Object>getClass()返回一个对象的运行时类
inthashCode()返回一个对象的哈希码值
voidnotify()唤醒在此对象监视器上等待的单个线程
voidnotifyAll()唤醒在此对象监视器上等待的所有线程
StringtoString()返回该对象的字符串表示
voidwait()

导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。

voidwait(long timeout)

导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量。

voidwait(long timeout,int nanos)

导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。

1. toString

先看这个案例:

package tt;

public class Person {
	 public String name;
	 public int age;
	 public Person(String name,int age){
		 this.name=name;
	     this.age=age;
	    }
}



package tt;

public class Test {

	public static void main(String[] args) {
		 Person p=new Person("小明",99);
	     System.out.println(p);
	}

}

执行结果:

 通过这个案例,发现了一个问题:为什么打印p的结果会是这么一段字符串?

然后通过查看源码的方式,弄明白了这个逻辑。

public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }

这个println方法里的第一行源码调用了String类的valueOf方法,

public static String valueOf(Object obj) {
        return (obj == null) ? "null" : obj.toString();
    }

而通过读这一段源码发现最后是会调用Object类的toString方法,

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

这个toString方法里所返回的就是最后打印p出来的结果。我们可以把它理解成一个“地址”。

接下来通过在Person类里重写toString方法,看一下运行结果。

package tt;

public class Person {
	 public String name;
	 public int age;
	 public Person(String name,int age){
		 this.name=name;
	     this.age=age;
	    }
     public String toString() {
		 return "姓名:" + name +"\t"+ "年龄:" + age ;
	}
}



package tt;

public class Test {

	public static void main(String[] args) {
		 Person p=new Person("小明",99);
	     System.out.println(p);
	}

}

 这就说明了在打印p的时候默认调用了Object类里的toString方法。若是在Person类里重写toString方法,则在打印p的时候会先调用重写的toString方法。

2. equals和==之间的区别

1.对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;

如果作用于引用类型的变量,则比较的是所指向的对象的地址

2.对于equals方法,注意:equals方法不能作用于基本数据类型的变量。

如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;

诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

3.为什么在重写hashCode方法时,要重写equals方法,两者有什么关系?

1.在hashCode方法中有那么一个约定:相同对象必须有相同哈希值。在一个类中,如果重写的equals方法,没有重写hashCode方法时,会出现equals相等,哈希值不相等。就没有遵守hashCode方法的约定。

2.通过使用hashCode方法可以提前校验,可以避免每一次比较都用equals方法从而提高效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值