【027期】面试必问 hashCode() 和 equals() 及使用规范,你掌握了吗?(1)

总结

虽然面试套路众多,但对于技术面试来说,主要还是考察一个人的技术能力和沟通能力。不同类型的面试官根据自身的理解问的问题也不尽相同,没有规律可循。

上面提到的关于这些JAVA基础、三大框架、项目经验、并发编程、JVM及调优、网络、设计模式、spring+mybatis源码解读、Mysql调优、分布式监控、消息队列、分布式存储等等面试题笔记及资料

有些面试官喜欢问自己擅长的问题,比如在实际编程中遇到的或者他自己一直在琢磨的这方面的问题,还有些面试官,尤其是大厂的比如 BAT 的面试官喜欢问面试者认为自己擅长的,然后通过提问的方式深挖细节,刨根到底。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

String anotherString = (String)anObject;

int n = value.length;

if (n == anotherString.value.length) {

char v1[] = value;

char v2[] = anotherString.value;

int i = 0;

while (n-- != 0) {

if (v1[i] != v2[i])

return false;

i++;

}

return true;

}

}

return false;

}

equals 方法就没有好说的,为什么这么写,这里就跟equals 的设计原则有关,会解释什么。下面我们从开发者手册的三句话来解释hashCode 和equals 方法的特性,以及为什么要重新解释这两个方法。

想要重写equals,就必须重写hashCode

我们先举个例子: Person类:

public class Person {

private String name;

private int age;

public Person() {

}

public Person(String name, int age) {

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

@Override

public boolean equals(Object o){

if(this == o){

return true;

}

if(o instanceof Person){

Person p = (Person)o;

return this.age == p.getAge() && this.name.equals(p.getName());

}

return false;

}

}

运行类:

public class Application {

public static void main(String[]args){

Set set = new HashSet<>();

Person p1 = new Person(“Lilei”, 25);

Person p2 = new Person(“Lilei”, 25);

set.add(p1);

System.out.println("p1 equals p2: " + (p1 == p2));//1

System.out.println("set contains p1: " + set.contains(p1));//2

System.out.println("set contains p2: " + set.contains(p2));//3

}

}

输出结果:

p1 equals p2: false

set contains p1: true

set contains p2: false

看出来p1虽然等于p2(我们换了个人类的方法),但是把p1可以动态一套,通过p2之后是无法取出来的,但是我们要的效果是可以通过p2取出来的,实景中肯定是有这样的使用场景的。

因为集存储不是重复的对象,两个哈希码和等于进行判断,所以集存储的对象必须改这方法

还是上面的例子,我们不改写人类的方法,也不改写它的hashCode。

public class Person {

private String name;

private int age;

public Person() {

}

public Person(String name, int age) {

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

}

运行类:

public class Application {

public static void main(String[]args){

Set set = new HashSet<>();

Person p1 = new Person(“Lilei”, 25);

Person p2 = new Person(“Lilei”, 25);

set.add(p1);

set.add(p2);

System.out.println("set size is: " + set.size());

//System.out.println("p1 equals p2: " + (p1 == p2));

//System.out.println("set contains p1: " + set.contains(p1));

//System.out.println("set contains p2: " + set.contains(p2));

}

}

运行结果:

set size is: 2

设置里面是不重复的,如果不重写Person类的hashCode和等价的方法,这里p1和p2是可以同时动态设置对象里的。那么我们只重写了Person的hashCode方法能不能行呢?

@Override

public int hashCode(){

return name.hashCode() * 31 + age;

}

运行结果:

set size is: 2

最后重写Person类的equals()方法:

@Override

public boolean equals(Object o){

if(this == o){

return true;

}

if(o instanceof Person){

Person p = (Person)o;

return this.age == p.getAge() && this.name.equals(p.getName());

}

return false;

}

@Override

public int hashCode(){

return name.hashCode() * 31 + age;

}

运行结果:

分享

首先分享一份学习大纲,内容较多,涵盖了互联网行业所有的流行以及核心技术,以截图形式分享:

(亿级流量性能调优实战+一线大厂分布式实战+架构师筑基必备技能+设计思想开源框架解读+性能直线提升架构技术+高效存储让项目性能起飞+分布式扩展到微服务架构…实在是太多了)

其次分享一些技术知识,以截图形式分享一部分:

Tomcat架构解析:

算法训练+高分宝典:

Spring Cloud+Docker微服务实战:

最后分享一波面试资料:

切莫死记硬背,小心面试官直接让你出门右拐

1000道互联网Java面试题:

Java高级架构面试知识整理:

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

ocker微服务实战:

[外链图片转存中…(img-C0yxrLr4-1715475148500)]

最后分享一波面试资料:

切莫死记硬背,小心面试官直接让你出门右拐

1000道互联网Java面试题:

[外链图片转存中…(img-L8BTH4mH-1715475148500)]

Java高级架构面试知识整理:

[外链图片转存中…(img-aEkmgF3R-1715475148501)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 26
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值