java 高级面试题汇总 (一)

互联网是有记忆的,很多有趣的想法都会稍纵即逝,希望我们将其留在互联网上!(以下是面试官和小菜(本人)对话::)

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);
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值