总结
虽然面试套路众多,但对于技术面试来说,主要还是考察一个人的技术能力和沟通能力。不同类型的面试官根据自身的理解问的问题也不尽相同,没有规律可循。
上面提到的关于这些JAVA基础、三大框架、项目经验、并发编程、JVM及调优、网络、设计模式、spring+mybatis源码解读、Mysql调优、分布式监控、消息队列、分布式存储等等面试题笔记及资料
有些面试官喜欢问自己擅长的问题,比如在实际编程中遇到的或者他自己一直在琢磨的这方面的问题,还有些面试官,尤其是大厂的比如 BAT 的面试官喜欢问面试者认为自己擅长的,然后通过提问的方式深挖细节,刨根到底。
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高级架构面试知识整理:
ocker微服务实战:
[外链图片转存中…(img-C0yxrLr4-1715475148500)]
最后分享一波面试资料:
切莫死记硬背,小心面试官直接让你出门右拐
1000道互联网Java面试题:
[外链图片转存中…(img-L8BTH4mH-1715475148500)]
Java高级架构面试知识整理:
[外链图片转存中…(img-aEkmgF3R-1715475148501)]