题目
1、做一下自我介绍吧,简单说一下你的项目?
2、有遇到过内存泄漏吗?你们是怎么解决的?这个前阵子确实遇到过一次,还算运气比较好。
3、java的基本类型有哪几个?String是不是java的基本类型?String为什么要是final类型的?
4、反射机制的底层实现是什么?动态呢?动态的实现原理?
5、HashMap
了解吗?说一下HashMap
相关的一些东西?HashMap
是线程安全的吗?为什么是线程安全的?ConcureentHashMap
了解吗?他是如何实现线程安全的?你刚才说1.8基于CAS
?CAS
的ABA问题怎么解决?
6、说一下JVM的线程模型?这些区域都分别是干啥用的?Java
线程模型和JVM
线程模型注意区分、总结下,网上很多文章都是错的。
7、说一下java类加载器的工作机制?类加载在那个区域进行的?
8、说一下java的线程模型?violate了解吗?他的原理是什么?violate是线程安全的吗?为什么不是?
9、保证线程安全的解决方法有哪些?说一说读写锁吧,读写锁的读
10、数据库的索引有哪几种?为什么要用B+树来做索引?组合索引和几个单个的索引有什么区别?数据库的大表查询优化了解吗?MVCC
机制了解不?MVCC机制有什么问题?怎么去解决这个问题?MySQLmysql
慢语句调优做过吗?说说你是怎么做的?
11、Redis
了解吗?你说说怎么用Redis
实现分布式锁?
12、Spring
中Bean的作用域,Spring MVC
的controller
是线程安全的吗?怎么去保证线程安全呢?
(面经来自于网友:两年工作经验、山鲁亚尔)
看完上面的这些题目,你觉得自己能回答上来多少?按照100
分制,你给自己多少分?
问题分析
1、做一下自我介绍吧,简单说一下你的项目?
两个问题,一是做一个自我介绍,另外就是介绍项目,项目介绍你最熟悉的,或者最能拿出手的项目,不一定就是最近在做的项目。
2、有遇到过内存泄漏吗?你们是怎么解决的?这个前阵子确实遇到过一次,还算运气比较好。
这个问题,就是靠平时总结,如果真的没有遇到过,也是可以自己模拟的,然后使用各种命令和工具进行排查。在面试时候被问到,就大致说一下排查思路,排查过程中用到的命令和工具就可以了。
3、Java的基本类型有哪几个?String是不是Java的基本类型?String为什么要是final类型的?
前面两个问题都是考察基础的,第三问就得自己反思了,为什么要设置成final类型,就得想想final修饰类的时候,有什么特性?在这里起到什么作用?
4、反射机制的底层实现是什么?动态呢?动态的实现原理?
这个也算是考察基础知识是否扎实,重点在动态,以及动态和反射的关系。
5、HashMap
了解吗?说一下HashMap
相关的一些东西?HashMap是线程安全的吗?为什么是线程安全的?ConcurrentHashMap
了解吗?他是如何实现线程安全的?你刚才说1.8基于CAS?CAS的ABA问题怎么解决?
这是几个问题,
HashMap
的问题
- 你得说一下HashMap是什么,
- 底层采用什么数据结构实现的,
- 最好说一下put的过程
- JDK版本各版本中是怎么样的。
- HashMap为什么是线程不安全的?
ConcurrentHashMap
问题
ConcurrentHashMap
是什么?ConcurrentHashMap
底层数据结构是什么?JDK
版本不同,ConcurrentHashMap
在设计上有些什么区别
CAS
问题
CAS
是什么?CAS
存在什么问题ABA
问题是什么ABA
问题如何解决别想看这个题目,很多人都挂在这个题目上。背背面试题,再加上稍微一点点的理解,这些问题都能应对。
6、说一下JVM的线程模型?这些区域都分别是干啥用的?java线程模型和jvm线程模型注意区分、总结下,网上很多文章都是错的。
考察的是JVM内存模型,通常也是考察JVM运行时数据区,注意,这里千万别把Java内存模型搞进来,Java内存模型叫做JMM。
说到JVM运行时数据区,就会提到线程私有和线程共享。
尤其是Java虚拟机栈、堆、方法区,这三个一定的说清楚。
栈和线程的关系是什么?栈中存放的是什么?为什么会SOF?
堆和对象内存分配有关系,所以肯定会聊到对象的生命周期,那就会聊到类是怎么被加载到JVM中的?如何判断一个对象已经死了?同时也会聊到垃圾回收算法有哪些?垃圾收集器有哪些?最新的垃圾收集器是什么?有什么特性?
熟悉哪些JVM调优参数?
这个问题,也是很大部分人会挂的,我也在线模拟面试过很多人,聊到JVM这一块,90%都会挂。
7、说一下Java
类加载器的工作机制?类加载在那个区域进行的?
上面问题中说过了,这个类加载相关的肯定会问,表示你对一个类是怎么从
.class
文件到Class对象
,再到实例
的过程,看看你熟悉多少这些问题也可以从侧面反馈到,你对你每一行代码是怎么运行,会存在什么问题是否有所知晓。
8、说一下Java的线程模型?volatile了解吗?他的原理是什么?violate是线程安全的吗?为什么不是?
Java线程模型你得熟悉一下,volatile也得了解一下,有什么特性,可见性、防重排、原子性。这些也得去了解一下。
这个问题理论性比较强,背背面试题,基本上能搞定。
9、保证线程安全的解决方法有哪些?说一说读写锁吧,读写锁的读
这些都是理论性的,背背面试题就能解决,不是一定要使用过。自己下去好好准备一下就可以了
10、数据库的索引有哪几种?为什么要用B+树来做索引?组合索引和几个单个的索引有什么区别?数据库的大表查询优化了解吗?MVCC
机制了解不?MVCC
机制有什么问题?怎么去解决这个问题?MySQL
慢语句调优做过吗?说说你是怎么做的?
这个相当于是
MySQL
数据库的8连问,8个连环炮你能回答上来几个?基本上也都是平时多看看面经,背背面试题也能应对。
11、Redis
了解吗?你说说怎么用Redis
实现分布式锁?
这个问题,其实看起来简单,回答起来没那么简单的,
这里社交很多东西,不是简单的
setnx
,LUA脚本
就能解决的,涉及到Redis
集群模式,涉及到业务超时等问题。面试官都是给你安排好的,这个得有些真材实料,背面试题只能应付比较肤浅的面试官,遇上认真点的面试官,那就得用自己的真材实料去回答了。
12、Spring
中Bean
的作用域,Spring MVC
的controller
是线程安全的吗?怎么去保证线程安全呢?
这个问题,这里就没有再扯了,因为各大公众号,我的这个公众号之前也发过类似的文章,所以有空别小看公众号的重要性。只是在于积累,平时在车上、地铁上、工位上休息的时候,可以借助于一些琐碎的时间去看一些技术性的公文章,积累自己的认识。
总结
实话实说,上面90%的问题,我们都可以通过背面试题来解决,可能存在个别题需要自己真的去体会体验过才可以搞定。
但是个人始终认为:五年以内的工作经验,面试基本上可以通过背面试题来解决。