- object类方法
- equals
- hashCode
- 为何重写equals()方法时必须同时重写hashCode方法?
1.getClass方法
获取运行时类型,返回值为Class对象
2.hashCode方法
返回该对象的哈希码值,是为了提高哈希表的性能
3.equals方法
判断两个对象是否相等,默认用的==判断地址。一般重写成判断值。
4.clone方法
5.toString方法
返回一个String字符串,用于描述当前对象的信息,默认返回的是当前对象的类名+hashCode的16进制数字。一般重写成对自己有用的信息。
6.wait方法
7.notify方法
多线程时用到的方法,唤醒该对象等待的某个线程
8.notifyAll方法
多线程时用到的方法,唤醒该对象等待的所有线程
9.finalize
对象在被GC释放之前会调用且只能调用一次finalize方法,对象被释放前最后的挣扎
因为无法确定该方法什么时候被调用,所以不推荐使用。
==
它的作用是判断两个对象的地址是不是相等
equals()
它的作用也是判断两个对象的数值是否相等。但它一般有两种使用情况:
情况 1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。
情况 2:类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来比较两个对象的内容是否相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。
hashCode() 的作用就是获取哈希码,这个哈希码的作用是确定该对象在哈希表中的索引位置。
为何重写equals()方法时必须同时重写hashCode方法?因为要保证下面两条要求:
1、如果两个对象相同(用equals比较返回true),那么它们的hashCode值一定要相同;
2、如果两个对象的hashCode相同,它们并不一定相同(用equals比较返回false)
如果不重写的话,Object的hashcode方法默认实现是:根据对象的存储地址形成一个哈希值。这时候就有可能将值相同但存储地址不同的两个对象散列到不同的位置,就不满足第一个要求了。
所以需要重写hashCode方法保证equals相同的两个对象散列到同一个位置。
那不用 hashCode判断,直接用equals比较不行吗?
先hashcode判断是为了减少了调用 equals 的次数,从而提高执行速度。
hashcode的比较时间复杂度常数级别,equals方法的时间复杂度要高很多。
hashCode()与 equals()的相关规定
如果两个对象相等,则 hashcode 一定也是相同的
两个对象相等,对两个对象分别调用 equals 方法都返回 true



