为什么重写equals时必须重写hashCode方法?
是为了提高效率,采取重写hashcode方法,新进行hashcode比较,如果不同,那么就没必要在进行equals的比较了,这样就大大减少了equals比较的次数,这对比需要比较的数量很大的效率提高是很明显的。
为什么重写equals()时必须重写hashcode()方法?
因为两个相等的对象的hashCode值必须相等。也就是说如果equals方法判断两个对象是相等的,那么这两个对象的hashCode值也要等。
如果重写equals()时没有重写hashCode()方法的话就可能会导致equals方法判断时相等的两个对象,hashCode值却不相等。
思考:重写equals()时没有重写hashCode()方法的话,使用HashMap可能会出现什么问题。
总结:
equals方法判断两个对象是相等的,那么这两个对象的hashCode值也要相等
两个对象有相同的hashCode值,他们也不一定是相等的(哈希碰撞)
Comparable和Comparator的区别
comparable接口实际上是出自java.lang包,它有一个compareTo(Object obj)方法用来排序
comparator接口实际上是出自java.util包它有一个compare(Object obj1,Object obj2)方法用来排序
一般我们需要对一个集合使用定义排序时,我们就要重写compareTo()方法或compare()方法,当我们需要对某一个集合实现两种排序方式,比如一个song对象中的歌名和歌手名分别采用一种排序方法的话,我们可以重写comparaTo()方法和使用自制的Comparator方法或者以两个Comparator来实现歌名排序和歌手名排序,第二种代表我们只能使用两个参数版的Collections.sort()