2020 3月面试总结

面试告一段落啦,4月份就要入职新公司了,现将面试题总结如下

 

  • java基础问题
  1. HashMap底层原理(被问到不下5次)
    回答这个问题要从底层进行回答,首先回答是主干结构是个数组结构,数据按照Hash值放入一个个桶中,初始大小默认为16,如果出现Hash碰撞会将数据放在这个桶的下方,以一个链表的方式。
    这时候要指出问题,如果Hash碰撞过多导致链表过长,会导致查询最差时间复杂度为O(N),所以在JDK1.8之后,当链表长度超过8将链表改成一个红黑树,方便查询。
    后续可能问到HashMap是否线程安全,容易引出ConcurrentHashMap分段锁,最好对分段锁的原理进行了解,如分段锁的Segment等,还有你可以说一下这个扩容问题,最好开始指定合适的大小,不然对资源是一种消耗。

  2. 这里需要注意面试官可能会问到红黑树,二叉搜索树,平衡二叉树的区别,以及为什么是红黑树,有兴趣的朋友可以下去扩展。
  3. ArrayList的问题

    我遇到的关于ArrayList的问题是面试官让我说一下平时工作中如何用到ArrayList的,遇到这种问题我一般会回答首先ArrayList是线程不安全的,其次你可以讲一下ArrayList的底层原理(一个初始大小为10的Object数组),以及ArrayList的扩容问题阈值为集合大小的0.75,如果面试官继续问为什么是0.75,我一般会回答这个问题我没有深入研究过,但是0.75是属于在空间上和时间上取的最优策略。

    最后你可以讲一下ArrayList的遍历,说ArrayList是自动扩容的,所以不支持foreach遍历,在实际开发中遇到过这个问题。
  4. Collection集合框架

    遇到这种问题我一般会说Collection是集合框架的根结点,然后说一下set,Hash等结构,会说一些他们的区别,以及线程安全的问题,以及如何解决线程安全问题。
  • java多线程(多线程一直在被问)
  1. 讲一下你理解的java多线程,如何保证线程安全

    回答这个问题的时候我会首先回答比如我开一个新的线程可能 new Thread().start就开启了一个新线程,在工作中可能使用线程池,至于如何使用多线程你可以讲一般开发过程中是线程操作资源类,在这里可以装个逼,讲一下阿里开发手册不允许使用java自带的线程池,以及不能new Thread。公司都使用自己写的线程池。

    如何理解线程操控资源类可以举一个例子,比如我有一个Class Count计数类,然后main方法理解为里面有很多个线程,我要使用多个线程来操控这个计数类,保证他的原子性,可见性,禁止指令重排性,这三大特性在我的博客关于Voliate关键字博客里面有介绍。我们需要保证这些特性,所以在保证三大特性上也就保证了线程安全。

    JUC这个包可以给面试官讲一下,是加分项,比如countDownlatch等方法,包括原子类Automic。
     
  2. 会问到你熟知的java锁的种类,以及你常用的锁

    这个问题我在博客中就不细说了,说一下我回答这个问题的思路。
    首先我会回答我常见的锁的类型:公平锁,非公平锁(synchronized),共享锁,悲观锁,乐观锁。
    在接下来的过程中我会着重讲一下CAS锁,能引出Automic类,比如原子类的+1底层是如何实现的,你可以说你看过那个源码,底层是一个do while 循环。
    接下来的问题尤为重要,讲到了CAS锁你一定要讲出ABA问题,以及ABA问题如何解决,相关问题我在关于CAS的博客中有详细介绍。
     
  3. java线程池的参数,以及为什么不使用java自带的线程池

    线程池的参数:我经常回答的是 核心线程数,最大线程数,阻塞队列,时间设置等...,为什么不使用自带的线程池我一般回答的是阻塞队列设置为了Integer.MAX大致为21亿多这是极其不合理的。
     
  4. 线程如何返回参数

    问我这个问题的是一家外企,感谢我的兄弟 “大哥 ”在面试前几天我们讨论了这个问题。我的回答是Runable接口确实无法返回参数,这时候使用Callable接口可以返回参数,具体的使用要下去看一下,但回答问题你答出Callable接口就可以了。
     
  5. 关于多线程的题目

    可能会让你做一些多线程的题目,这些如按顺序打印10次20次30次AAA,BBB,CCC一般遇到这种问题也要使用线程操作资源类,我一般会使用Lock 加Codition 解决上述问题。
  • 消息中间件(我一般回答kafka)
  1. 自己开发过程中使用的中间键

    有一个业务场景我朋友给我讲的,在此万分感谢lili同学。比如我们玩游戏的都知道游戏道具都会在邮箱发放,有时候会有些延迟,这里的实现如下。一般会设置为一个异步调用,将所有参数传入,如果检测到所有参数合理,那么会给前端返回success,然后将这条消息放入到kafka,后续会让消费者消费kafka中的消息,如果调用不成功会多次调用消费,但一旦参数正确会给用户返回道具将在24小时之后发放。这就是一个应用过程。具体可以结合自己的项目,来描述这个问题。
     
  2. kafka如何保证消息的顺序性

    比如我想一个消息按照1,2,3....标号进行消费,如何顺序消费一般有两种方法,1.将所有的消息放在一个partion中,partion本身就是一个队列,放的时候保证顺序,消费也能被顺序消费。2.拉取到消息中,放到N个queue中,具有相同的key放在同一个queue中,但这个方法我也没用过,不知道该如何设置。
     
  3. kafka如何保证幂等性

    保证kafka的幂等性,可以使用PID,setNumber以及加上kafka的事务,具体使用就不在这里赘述。
     
  4. kafka如何保证消息不会丢失

    面试过程中面试官给我描述了一种情况,比如消费kafka,这条消息刚被消费但是你的程序挂掉了,这时你的kafka认为数据已经被消费了,但是实际上由于程序突然出问题其实你的这条数据并没有被消费,没有被程序进行处理,这种问题要怎么解决。

    我的回答是,这其实并不是kafka丢失了数据,其实是人使用不当导致我们觉得kafka数据丢失了,解决这种问题最好使用手动offset,在程序执行完之后手动offset证明已经被消费就不会出现上述问题。
  • NoSql问题
  1. 为什么要NoSql,以及你项目中的NoSql

    NoSql是not only sql 就是不仅仅是sql,因为sql是持久化到硬盘中,速度相对较慢,不能满足日新月异的需求。我一般使用的是redis,对缓存进行操作。
  2. redis持久化方式

    redis有两种持久化方式,一种是RDB,一种是AOF,这里你要说明一下两者的区别,比如AOF能存储出现问题前一秒的数据,平时开发中一般两种持久化都打开。
     
  3. redis持久化的文件中出现问题无法恢复怎么办

    一般持久化数据写到相应的.RDB和.AOF文件中,无法恢复可能出现问题时写入了不符合语法的数据,这时使用check命令会将不符合语法的数据进行删除,再回滚就没什么问题了。
     
  4. redis出现与数据库数据不同步如何处理

    这个面试题是我面试ICBC(爱存不存)的一个面试题,我的回答是在进行Update语句时,删除redis中的数据,同时在更新完成后将数据写入到redis中。

    他紧接着问我这样处理可能出现一些问题,这个问题你知道嘛?我嘿嘿一笑,接着讲出了这种实现方式可能出现的问题,比如在更新数据还未完成时,有一条查询sql,发现redis没有,可能会查到数据库,同时会将查到的数据写入到redis,但在你更新完成后会再次重新写redis,以及用户读到的是脏数据,会造成资源的浪费以及用户读到的数据不准,但考虑到不是写操作,以及概率很小一般会这么处理。

    但是他依旧对我不依不饶,就想让我解决这个问题,我心里已经在MMP,但是仍然笑嘻嘻的说,是不是可以和kafka的过期策略联合使用(这种策略我不是很懂,就不写出来坑大家了),比如出现一个的概率是0.1,联合使用就是0.01,大大降低这种情况,敷衍过去了这个问题,其实我现在也搞的不是很懂,希望朋友们补充。
     
  5. redis既然都能持久化为啥redis不代替mysql

    讲道理问到我这种问题我人是傻的了,就想回答因为mysql好用啊!但是还是硬着头皮回答下去了,回答思路如下

    首先我说到mysql数据类型更多能满足更多需求,然后mysql可视化做的很好,表数据很清晰,以及mysql有各种存储引擎能满足更多复杂的需求,就拿着mysql有的好处说将这个问题避过去了,欢迎大家补充这个问题。
     
  6. redis的事务

    redis事务和我们平时认为的事务可能有所不同,比如一个事务中有1,2,3操作,1,2成功,3失败。但是redis会执行1,2操作3失败的不执行这一点要格外注意。
     
  1. 数据库索引底层

    数据库索引底层就是一颗B+tree,感兴趣的朋友去研究下B树,面试官会问一些索引是否越多越好以及你在平时是怎么使用索引的,我会回答复合索引以及B树的底层结构。
     
  2. 遇到慢sql如何处理

    一般使用explain命令查看一下,看看index,ref字段,以及索引是否被全部使用到了,是否全表扫描,在这里一定注意使用索引要保持数据类型一致,不要建立了一个String类型的索引,却用Integer使用,会导致索引失效是大忌。
     
  3. select 。。。。。。。for update 这条语句是什么意思

    这条语句是一个行锁,只有将这条语句处理完才会进行下面的处理。
     
  4. 数据库的优化策略

    这个网上有很多介绍,形成自己的思路即可,如分库分表,读写分离,可以说一些数据库参数如join_buffer_size等可以适当调大这些参数,显示出自己知识的丰富。
  • java框架
  1. spring的IOC和AOP

    回答这个问题首先要说一下IOC和AOP是什么,比如讲一下IOC是控制反转,为什么叫控制反转,因为我们原来写程序就不停的new 对象,现在将这种权利交出去交给Spring进行装配,相当于控制权利的移交。然后你可以说IOC的底层实现是工厂模式加反射,AOP是动态代理,具体可以描述下这些细节。
     
  2. 你看过那些框架的源码

    讲道理这个问题就很大,我也很懵逼因为咱也不是什么大神,天天弄源码,一般我会讲一下Spring装载一个对象的过程这一段源码,具体我就不说了省的误导大家,可以给大家提供一个思路,说一段你擅长的,然后中途说一下源码为啥要这么写,解决了什么问题,我在这过程中加入了解决循环依赖等问题比如    A依赖B  B依赖C  C又依赖了A 这就相当于一个圈圈,不停的转圈圈,那么spring的解决方式可能是先把A拿出来放在缓存中,当C再依赖A时能够跳出这个循环。
     
  3. 持久层你使用到了那些框架

    这个问题就结合自己说就好了,我一般说JPA和mybatis,然后会说说mybatis的二级缓存和redis联合使用,这样又能扯到redis不会被牵着鼻子走,在这里感激我的好基友 华禹 给我讲述了这个问题。
  • java算法和工厂模式(这些万分重要,ICBC就是动态规划没回答好直接被抬走了)
  1. 简单的算法题如取交集和去重复(借助额外的存储空间如Hashmap)

    面试外企时问了我两个集合如何取出他们的交集部分,我的回答是先遍历一个集合,将它放到Map中接着遍历第二个集合如果Map包含就是交集,问题得到顺利解答

    还有一道问题,问我有100万个电话号码,里面有很多重复,如何去除重复,我也是使用hashMap如果包含就说明存在存一次就好。
     
  2. 链表是否有环

    这个问题在一家传统企业的笔试题中遇到,给我offer了我没去嘿嘿嘿!!用快慢指针法,如果有环,那么一定会被套圈,快慢指针会在一个地方相遇。
     
  3. 动态规划

    这是一类老大难问题,而且会被经常问,讲道理我现在也很头大,还是将这个问题细分。分为1.计数问题  2.最值问题 3.可行性问题,感兴趣的朋友移驾我的博客,有一些简单题的描述,这个问题不是看个一个星期就能会的,还是要多做....当然我现在还不是很会。
     
  4. 二叉树的相关问题

    二叉树一般会问些二叉树的遍历,以及什么搜索树,平衡树,再次感谢可爱的lili推荐给我的资料,看个这个我感觉就差不多了
    https://github.com/labuladong/fucking-algorithm/blob/master/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E7%B3%BB%E5%88%97/%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E6%93%8D%E4%BD%9C%E9%9B%86%E9%94%A6.md

     
  5. 工厂模式

    我面试阿里问我工厂模式我在平时的开发中使用到了那些,我当时还没看这些,没回答上来就被抬走了....... 后面整理了一些供大家参考

    我觉着回答两个熟悉的设计模式就好,我一般会说策略模式和责任链模式,比如代码中有很多if else 而且代码之间形成强耦合,那么可以使用责任链模式解除耦合逐级查询。感兴趣的朋友移驾b站。

    https://www.bilibili.com/video/BV1G4411c7N4?from=search&seid=1076934648693624301




    我遇到的就是大概上述题目,但其实很多东西难以在一篇博客中表现出来,比如动态规划算法题,Spring源码。感觉还是需要时间去不断的总结积累,感谢我的朋友们给我加油打气以及陪我聊天,让我在这段时间里进步很多,奥利给!!!


     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值