工作4年之前一直没有总结面试经验,现在沉淀一下,总结总结。
1.第一个问题是根据equal和hashCode衍生下去的问题
面试时问道,如何判断两个对象是否相等,这个问题实际上可以看做是如何对equals方法和hashcode方法的理解。
从以下几个点来理解equals和hashCode方法:
1)、equals的作用及与==的区别。
2)、hashcode的作用及与equals的关系。
== 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。比较的是真正意义上的指针操作。
equals用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断。
这些你可能都能回答出来
那么好接下来面试官会根据你的回答接着问道:那么我有个People类,它有sex,name 和 age 属性,三个属性相同则说明是同一个人,应该怎么去判断。
你可能会说嗯 判断属性是否相同,属性相同则说明是同一个。ok这确实可以实现,不过并不是面试官想看到的答案。那么应该怎么回答呢?我们可以重写equals 方法,在equals里面判断。很好你已经说出了面试官想听的信息,那么接下来他会问重写equals方法就够了吗?不够还要重写hashCode(),为什么重写equals方法还要重写hashCode呢?
hashcode()返回的是对象的地址,是一个散列值,那么如果我们通过equals()方法得到这两个对象相同,尽管他们在堆中的内存地址不一样,但是我们希望他们的哈希值是一样的,这样如果存入map的话,就能定位到相同的索引
同时Java标准中对hashcode有如下的规定:
- 在java应用程序执行期间,如果在equals方法比较中所用的信息没有被修改,那么在同一个对象上多次调用hashCode方法时必须一致地返回相同的整数。如果多次执行同一个应用时,不要求该整数必须相同。
- 如果两个对象通过调用equals方法是相等的,那么这两个对象调用hashCode方法必须返回相同的整数。
- 如果两个对象通过调用equals方法是不相等的,不要求这两个对象调用hashCode方法必须返回不同的整数
现在我们已经知道了重写equals()方法的同时需要重写对象的hashcode()方法,让其满足hashcode的标准条件。
但是好奇的同学可能会想到:为什么hashcode需要这样定义标准呢,这样做到底有什么好处呢,除了让equals()方法和hashcode()方法的返回值具有一致性。
这时我们就需要提到map类了,我们知道hashmap的结构是一个数组加链表组成的,我们通过key的。当然简单的只需判断内容是否相等是不需要改写equals的 但是万一以后放进map里呢,所以我们还是要遵循规定处理。以上就是根据equals和hashCode的衍生问题。大家也看到了一个问题面试官一层层剥能问出很多。其实在这个问完之后就会问到hashMap以及hashMap底层原理,hashMap碰撞冲突,hashMap扩容,hashMap线程安不安全,这些后面的整理会提及。