面试:Object方法有哪些?
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是系统用来快速检索对象而使用