学习Object类



学习Object类

Object作为一个超类,拥有11个基本方法

如下:

protected Object clone()创建并返回此对象的一个副本。 

boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。 

protected void finalize()当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。 

Class<?> getClass()返回此 Object 的运行时类。 

int hashCode()返回该对象的哈希码值。 

void notify()唤醒在此对象监视器上等待的单个线程。 

void notifyAll()唤醒在此对象监视器上等待的所有线程。 

String toString()返回该对象的字符串表示。 

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

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

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

其中大家经常用到的就是:

equals(),hashCode(),toString();

下面结合官方文档分析一下这三个方法:

hashCode 的常规协定是: 

· 在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。 

· 如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。 

· 如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。 

Equals():当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

equals(Object obj)方法用来判断两个对象是否“相同”,如果“相同”则返回true,否则返回false。 

hashcode()方法返回一个int数,在Object类中的默认实现是“将该对象的内部地址转换成一个整数返回”。

因此在子类中

若重写equals(Object obj)方法,有必要重写hashcode()方法,确保通过equals(Object obj)方法判断结果为true的两个对象具备相等的hashcode()返回值。简单地说就是:两个相等的对象,应该具有相等的hashcode。如果你非要写一个类让equals(Object obj)返回true而hashcode()返回两个不相等的值,编译和运行都是不会报错的。但这样程序就存在了一个Bug

如果equals(Object obj)返回false,并不要求对这两个对象调用hashcode()方法得到两个不相同的数。简单的说就是:“如果两个对象不相同,他们的hashcode也可能相同”。 

根据以上分析我们可以得出以下结论

1、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。 

2、如果两个对象不equals,他们的hashcode有可能相等。 

3、如果两个对象hashcode相等,他们不一定equals。 

4、如果两个对象hashcode不相等,他们一定不equals。 

因此如果比较两个对象是否相等我们应该先判断hashcode是否相等,再判断是否equals

toString()

Java默认是不调用toString方法的,所以当一个类没有重写toString方法,直接输出对象时,显示出来的结果是一串数值。但当我们用System.out.println();这个方法在控制台打印出对象时,看到的是一串字符,这是因为System.out.println();这个方法默认就会调用一个继承自Object类型对象的toString方法

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值