Object类
Object类
Java中有一个比较特殊的类,就是 Object类,它是所有类的父类,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类就默认继承 Object类。因此,Object类是 Java 类层中的最高层类,是所有类的超类也称之为基类。
Object类提供了许多方法。 它们如下:
-
-
protected Objectclone()创建并返回此对象的副本。
booleanequals(Object obj)指示一些其他对象是否等于此。
protected voidfinalize()当垃圾收集确定不再有对该对象的引用时,垃圾收集器在对象上调用该对象。
类<?>getClass()返回此
Object的运行时类。inthashCode()返回对象的哈希码值。
voidnotify()唤醒正在等待对象监视器的单个线程。
voidnotifyAll()唤醒正在等待对象监视器的所有线程。
StringtoString()返回对象的字符串表示形式。
voidwait()导致当前线程等待,直到另一个线程调用该对象的
notify()方法或notifyAll()方法。voidwait(long timeout)导致当前线程等待,直到另一个线程调用
notify()方法或该对象的notifyAll()方法,或者指定的时间已过。voidwait(long timeout, int nanos)导致当前线程等待,直到另一个线程调用该对象的
notify()方法或notifyAll()方法,或者某些其他线程中断当前线程,或一定量的实时时间。
-
1.关于 toString() 方法
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
根据自己得业务需求,重写toString() 方法能够很好得显示出自己需要打印得效果。
public String toString() {
return "姓名" + this.name + ",年龄:" + this.age + "岁";
}
2:关于 equals() 方法
比较两个对象是否一致,在Object类内默认方式是比较两个对象的地址是否一致。
代码中存在一些情况,需要比较的是两个对象中保存的内容是一致的,但是使用Object类内继承而来的equals方法,是不合理的!!!
Object中的equals源代码如下:
public boolean equals(Object obj) {
return (this == obj);
}
/*
* 重写equals方法
* 1. 判断两个对象是不是同一个对象。如果调用方法的类对象和传入参数类对象
* 地址一致,那就是同一个对象,返回true,搞定!!!
*
* 2. equals方法参数是Object类型,那也就是说任何类型的数据都可以作为参数。
* 两个数据类型不一致,是否需要进行比较操作。
* 判断数据类型是否一致
* 使用关键字 instanceOf,同数据类型继续运行,非同类型,结束判断返回false
* 格式:
* 类对象 instanceOf 类名
*
* 3. 判断对象中保存的数据
* Student中我们比较id, name, age, gender就可以了
*
*/
@Override
public boolean equals(Object obj) {
// 1. 判断是不是同地址对象
if (this == obj) {
return true;
}
// 2. 类型是否一致
if (!(obj instanceof Student)) {
return false;
}
// 数据类型强制转换
Student stu = (Student) obj;
return this.id == stu.id
// this.name.equals(stu.name) 该equals方法是String类equals方法
&& this.name.equals(stu.name)
&& this.age == stu.age
&& this.gender == stu.gender;
}
注意:equals() 和== 的区别:
- 在Java中,任何类型的数据都可以用 “==”进行比较是不是相等,一般用于基本数据类型的比较,比较器存储的值是否相等。但是如果用于引用类型的比较,则是比较所指向对象的地址是否相等,在这点上,跟
object类提供的equals()方法的作用是一致的。 - 对于
equals()方法
1) 首先,不能用于基本数据类型的变量之间的比较相等;
2) 如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
3) 诸如String、Date等类都对equals方法进行了重写,比较的是所指向的对象的内容。
3.关于 hashCode() 方法
在Object类内,hashCode方法,返回的内容是当前对象的空间首地址十进制展示方式。
当前类重写equals方法之后,两个当前类对象比较结果为true,那么要求这两个对象的hashCode必须一致!!!
hashCode使用有一个唯一原则。
一般会参考参与equals比较的所有成员变量来组成对应的hashCode,这里会使用到一些Java中提供的计算哈希值的方法。
hashCode使用未进行重写的情况下,会使用地址作为hashCode对应的数据,重写之后,不再使用地址。重写之后hashCode 不对应当前对象所在地址。
源代码如下:
public native int hashCode();
1、hashCode方法返回值是int类型的散列码,对象的散列码是为了更好的支持基于哈希机制的java集合类,例如Hashtable,HashMap,HashSet。如果重写equals方法,也要重写hashCode方法。
2、hashCode方法的一致约定要求
2.1 在java应用的一次执行过程中,对于同一个对象的hashCode方法的多次调用,他们应该返回同样的值(前提是该对象的信息没有发生变化);
2.2、对于两个对象来说,如果使用equals方法比较返回true,那么这两个对象的hashCode值一定是相同的;
2.3 对于两个对象来说,如果使用equals方法返回false,那么这两个对象的hashCode值不要求一定不同(可以相同,可以不同),但是如果不同则可以提高应用的性能。
2.4 对于Object类来说,不同Object对象的hashCode值是不同的(Object类的hashcode值表示的是对象的地址)。
3、 hashCode方法应用举例:
当使用HashSet时,hashCode()方法就会得到调用,判断已经存储在集合对象中的hashCode值是否与增加的对象的hashCode值一致;如果不一致,直接加进去;如果一致,在进行equals方法比较,equals方法返回true,表示对象已经加进去了,就不会再增加新的对象,否则加进去。
4、hashCode编写指导
在编写hashCode时,由于返回值是个int值,故不能溢出。不同对象的hash尽量不同,避免hash冲突

浙公网安备 33010602011771号