Java面试SE-学习笔记

技术面试 - Java SE

  • 背景: 有些同学 没找到offer
  1. 自己知识储备不足

  2. 准备OK,但是仍然没找到offer

  • 面试技巧(重点)、代码讲解
    招聘岗位10, 50个人 : 10 + 40
    不会脱颖而出

主题: 出奇制胜

1.反对和所有应聘者 千篇一律

积累: 阿里巴巴 编程规范 《effective java》

2.反对和所有《面试宝典》 千篇一律

建议: 只看宝典里的题目,不看答案(答案自己写)

只看题目 + github/知乎/博客

  • 线程通信 wait()、notify()/notifyAll()

Semaphore、google guava类库Monitor

public class MonitorDemo {
    private LinkedList<Integer> buffer= new LinkedList<>() ;
    private static final int MAX = 10 ;
    //记录生产的数据编号
    private static AtomicInteger count = new AtomicInteger(0) ;
    //int i ;  i++ ;非原子性操作 ;  i++ 拆分成多行 ;线程安全问题
    private Monitor monitor = new Monitor() ;

    //生产数据
    public void produce(int value){
        try {
            //enterWhen:相当于加锁
            monitor.enterWhen( monitor.newGuard(  ()->  buffer.size()<MAX        )    ) ;
            buffer.addLast( value);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally{
            monitor.leave();
            System.out.println("生产完毕,缓冲区大小:" + buffer.size());
        }
    }

    //消费数据
    public int consume(){
        try {
            monitor.enterWhen(  monitor.newGuard(  ()-> ! buffer.isEmpty()      )      );
           return  buffer.removeFirst()  ;
        } catch (InterruptedException e) {
            e.printStackTrace();
            throw new RuntimeException(e) ;
        }finally {
            monitor.leave();
            System.out.println("消费完毕,缓冲区大小:" + buffer.size());
        }
    }

    public static void main(String[] args) {
        MonitorDemo demo = new MonitorDemo() ;

        ExecutorService executorService = Executors.newFixedThreadPool(6);
        //将线程池包装
        ListeningExecutorService listeningExecutorService = MoreExecutors.listeningDecorator(executorService);
        //向线程池放入3个生产者

        for(int i=0;i<3;i++){
            listeningExecutorService.submit( () ->{
                while(true){
                  int result =   count.getAndIncrement(); //i++  0  1  2
                  demo.produce( result );
                    System.out.println("生产:"+ result);
                }

            }          ) ;
        }
        //向线程池放入3个消费者
        for(int i=0;i<3;i++){
            while(true){
               int result =  demo.consume() ;
                System.out.println("消费" +result);
            }
        }

        ArrayList list = new ArrayList() ;
        list.add("a") ;
    }
}

3.源码级解决问题

  • 产生一个问题?百度、谷歌、问老师。

  • 面试官问: 请讲讲ArrayList如何库容的?

  • 我最初看书(看博客、文档),上面它的底层是动态数组,会在add()时 如果发现已满,则自动扩容1.5 。我还查阅了源码进行了验证,发现是在数组已满扩容,并且是通过 位移运算符扩容。

int newCapacity = oldCapacity + (oldCapacity >> 1);

4.找对时机,秀技能

每个人都有一些 独到的经验,要想办法在面试的时候 讲给面试官。

“聊聊自己的项目经验” ,讲项目,讲完的时候 加一句:我在做这个项目的时候 曾经遇到了一个bug,当时ArrayList.asList()返回一个List,当时通过阅读源码 发现 返回的List不是 Collection中的那个List。

5.比较通过的 秀点

  • 优化类(JVM、SQL优化)

  • jvm优化:1.项目做完时,我用jmeter进行了压力测试,结果发现相应时间太慢(或者内存利用率太高) ,然后我用jvisualvm分析了下JVM的内存情况。分析后,进一步发现项目中的小对象太多了,并且发现这些小对象都是生命周期比较短的对象。然后我猜测可能就是由于短对象太多,造成了堆中新生代容量不足,进而让很多短对象逃逸到了老年代中。这样一来,新生代和老年代中的对象都会很多,就会加速GC的回收频率,从而降低系统的性能。对此,我调大了新生代的内存大小,并且调高了新生代 逃逸到老年代的 阈值。之后再测试,发现性能平稳了许多。

PS:以上短短200字,就告诉了面试官你有性能测试的良好习惯、会发现问题、分析问题,并且会JVM调优!

  • 项目做完时,我用jmeter进行了压力测试,结果发现响应时间太慢。然后我用mysqldumslow工具查找到了项目中执行时间最长的那个SQL语句,因此猜测是这条SQL的性能太低,拖累了整个系统。然后我用explain查看了SQL执行计划,发现这个SQL根本没有写索引并且是大表驱动了小表,所以特别慢。之后,我给它后面的where查询字段加上了索引,并且改为了小表驱动大表。然后再次测试,响应时间就缩短了很多。

PS:这个秀点是“SQL优化”,具体流程是:定位慢SQL->使用explain查询SQL执行计划,用于分析SQL执行慢的原因->SQL优化。上述中的“小表驱动大表”等是SQL优化时的术语。

  • 算法类的:字符串算法 (KMP算法)

6.技术沉淀

数据支撑: github、博客、专栏、微信公众号、项目发布到阿里云

7.大厂的区别

bat ,美团,字节调动,google facebook

数据结构和算法、操作系统、网络、设计模式、分布式、逻辑思维(8+11 ?)

8.心态建设

回答正确,但被面试官“否定”

  1. 答案来自于面试宝典,千篇一律

  2. 面试官自己在秀技术 ,调整好心态,不要受干扰。
    正常面试官: 引导你来回答,而不是想方设法吓唬你
    有没有用过List? 哪些常见子类?数组?动态扩容,不越界?

  3. 如果问到 自己不会的?一定要答出自己的想法/答类似的框架, 虽然没用过这个新框架,但是我用过同类产品,并且相信他们是差不多的,然后就答这个同类产品的 实现原理。

mybatis \jpa

新dao框架 ? 映射文件/注释: 实体类-表, 然后通过框架本身的api的进行crud…

MQ:rabitmq rocketmq kafka\新MQ

发布了41 篇原创文章 · 获赞 1 · 访问量 548

猜你喜欢

转载自blog.csdn.net/qq_41620020/article/details/105165835