1.前言开胃
原本风和日丽的一个下午
突然接到了阿里健康HR的电话问我什么时候有时间,莫名交流后拍定五分钟后见! 电话面试,时间半小时左右。
然后随便找了广场准备迎接洗礼!
下面进入正题。
2.正题来了
五分钟一到,面试官如约而至,我也怀着激动不安还有点手抖的接起了电话。
互相问候了一波紧接着就开始对线,首先迎来的是项目。在大学都做过什么项目?主要学习了什么?
这个问题可能就是我唯一一个好答得,我必须拖住时间好好说说我大学都做过什么。生怕后边就成他问我不了解的模式
然后说完之后紧接着就是框架?
第一个问题(框架开胃菜)
面试官:Mybatis中的mapper是接口对吧,它可以注入到Service层,那么为什么一个Mapper接口可以注入到Service层呢?
当从Spring中获取Mapper接口时,将会调用对应的MapperFactoryBean的getObjects方法,该方法返回值即为对应的MapperProxyFactory创建的MapperProxy动态代理
以上是标准答案,但是是我下来看完之后才知道的。因为第一个问题我不能说我不知道,要不印象分得拉多低呀!所以我打算放手一搏说出自己的想法
我:我没有看过但是我可以谈谈我自己的理解,Mybatis 是ORM框架,其中会使用代理模式给我们生成代理类,其实我们拿到的是接口的代理类,所以说注入的也是代理类。
面试官:答到点子上了
这下算小小的放心一点了
第二个问题(顺藤摸瓜)
面试官:既然你谈到了动态代理,那你知道动态代理的有哪几种方式有什么区别吗?
我: 动态代理的方式有两种,一个是基于JDK proxy的动态代理另一个Cglib两种方式。然后JDK动态代理是基于接口实现的动态代理,Cglib是基于继承的
面试官:好
此时我已经不是那么紧张了因为我自认为得到了面试官的肯定
第三个问题(继续框架)
面试官:Spring 的Scope你知道哪几种?
我:1、singleton 2、prototype 主要是这两种还有Session那些不常用的记忆不是很深刻
面试官:好,那可以说一下Bean的生命周期吗?
我: 八股文般的背了下来(具体的我就不说了 有想了解的伙伴可以看我这篇博客SpringBean生命周期)
面试官:你是看过源码吧
我:看过,但是看完容易忘,现在也就是反复看理解的一个过程,上述是我自己的理解
接下来面试官就转移阵地了
后来全是(JAVA基础)
-
说一说重载和重写有什么区别?
相信对一个学习过JAVA的人来说再没有比这个更简单的了(除了问8种基本数据类型)
这里博主就不给出我是怎样回答的了 -
用Runnable 和Thread实现线程有什么区别
当然一个是基于接口一个是基于继承 这个大家也并不陌生,我也是这么回答的。 -
调用start()方法线程进入什么状态
就绪状态等待CPU的调度
- 构造块知道吗?
在我回答知道的时候我本以为是要问我静态代码块、构造块那些的执行顺序结果竟然和我想的不一样
-
构造快是在什么时候被加载的 ?
我的回答是在JVM类加载时候的初始化阶段被加载的 -
顺藤摸瓜问我那你知道JAVA内存划分吗?
这里捋清楚了思路 类加载器、运行时数据区、执行引擎、本地方法库 然后运行时数据区包含:虚拟机栈、本地方法栈、程序计数器、堆、方法区。 -
那你说一下堆的细分
这里回答的时候新生代、老年代然后 永久代/原空间做了区别去回答 -
接下来面试官继续问 有个Person类,然后我们Person person=new Person()这个Person对象在哪呢?
这里大部分人可能会回答堆区,但是我要想得到他的肯定我不能这样回答呀
于是我的回答:如果这个对象经过逃逸分析,没有逃逸出方法那么会在栈上分配,如果逃逸出方法的话是在对上分配 -
好的 那final static 这些关键字是存在哪呢 ?
运行时数据区的运行时常量池中
当时我对自己答案不是很肯定。幸好面试官没接着往下问,当然下来我查看了一下确实是在运行时常量池。只不过我没有细分开回答 。给了个笼统的 这里有点点小瑕疵。
转战集合源码
-
HashTable 和HashMap有什么区别知道吗?
首先这个问题我知道是要问线程安全了 于是我把线程安全放在第一点,HashTable是线程安全的而HashMap是非线程安全的。还没说完面试官直接打断,这就说明我的问题到他的点子上想问的了 -
那你说一下他是怎么实现线程安全的
这里我说了通过给方法加synchronized关键字来实现的 -
那其余的你还知道哪些线程安全的容器
我说了ConcurrentHashMap、Vector -
追问 那ConcurrentHashMap 用的什么数据结构知道吗?
JDK1.7:数组+链表+ReentrantLock
JDK1.8:数组+链表+红黑树+Synchronized+CAS -
那ConcurrentHashMap和HashTable都是线程安全的他俩有什么区别或者应用场景吗?
这里我主要从HashMap锁粒度细展开来讲HashMap支持的并发度高 -
ConcurrentHashMap初始化容量是多少? 怎样扩容的?
16 扩容的话引出来个扩容因子 二倍扩容 -
扩容因子为什么是0.75
如果高了可以提高空间利用率,但是hash冲突高了
低的话Hash冲突低但是空间利用率低,经过反复测试0.75效果最好所以是0.75
前方高能开始问多线程了
-
进行和线程有什么区别能说一下吗?
线程是操作系统调度的最小单位,一个进程可以拥有多个线程 -
可以举个例子吗?一个QQ是一个什么?
我就举例:一个QQ、一个微信都是一个进程,在QQ中可以同时和多个人聊天,开聊条窗口可以把这个看成一个一个的线程。 -
什么是公平锁?什么是非公平锁
-
Synchronized 是公平的还是非公平的?
这里我愣了一下然后面试官引了我一下答出来是非公平的 -
问了ThreadLocal 是什么
我就简单回答了ThreadLocal的作用,为每个线程提供变量副本,说了一下JMM工作模型 -
线程池的工作原理能说多少?
这里我大概简述了一下工作原理,和几个重要的参数。
基本到这里面试就结束了,其余的问我在学校的情况。拿没拿过奖学金这些问题。
这篇博客以对话的形式给大家展现我面试的过程,希望自己能顺利通过,顺便如果对你有用记得别忘了三连