互联网是有记忆的,很多有趣的想法都会稍纵即逝,希望我们将其留在互联网上!(以下是面试官和小菜(本人)对话::)
1,面试官
1,简单介绍下自己,包括熟悉的技术栈,会哪些中间件,讲下最近项目架构情况,或者说遇到问题以及是怎么解决的? (画外音: 这都是常规问题了)
2,有点面试官会根据你的描述用到的技术提问,比如你聊到你的项目中遇到并发 访问,会用到netty ,
面试官就会欠欠的打断你, 那我问下,netty 是什么 ,他的实现原理是什么?
3, 面试官问? 用过springcloud alibaba 那 用到了他的哪些组件呢?
小菜: 用到了,注册中心nacos , 分布式事务seat , 分布式定时任务scheduleX , 限流器sentinel , ?小菜一慌 说就这些?
面试官追问? 没有到网关么?
小菜: 卧槽这咋能忘了,服务网关gategrory 用到了,(面试官想这是啥水平啊,这都不先说)
4,面试官问了: 那你用到了nacos 说说他是什么模式的,? 他又说了cp 还是 ap ?
小菜(如果(cp ap 是啥子)cap 哦哦 ! c 一致性,a p 分区可用性) 该怎么回答呢?
蒙一个ap
面试官:嗯,那naocs也是支持cp 的 就是需要配置,
5, 笔试面试官:手写一个单例:
// 饿汉模式
public class singleton {
// 私有构造方法
pirvate singleton ();
// 私有实例化
pivate static final Singleton singleton = new Singleton();
// 公有开放一个实例化
public static Singleton get(){
return single;
}
}
// 懒汉
public class Singleton {
// 私有构造方法
pirvate singleton ();
// 私有实例化
pivate static Singleton singleton = null;
// 公有开放一个实例化
public synchronized static Singleton get(){
if (single=null ){
return new Singleton();
}
}
}
面试官追问:或者当你只写出一个饿汉模式 , 他就问了 ,这样有啥问题?
小菜:总的来说,饿汉模式和懒汉模式各有其适用场景和优缺点。饿汉模式确保了单例对象的早期可用性并且线程安全,适合对性能要求不高但对可靠性有较高要求的场景。而懒汉模式则更适合对性能有较高要求的场景,因为它延迟了对象的初始化,减少了资源的占用,但需要额外的同步措施来保证线程安全。
面试官: 手写一个多线程的生产者消费者?
小菜: (这又是难为我,造飞机开始了,接下来他肯定会问多线程问题)
public class HelloWorld {
public static void main(String []args) {
System.out.println("Hello World");
Data data = new Data();
new Thread( ()-> {data.increment();}, "A").start();
new Thread( ()-> {data.decrement();}, "B").start();
}
class Data {
private int num = 0;
// JUC 生产者 +1
public synchronized void increment() {
if(num != 0) {
this.wait();
}
num++;
System.out.print("a==" + num);
this.notifyAll();
}
// 消费者 -1
public synchronized void decrement() {
if(num == 0) {
this.wait();
}
num--;
System.out.print("b==" + num);
this.notifyAll();
}
}
}
面试官: 手写冒泡吧, 还记得不?
小菜: 心里疯狂xxxxbbbbb, 这项目中会用到,fuck ,不信你会用到,,,于是含泪写下
public static void main(String[] args) {
//冒泡排序,简单的演示一下,冒泡循环主要进行每一趟遍历查找最大的值,放在最右边右边
int[] arr = {3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48};
for (int i = 0; i < arr.length - 1; i++) {//arr.length - 1是因为每一趟,两两对比都不需要与自身对比,所以减去自身
for (int j = 0; j < arr.length - 1 - i; j++) {//arr.length - 1 - i,是因为每一趟都会比上一趟减少比较一次
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
//进行打印结果
for (int i : arr) {
System.out.println(i);
}
}