分享下最近面试二十多家公司总结的java高级面试题
目录
前言:
2019年对于我而言是个非常有意义的一年,首先在今年的4月份,毅然离开了待了四年的公司。离开的原因也是有很多,更多的还是个人未来的发展问题。离职后,给自己安排了一个计划,在图书馆泡了一个月。一呢是为了对下份工作的一个面试准备,二呢也是借此机会把一些之前不懂的或者不深入的好好的学习了一遍。
给大家特别推荐一个学习图谱,里面从java基础到深入都总结归纳的很好,也是一个学习很不错的学习路线。
https://github.com/xingshaocheng/architect-awesome
2019年绝对是一个大环境非常不好一年,很多公司都进行了大规模的裁员或者小公司的一个倒闭。因此求职者是非常多的。
所以诶,如果你现在在找工作可不要太乐观!除非你的背景特别好~
听hr讲的是 一个求职岗位不需要一天就收到了几百封简历,因此如果你现在正准备跳槽,需要最好心理准备,或者考虑再等等
同时给大家推荐【脉脉】俗称程序员社区,里面的匿名区值得大家一起沟通交流。
正题:
从五月份开始面试,断断续续面试了有将近二十家(并不是没有面试机会,是因为很多自己的事情需要处理哈),首先我目前做java做了六年,总结出这么多家问的问题都大同小异,也是看面试官的水平。有些面试官技术确实是很厉害的,就问你简历上的东西,从浅至深。也有些非常水的面试官,从他问的第一个问题,你就能看出这个面试官一个真实的水平。所以如果遇到了很水的面试官,就大胆说就行了。有可能面试官自己都不知道答案是什么。
最近都面试的公司具体都有哪些我就不说了,他们都有个共同点,就是java基础和并发这块都非常重视。
以下我是根据功能模块进行划分的,但是面试官肯定不是这样问的,大多数还是一问到底,会设计到多个模块
下面的面试题会持续更新,因为时间都比较久了,很多问题一时半会想不起了,等想到的时候再进行补充~
一:jvm内存模型以及调优篇
-
jvm内存模型这块有了解吗?讲讲你的理解
-
堆外内存是存放在哪的,受不受jvm堆内存大小的限制
- cms和g1的区别
- gc的触发机制是什么
- 新生代使用什么收集器
- 直接内存主要是存放什么的
- 各个收集算法的优缺点
- jvm是怎么确定一个对象是否可达
- java对象有哪几种引用?每种引用的生命周期是什么样的
- 如果线上出现了oom,你是怎么进行排查的(主要考察jps、jstack、jstat、jmap)
- 栈溢出(StackOverflowError)在什么情况下会出现,如果解决
- 使用什么命令调整栈内存的大小
二:java基础篇
- HashMap的底层原理(1.8与1.7的区别必须要说出来)
- HashMap是线程不安全的,并发场景下会出现什么问题
- 遍历HashMap的几种方式,那种更快
- HashMap的扩容是如何实现的
- CounrrentHashmap的底层实现原理,是如果实现安全的
- 计算CounrrentHashmap的size底层是什么样的
- HashTable与CounrrentHashmap的区别
- HashSet与Treeset的区别
- List如果实现排序
- String为什么是final的
- String在内存中是如何存放的
- 设计模式相关(重要,单例就算了...烂大街了)
- 静态变量、静态代码块、代码块、构造函数。在类加载时,他们的执行顺序
- volatile 变量是什么?volatile 变量和 atomic 变量有什么不同
- switch能作用在string和long上吗
- hashmap、treemap的区别
- set的元素是不能重复的,那么是怎么判断一个元素是否重复呢?
- io与nio的区别是什么
- 简述hash的一致性
三:多线程并发篇
- java中都有什么锁
- synchronize与Lock的区别
- synchronize与Lock谁更快?
- 讲讲ReentrantLock这块你的理解
- 什么是可重入锁?有什么前提条件
- Lock的锁是怎么实现的
- Lock的公平和非公平
- 多线程有几种创建方式
- java的线程池有几种
- 线程池的execute和submit的区别
- 线程池有哪几个参数,每个参数代表什么意思
- 线程池的拒绝策略有哪些,分别是什么
- 线程池可以设置哪几个阻塞队列
- 线程池底层是如何实现的,线程执行完毕是如何唤醒等待线程的
- AQS是如何保证线程安全的
- 谈谈你对Threadlocal的理解
- Threadlocal使用完之后需要清理吗?为什么
- 多线程之间如果保证数据的共享以及一致性
- CAS是什么、会出现ABA的问题,如何解决
- shutdown和shutdown的区别
- 多线程中,run和start的区别
- Semaphore信号量的原理
- countlatchdown使用过没,在什么情况下使用
四:mysql以及nosql相关
- mysql中都有什么锁
- 什么时候会使用到行锁、什么时候使用到表锁
- mysql索引的数据结构是什么样的?
- 如果让你设计一个表,你会怎么设计?注重哪几个点
- myisam和innodb的区别
- 聚合索引与非聚合索引的区别
- 都做过什么sql优化
- mysql可以不设置索引吗?为什么
- mysql的特性都有哪些
- mysql的隔离级别都有哪些、默认是哪个
- ACID是什么
- 可重复读会导致幻读吗
- redis都支持什么数据类型
- redis有哪几种持久化方式,都有什么优缺点
- redis的哨兵与集群模式你来讲讲
- 用过分布式锁吗?他是怎么实现的
- 什么是缓存穿透、缓存雪崩、如何避免
- redis有哪几种淘汰策略
- reids过期数据,是如何删除的
- redis是单线程的,为什么还那么快
- redis是如何存储数据的、说说你对哈希槽的理解
- redis和mongodb的区别
- mongodb也有索引,他的底层数据结构是什么样的
- mongodb为何那么快
- mongo的分片是如何实现的
五:消息队列篇
- rabbitmq如果保证了消息的可靠性
- 如何保证生产者把消息发送到rabbitmq
- 如果保证消费者消费了消息
- 如何避免消息重新投递或重复消费
- 使用mq的好处
- rabbitmq消息是如何进行分发的
- rabbitmq如果做失败重试的
- rabbitmq死信的理解
- 探探你对kafka的理解
- kafka如果保证了消息的可靠性
- kafka数据传输的事物定义有哪几种
- kafka的消息是有序的吗
- kafka是如何消费消息的
- 如果kafka中一个broker崩掉了,内部都做了什么是事
- kafka如何保证了消息的不丢失
六:场景篇
- 有一个高并发抢购活动,你如何对这个进行系统设计
- 有个100G的ip登陆信息,现在只有十台台服务器4G的,需找出ip访问最多前十名的ip
- 现在生产出现了oom,你是如果进行排查的
- 经分析,线上有线程出现了死锁,请问你如何进行排查
- 现mysql经常报错死锁超时异常,问你如何进行解决
- 现有一条sql,每次执行耗时500ms,我需要将这个耗时保证在100ms以下,你会从哪几个纬度去分析