Object类有12个成员方法,按照用途可以分为以下几种
1,构造函数
2,hashCode和equale函数用来判断对象是否相同,
3,wait(),wait(long),wait(long,int),notify(),notifyAll()
4,toString()返回该对象的字符串表示,一般需要重写和getClass() 返回一个对象的运行时类,获得类型的信息,与java反射机制相关
5,clone() 创建并返回此对象的一个副本(复制对象)
6,finalize()用于在垃圾回收, 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法,该方法用于释放资源。
有以下疑问:
1、为什么要重写equals()方法?
因为Object类中定义的equals()方法是用来比较两个引用所指向的对象的内存地址是否一致。
源码:
public boolean equals(Object obj) {
return (this == obj);
}
("=="两边是基本类型比较的是内容,"=="两边是引用类型(class)比较的是否对同一对象的引用,即比较两个引用所指向的对象的内存地址是否一致。)
而我们经常会希望两个不同对象的某些属性值相同时,就认为它们相同。所以我们要重新equals()方法。
2、为什么要重写hashCode()方法?
需要注意的是:
a、在java应用程序运行时,无论何时多次调用同一个对象时的hashCode()方法,这个对象的hashCode()方法的返回值必须是相同的一个int值
b、如果两个对象equals()返回值为true,则它们的hashCode()也必须返回相同的int值
c、如果两个对象equals()返回值为false,则它们的hashCode()返回值也必须不同
由于hashCode方法定义在Object类中,因此每个对象都有一个默认的散列码,其值为对象的存储地址。如果重新定义equals方法,就必须重新定义hashCode方法,以便用户可以将对象插入到散列表中。(要保证上面所述b,c原则)
hashCode稍微理解下下
hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。
hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode() 函数。
虽然,每个Java类都包含hashCode() 函数。但是,仅仅当创建并某个“类的散列表”(关于“散列表”见下面说明)时,该类的hashCode() 才有用(作用是:确定该类的每一个对象在散列表中的位置;其它情况下(例如,创建类的单个对象,或者创建类的对象数组等等),类的hashCode() 没有作用。
上面的散列表,指的是:Java集合中本质是散列表的类,如HashMap,Hashtable,HashSet。
也就是说:hashCode() 在散列表中才有用,在其它情况下没用。在散列表中hashCode() 的作用是获取对象的散列码,进而确定该对象在散列表中的位置。
下面,我们以HashSet为例,来深入说明hashCode()的作用。
假设,HashSet中已经有1000个元素。当插入第1001个元素时,需要怎么处理?因为HashSet是Set集合,它允许有重复元素。
“将第1001个元素逐个的和前面1000个元素进行比较”?显然,这个效率是相等低下的。散列表很好的解决了这个问题,它根据元素的散列码计算出元素在散列表中的位置,然后将元素插入该位置即可。对于相同的元素,自然是只保存了一个。
由此可知,若两个元素相等,它们的散列码一定相等;但反过来确不一定。在散列表中,
1、如果两个对象相等,那么它们的hashCode()值一定要相同;
2、如果两个对象hashCode()相等,它们并不一定相等。
注意:这是在散列表中的情况。在非散列表中一定如此!
(如有雷同,是我吵你的)