以下题目是本人(工作一年跳槽)面试的真实经历,记录了以下面试官常问的问题。这儿就不给具体答案了,有些东西我自己也不知道,大家可以自行百度。
Java基础
- JVM内存分配原理,垃圾回收原理,垃圾回收算法
- 常见集合List、Map、Set的几种实现类的区别、底层实现原理以及使用场景
- LinkedHashMap如何保证有序的以及扩容机制
- 多线程创建的几种方式,现场池的原理和你常使用的线程池的类,自定义线程池
- 现场安全问题,synchronized、volatile 以及Lock的实现、区别、使用场景
- ThreadLocal的作用及使用场景
- Stream流操作过程中的几个常见方法及其作用
- hashCode()和equals()什么时候需要重写,为什么两个方法必须一起重写?
Spring
- Spring IOC和AOP 的实现原理,底层实现技术(反射 + 设计模式)
- Spring的启动过程(经常问)
- Spring的Bean的生命周期(经常问)
- SpringMVC原理
- SpringBoot的启动流程,自动装配的实现
- SpringBoot和SpringCloud的区别
Redis(PS:Redis是单线程的)
- Redis 数据类型(String、List、Map、Set、ZSet)
- Set和ZSet的区别,ZSet什么场景使用,以及如何使用(热度排行榜)
- Redis有哪些作用?(缓存、消息队列、分布式锁)
- Redis的主从、哨兵、集群模式的区别
主从:一主多从,主从服务存存储一样的数据,主用于写,从用于读,提高了一定的效率;
哨兵:解决了主服务器宕机后的服务失效问题,自动切换从服务器为主服务器;
集群:在哨兵模式基础上真正意义上解决了分布式存储问题,有多个主服务器,每个主服务器可以有多个从服务器;同主从模式一样,主用于写,从用于读;但不同的是主服务器之间使用卡槽原理,将整个Redis集群分成了16384个卡槽,这些主服务器平分这些卡槽,采用crc16算法计算每个数据要存储的具体卡槽。每个主服务器存储的数据不一样 - Redis分布式锁如何实现?
setnx()命令可以实现,但是在高并发场景下可能出现问题,推荐使用Redisson中间件实现 - Redis持久化机制(RDB和AOF)
- Redis集群如何扩容
- MySQL和Redis双写不一致问题如何解决?
延迟双删:不推荐,只是减少了这种概率,不能从根本上解决问题,并且会影响系统的性能;
Redisson的读锁和写锁:对读操作加读锁,其他线程可以继续读;对写操作加写锁。 - Redis为什么快?(基于内存 + 多路复用技术)
MySQL
- MySQL存储引擎(MyISAM和InnoDB)的区别,PS:存储引擎是针对表的,不是数据库
- MySQL索引类型、索引优化、索引底层结构及原理
- MySQL优化(几乎所有面试都会问)
分库分表、索引、SQL语句等 - MySQL执行计划怎么查看?(explain关键字),如何理解其中各个字段的含义
- in关键字和exists关键字的区别及使用场景
- 乐观锁及悲观锁如何实现,使用场景
乐观锁:加version字段,每次跟新比较是否相同
悲观锁:- for update(排他锁):MySQL为每个INSERT、UPDATE、DELETE语句自动加for update,此锁属于行级锁,SELECT语句不加任何锁
- lock in share mode(共享锁)
- MySQL去重关键字(distinct)
设计模式(经常问)
自己在项目中用到哪些设计模式,什么场景下使用的?(经常问)
Spring中用到了哪些设计模式,用在哪里?
JDK用到哪些设计模式,体现在哪里?
分布式
由于我本人之前的工作没有接触过分布式,所以面试官问的相对少
- SpringCloud的插件及作用
- SpringCloud解决了CAP中的什么问题
- Dubbo服务调用过程
- Dubbo核心组件、序列化机制、注册中心
- Dubbo和SpringCloud的区别(Dubbo是底层是RPC,SpringCloud是RESTful)
- Zookeeper的ZAB协议
- Zookeeper解决了CAP中的什么问题
- Zookeeper如何实现分布式锁的
- 分布式锁和分布式事务如何处理
消息队列等中间件
- RabbitMQ用来干啥?如何保证可靠性投递
- RabbitMQ底层主要组件等等
项目问题
这个结合自己的项目回答就好了,但一般主要还是根据你项目中所用到的技术来问
- 你的项目主要功能?解决了什么问题?
- 你在项目中使用了哪些设计模式,什么场景使用的?如何实现的?(经常问)
- 项目中用的技术都用在哪些地方实现了什么功能?(比如:Redis:实现了缓存和分布式锁,如何实现的?缓存是读缓存还是写缓存?为什么这样做?)
- 你工作过程中有没有SQL优化经历,怎么优化的?(经常问)
- Linux下的问题排查经验有没有?怎么排查的?日志如何查看的?
- 你工作中遇到的最棘手的问题是什么?如何解决的?
- 现在让你实现一个分布式框架,你觉得应该考虑哪些问题?
- 为什么跳槽?