后端Java日常实习生面试(七牛云2023年11月14日)
面试岗位为:Java 后端开发实习生
面试时长:60分钟
面试时间:2023年11月14日
- 首先做一下简单的自我介绍吧
- 面试官说先来说一下 Java 基础吧
-
多态了解吗?(了解,一个行为有不同的表现形式)
-
知道编译时多态和运行时多态吗?(其实当时并不知道,就给面试官说没了解过,但是根据名字可以大概知道这两个东西是什么,编译时多态就是在编译器就已经确定好了实现类的类型,运行时多态是在运行时才可以确定实现类是哪个,需要执行哪一个具体的行为)
-
类加载机制了解吗?(类加载机制就是 Java 如何将 class 文件给加载到内存中,Java 使用了双亲委派模型来加载 class 文件,会通过将加载任务不断委托给父类加载器来执行)
-
于是面试官发了一个代码,问了一下我代码的输出是什么?
我回答说输出是 1 2 4 25
,这里是说错了,但是面试官一点一点在引导着我说,你感觉还有什么问题吗?我想了想,虽然直到面试官在提示我,但是还是看不出来哪里有问题,面试官又进一步提示说,如果你的答案中有一个是没有输出的,那你觉得是哪一个呢?之后我又重新分析了一下,并且把分析的过程讲给了面试官,之后说应该不会输出 4,因为在加载到 Father 类时,就已经拿到了 factor 静态变量,此时就已经不需要去加载 Son 类了,因此正确输出是 1 2 25
class Grandpa {
static {
System.out.println("1");
}
}
class Father extends Grandpa {
static {
System.out.println("2");
}
public static int factor = 25;
public Father() {
System.out.println("3");
}
}
class Son extends Father{
static {
System.out.println("4");
}
public Son() {
System.out.println("5");
}
}
public class Main {
public static void main(String[] args) {
System.out.println(Son.factor);
}
}
- Spring 是 Java 中常用的框架,那么Spring 中用到了哪些设计模式呢?(在获取 bean 的时候使用到了单例模式,其他的不清楚了)
- 你给我写一个单例模式的实现吧?(这里的单例模式其实问了很长时间,因为单例模式我只记得双端检锁了,这里让实现一个单例模式,我只想起来了下边这一种实现方式,单例模式问了很长时间是因为我一开始写错了,将变量定义为成员变量,在静态变量中访问成员变量了,还好面试官问我你看看代码是不是有点问题,我再看了看才发现有问题,于是将成员变量改成静态变量,但是没有添加 private 修饰符,面试官又进一步问你这样静态变量的作用域是什么呢?会不会被其他类修改呢?于是又将 private 修饰符给添加上了,这才写好下边这个单例模式/(ㄒoㄒ)/~~,单例模式没复习到是真不应该呀 ku ~~)
public class SingletonObj {
private static Object instance;
public static Object getInstance() {
if(instance == null) {
instance = new Object();
}
return intance;
}
}
- 之后开始让我介绍项目了,让我挑一个项目进行介绍,我就介绍了 API 网关项目,这次把 processon 上的流程图给共享了,对着流程图给面试官介绍,介绍完之后,面试官开始提问
-
API 网关和 Nginx 之间是什么样的关系呢?(是一对多的关系,通过 Nginx 做负载均衡,将请求路由到网关的多个模块)
-
Nginx 使用了什么负载均衡算法呢?(使用的最少连接数算法)
-
Nginx 中的负载均衡算法的原理你了解吗?(不了解,这个没有看过)
-
具体讲一下算法怎样实现的吧?(不了解怎么实现的,我就只说了说我对这个最少连接数算法的理解,通过监听每个应用的连接数量,来将新的请求路由到连接数量最少的应用上去)
-
我看你是使用 Redis 的 PUB/SUB 了,那为什么要使用 PUB/SUB 呢?(我也不知道为啥使用,我~~)
-
鉴权怎么鉴权了呢?(使用 jwt token 进行鉴权,讲一下流程,这里建议如果你在项目中使用到哪个小的组件,一定要去了解他的原理是怎样的)
-
了解其他的 API 网关鉴权策略吗?