- 什么时候需要重写equals和hashCode方法
在比较两个对象的内容的时候,需要重写这两个方法。java系统本身提供的(==)比较方法,有两种情况:
1.比较的是基本类型数据,则此时== 跟equals的效果一致,此时比较的是2个值的大小。例如
2.比较的是对象的引用,则此时==跟equals比较的是2个引用的内存地址是否一致。
这里插入一些对象和对象的引用这个知识点,
Student stu=new Student("学生A"); 语句1
有人会说,stu就是Student类的实例,就是对象,那么再看下面
Student stu;
stu=new Student("同学B");
我们都知道对象的创建new Student是在堆栈上创建的,因此stu并不是一个对象,stu是一个对象的引用,他指向new Student("同学B")这个对象
看到这里,我们清楚了 当我们在比较2个对象的内容的时候,如果直接用系统默认的equals方法,则会直接比较的2个对象引用是否指向同一个对象(即2个对象的内存地址是否一致),这与我们的实际需求是有区别的;比如2个Student实例,他们都有身高、年龄、名字,我们现在只需要他们2个的名字和年龄一致即认为他们是同一个实例,那么用系统自带的equals方法时则无法比较成功,如果我们重写equals则可以按照我们的要求进行对象的内容比较。
当我们自定义的一个类,想要把它的实例保存在集合中时,我们也需要重写这两个方法;集合(Collection)有两个类,一个是List,一个是Set
2.重写equals的同时也要重写hashCode方法?
equals与hashCode的关系:
如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同;
如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false) ;
比较的时候是先对hashCode进行比较,如果hashCode不一致,那么2个对象不相同;如果hashCode一致,则再进行equals进行比较。为什么要这样做呢? 因为hashCode的比较效率很高。
3.关于equals方法的几个比较
if(this==obj),this指的是当前对象,==比较的是2个对象的引用的内存地址,如果比较对象跟当前对象的内存地址一致,则2个对象是相同的。
if(null==obj),如果被比较对象为null,则2个对象不相同,2个null对象不是相同的