摘要:这是一个悲伤的故事,因为太菜、频繁出现低级错误而惨遭leader嫌弃,为了不被T出团队,便将公司的面试题总结了一遍,(今天也是元气满满的一天)。
前言:题目主要包括四个部分:基础问题、进阶问题、扩展问题、编程题。基础问题:是必须数量掌握题目,如果答不上来,在面试的过程中会惨遭扣分,基本面试无望,一般出现在一面中,和少数的二面中。进阶问题:一般是了解面试者对于改技术的了解深度,答的越多,评分越高,一般出现在二面和三面中。扩展问题:一般属于开发性的题目,不要出现致命性的低级错误即可,一般出现在三面和四面中。编程题:这里主要是为了考验面试者的编码能力,和一些算法功底,我们公司现在的编程题目较为简单,主要是为了考验编码能力,涉及算法部分较少,一般出现在笔试中。
一、基础问题
volatile相关:
面试基础题之《Volatile》接口和抽象类的区别
面试基础题之《面向对象》面向对象四大特性:继承、封装、多态、抽象
面试基础题之《面向对象》HashMap的数据结构、查询时间复杂度、是否线程安全
数组和链表的差异,优缺点,使用场景
请给出你记忆的基本的数据结构有哪些?他们分别有什么特征?对应Java里面的哪些类?
线程池 ThreadPoolExecutor 类构造函数的参数有哪些,分别代表什么意思
针对候选人说Mysql熟悉的,询问候选人Mysql 聚簇索引的概念
针对候选人说Mysql熟悉的,询问候选人建表时,建索引有哪些原则或优化技巧
如何解决慢查询
说出几种设计模式,并针对其中一种做详细解释,包括使用场景,实现方法,好处
针对候选人说Redis熟悉的,询问候选人redis有哪些数据结构,每种数据结构有哪些使用场景
针对用Redis做过分布式锁的,询问候选人Redis可以做分布式锁的原因,怎样做分布式锁,有哪些步骤,需要注意什么
二、进阶问题
- ConcurrentHashMap 线程安全的实现原理
- 如何判断一个类的内部实现是线程安全的,有哪些原则?怎样将一个类改造后变成线程安全的类?
- 数组和链表在存储海量数据时,各有什么问题?
- CAS的原理,作用,什么是乐观锁,悲观锁?Java中哪些类使用到了CAS
- volatile的底层原理(能答出内存栅栏即可),产生内存可见性问题的原因(cpu cache和主存)
- jdk1.8新增哪些新功能?函数式编程的优缺点?
- 为什么jdk8在接口里增加defalut实现,目的是为了什么?
- HashMap在jdk8中用到了红黑树,作用是什么?为什么不是别的树而是红黑树?红黑树还在哪个类中被用到了?
- 线程池ThreadPoolExecutor在超过核心线程数时,是先放进队列里还是先扩充线程到最大线程数?有哪些拒绝策略可以使用?如果要自定义线程池创建的线程名要怎么做?
- Jvm中有哪些垃圾回收器?或有哪些垃圾回收算法?如何识别一个对象是可被回收的?
- 如何排查频繁GC的问题?如何排查OOM?
- 针对候选人说Redis熟悉的,询问候选人redis的io模型或单线程为何也可以保持较快并发。并进一步询问操作系统支持的5种io模型(阻塞,非阻塞,多路复用,信号驱动,异步io)。询问java中,nio使用的是哪一种
- 针对候选人说Redis熟悉的,询问候选人redis如何做持久化,如果答上rdb和aof两种模式,询问两种模式的优缺点,使用场景
- 如何理解微服务?微服务架构解决什么问题?如何划分微服务?
- 如果要设计一个RPC框架,需要考虑哪些问题?
- 熔断和限流的概念?他们之间有什么区别?如何做限流?什么是令牌桶?如何做熔断?什么是线程隔离?
- Redis做缓存,缓存的更新策略有哪些?什么是缓存雪崩?什么是缓存穿透?如何解决?
- Redis如何做分布式集群?什么是一致性哈希算法?redis cluster使用的是什么算法?
- 注册中心zk等,和redis有什么区别?为什么它们可以用来做注册中心?原理是什么?
- zk是否可以做分布式锁?原理是什么?它和redis做分布式锁有什么优缺点?
- zk还可以做什么?
- Java中的类加载模型是什么?为什么要有双亲委派模型?有哪些类加载器?
- 如何保证分布式的数据一致性?什么是分布式事务?两段式提交有什么缺点?什么是最终一致性?BASE原则?CAP理论?
- 如果候选人有秒杀场景基础,或高并发经验,询问候选人如何设计一个健壮的秒杀系统?
- 询问候选人Https的原理,为什么Https相比Http是安全的,过程是怎样的?
- Java中Collections.sort或List.sort,即默认提供的排序,底层的排序算法是什么?(timsort,一种归并排序)
- 请列举所有你知道的排序算法,以及他们的时间复杂度?快速排序的缺点是什么?
扩展问题
- Java是编译型语言还是解释型语言?还是两者都有?谈谈你的看法
- 如果候选人还写过别的语言,询问候选人你觉得Java和其他语言有什么区别?有什么优缺点?主要观察候选人对编程语言的思考
- 如果候选人提起zk的一致性算法,进一步询问分布式一致性领域的两军问题,拜占庭将军问题,prxos算法和raft算法,观察候选人是否理解透彻
- 针对一个代码老旧但是又非常核心的系统,如何做重构?谈谈你的想法?
- 你是如何学习新的知识的?比如如果现在让你学习Guice,你会怎么做?
编程题
- 作为JDK的作者,实现Java中Integer.valueOf(String s)这个函数
(本题考查编程功底,主干代码需要对char转int也就是ascii码有所认知和了解,经过提示还不能写出主干代码的,基本上都是野路子非科班出身,编程功底会非常差,可能会连二进制转十进制都不会算(此时可以考察候选人是否会算2进制转10进制)。
本题边界条件非常多,一上来就对String做null处理的加分,知道处理负数的加分,知道处理int最大值的加分,能一上来就写对完全版的给高分,不知道int最大值是多少的扣印象分) - 实现一个线程死锁的代码,两个线程相互等待对方
(本题考察候选人多线程编程功底,有些人连怎么new一个线程出来都不知道,这道题就会写不出,如果对线程死锁理解不透彻,也会写出有问题的代码而不能真的产生死锁) - 如果观察到候选人数据结构和算法能力较差,为了进一步确认这一点,会让候选人写出冒泡排序的实现,并给出一个数列来演算冒泡排序。并会询问,冒泡排序内层循环一轮之后,效果是什么(实际就是冒一个泡)?
- 偶尔会出到的考题:用两个栈实现一个队列、判断一个链表是否为循环链表、二叉树的中序遍历(递归写法和非递归写法)
- 本文作者: th3ee9ine
- 本文链接: https://www.blog.ajie39.top/2021/05/05/面试题目总结/
- 版权声明: 本博客所有文章除特别声明外,均采用 LICENSE 下的许可协议。转载请注明出处!