Object中常用方法的重写:
一、equals():两个对象比较原则
讲equals前首先要讲讲equals和==的区别;
(1)==在比较基本数据类型时,比较的是值;在比较引用数据类型时比较的是地址值;
(2)equals是用于两个对象之间的比较;当所比较的类类型没有对equals进行重写的时候,会使用Object中的equals方法进行比较,这时比较的是地址值;当所比较的类类型对equals进行了重写,比较规则使用的是自定义的比较规则。
字符串类型的可以直接使用equals进行比较,String类是对equals进行重写了的,字符串的比较规则采用的是将字符串分割成字符数组,再拿着一个个的字符进行对比,如果全部相等则返回true,否则返回false。
二、hashCode():
Object类中的hashCode()方法会根据new出的不同的对象产生一个hashCode值,但是如果对hashCode()方法进行重写了就会根据自定义的方式产生一个hashCode值
三、toString():
默认打印一个对象的时候,实际并不是这个对象本身而是调用完toString返回的字符串
四、 getClass():
Object类中的方法,所以,在每一个java类中,都会有这个方法,并且这个方式final修饰的,不能被子类重写,这个方法可以返回某一个引用在运行的时候指向对象的类型
例如:Person p = new Student()
//会输出:class com.briup.chap06.Student
//说明这个引用p在运行时指向的是Student这个类的对象
//注意这个引用p的类型是Person的(多态)
System.out.println(p.getClass());
【重点】
一、如何对hashCode和equals进行重写?
1.没有对hashCode方法进行重写的类,每new一个对象的时候Object类中的hashCode()方法产生的hashCode值都是不一样的,它会根据这个对象的地址值产生一个int类型的哈希码;
当对hashCode进行重写完之后就会根据你重写规则产生哈希码。
2.没有对equals进行重写时,使用equals方法对比两个对象就会调用Object类中的equals()方法对比两个对象,实际上就是对比两个对象的地址值;
当对equals进行重写完之后就会根据你重写的规则进行两个对象的对比。
二、为什么加入HashSet集合中的对象重写了equals方法之后还要重写hashCode方法?
1.因为每new一个对象在hashCode不重写的情况下,Object类会根据对象的地址值产生一个int类型的哈希码,而equals方法在不重写的情况下对比的是两个对象的地址值
2.如果重写了equals方法,当此方法被重写时,通常有必要重写hashCode方法,为了保证相等的对象必须要有相等的哈希码。
3.HashSet集合实现添加的对象都不重复的方式;
添加进集合的对象都是重写了hashCode方法和equals方法的,hashCode方法主要功能是提高对比的效率,在hashCode相同的情况下再使用equals进行对比,如果返回false则说明该集合中没有该对象,可以将该对象添加到集合中去;(hashCode值相同的两个对象,不一定是同一个对象。两个对象如果是同一个对象,hashCode值一定相同。)
如果对比hashCode值不相同就可以直接将该对象添加到集合中去。