随着我们从大三升到大四...秋招也开始了.秋招进行的还比较顺利,刚开始没几天,我的秋招就结束了.
到现在我玩了差不多十多天了,总想着总结一下面经,一直懒.现在就以这篇面经来宣告我的秋招结束吧.....
双非,本科
剑指offer只看了前4道题(现在是看到了第9题了).
左程云的书只看了前2道题.
这是我秋招面的第一个公司,而且也是发挥最好的面试.完全由我自己发挥,让我发挥自己的擅长之处.
1.面试官笑
我傻笑
2.请你自我介绍吧
balabala.....(我哪方面怎么怎么厉害,多厉害什么的)
3.Java集合你都熟悉哪些
util包下的基本都说了...看过几个源码
4.请你介绍一下HashMap和jdk里与其结构相似的集合
1>我就讲了讲Hash的冲突解决方法都有哪些,HashMap采用的是链表解决...红黑树优化....为什么是8,泊松定理什么的....
2>负载因子和扩容策略,连续扩容到64之类的...也就是介绍了各个变量的作用..
3>然后说了说jdk7和jdk8两个版本之间HashMap的区别.
4>讲了讲和HashTable的区别.
5>和ConcurrentHashMap的区别.
6>和IdentityHashMap的区别,
7>和WeakHashMap的区别.然后聊了一下Weak弱引用.
8>接着又说了HashSet等set集合底层使用的是HashMap.
5.讲讲你实习中在公司做的这个项目.
balabala....
(就是涉及到:
1>分布式
2>netty
3>rpc
4>protobuf
6>redis
7>手写lru缓存和优化
这几个关键词...)
6.你对synchronized关键词的了解和对并发的看法.
谈了一下多线程的概念,线程和进程的区别.举了一个死锁的demo,举了一个线程不安全的demo.
然后我就开始介绍synchronized关键词,我还比较擅长这块,就答得比较多:
1>讲了讲锁的语义.
2>synchronized关键词加在成员方法上的时候,底层是在方法表的访问标志中增加了ACC_SYNCHORONIZED.
3>synchronized关键词用在代码块的时候,底层是直接在上下代码中插入了monitorenter和monitorexit.
4>其实本质上都是moniter.
5>还讲了一下synchronized加在静态方法(类方法)上和成员方法上的区别.
7>偏向锁轻量级锁重量级锁的场景和升级的情况.而且只可升级不可降级
9>wait()方法的底层实现.讲了讲底层的_EntryList和WaitSet
10>说了说我的理解:为什么对象都可以作为synchronized代码块的锁.为什么wait方法是在Object类下
11>和lock的区别.比如不能响应中断什么的...
12>锁的粗化
13>锁的细化
14>自旋优化
15>锁消除.用StringBuffer举的例子.
7.写个sql查询.
我:sql不太会,nosql比较会.
面试官:没事,给你个简单的俩表连接查询
8.nosql你是熟悉哪种
我:redis
9.讲讲redis任意一个数据结构吧
我挑了最简单的SDS讲的...跟java的AbstractStringBuilder作对比,讲了讲两个的扩容策略和细节上的区别.
10.redis的字典和java的HashMap做个比较吧
(我当时没想出来...面试官说了值后我才想起来....扩容的时候增量同步之类的...)
11.redis的持久化
讲了两种持久化的格式,和优缺点,和新版的优化.(之前可以肉眼看持久化文件的,所以就讲了讲持久化文件的格式....现在不行了,好久都忘了)
12.线程池你用过吗
我就介绍了一下java的线程池ThreadPoolExecutor里的每个参数...
13.介绍一下线程池的拒绝策略...
我就讲了jdk实现的四种.然后讲了一下我再github上看到的另一种实现...就是放进新队列里,以更低优先权的方式进行调度.
14.线程池什么时候回收线程怎么回收线程
这块没答好....不太会...
15.链表如何优化查询效率
跳跃表
16.来写个代码吧.手写个小算法.两个有序链表合并为一个有序链表.
送分题...假装不会...一脸认真地写....
贝壳二面面试官人很直爽,很不错.只是对我简历中的第二个项目很不满意,而且我表述又不清.聊得很不好.
1.Java反射,比如如何修改一个变量.如何修改static+final同时修饰的变量.
因为static和final同时修饰时,直接用反射是无法进行修改的..回报异常.应该反射Method来去掉final修饰符.然后用反射来修改该变量.修改完了后再反射Method把final修饰符加上.
2.你为了这个项目自己实现了一个Objenesis讲讲呗.为什么这么做...
从这里开始和面试官聊得很不来....一直在聊项目....
3.谈谈你项目的架构.从客户端到缓存到redis持久化和mysql持久化等等,一致性hash等等....
4.你还有没有什么问题
有.讲了讲面试中的误解.面试官说我不能答到问题的点上.说我技术本身没有大问题,说我的沟通能力很差.
我就解释了一下我母语不是中文,面试官突然惊讶一下...
二面还是给我通过了...
1.你是哪里人
2.对加班的看法
3.为什么不留在上一家公司(我实习的公司)
4.你还有什么问题
我:没有
1.自我介绍
2.讲解项目
1>一致性哈希
2>缓存
3>微服务
4>......
3.来写个算法吧
然后我没写出来.......
4.写个sql吧,根据业务进行一个查找
墨迹了半天,我也没写出来....(中间伴随着面试官烧热水...喝热水...还听到隔壁在聊布隆过滤器...分神了)
5.linux你用过吗
我:用过,实习的时候在服务器上查个日志什么的
面试官:用过哪些命令
我:greptoptcpdump
我:不会....
6.讲一下HashMap吧
1>我就讲了讲Hash的冲突解决方法都有哪些,HashMap采用的是链表解决...红黑树优化
2>负载因子和扩容策略,介绍了各个变量的作用..
3>jdk7和jdk8两个版本之间HashMap的区别.
4>和HashTable的区别.
7.gc你熟悉吗
我:一般吧(其实我还是挺擅长gc和jvm的,我怕骄傲了不好...)
面试官:两个垃圾对象互相引用的时候,jvm会不会成功回收这两个对象.
我:会.因为不是引用计数,是根据可达性.
(然后就下一题了...我还想继续往下讲呢....jvm就这样问完了....)
8.数学学的怎么样都学过哪些科目
我:线性代数,高等数学,复变函数,概率论
面试官:考你一道数学题吧
我:数学都忘了....
面试官:没事,一道概率题.现有一个苹果,甲乙两个人都想吃.于是决定抛硬币.俩人轮流抛,直到有人抛到正面为止.谁先抛到正面,谁就可以吃苹果.当甲先抛的时候,甲有多少概率吃到苹果.
我:我用本方法推出了公式...最后算极限的时候没推出来.最后面试官告诉了我,甲乙第一轮都没抛成功的时候,第二轮重新抛的概率等于首轮抛硬币的概率......
9.数据库分库分表的设计
10.千万并发下的架构设计
11.红黑树的特性和旋转,和AVL树的区别
12.又是一道手写算法
13.你认为你哪方面做的很好,或者如何胜任这个职务呢
(我就豁出去,自己强答了一波并发,面试官当时在敲键盘,我就自言自语了)
然后我就讲了讲javacas.从Atomic类讲到jdk的c++代码,又讲了内联汇编.又讲了必须要在cmpchg指令的第二操作数是内存寻址时才可以加这个lock前缀.又讲了cmpchg指令和EAX寄存器比较时,成功和失败分别对应着哪种影响.讲了讲x86架构下lockcmpchg指令的作用.(锁总线所缓存行总线嗅探之类的).
然后又说了LockSupport下的park和unpark.
然后说了先unpark再park会导致什么..为什么会这样..
1.假设一个人不知道netty,你会怎么样给他介绍,如何使用,以及他的优点
2.为什么要nio,不用nio会怎么样
3.你对异步的理解
4.对Actor模型的认识
5.线程和性能的关系
简单来看的话,多线程执行会比单线程处理要性能高.但这不是绝对的.就像高并发下的cas争抢,会导致cpu忙轮询.线程开启过多,会给cpu很大负担.
比如synchronized的优化,让同步锁在失败时自旋,在少量争抢时是一种优化,挂起操作在少量争抢时是一种很不必要的耗时操作.但是高并发下,大规模的cas任务失败,反而会加大cpu负担,大部分的失败应该直接悲观地挂起,这样会减轻cpu的负担.
6.线程池的活跃线程个数订制在多少个比较合适需要考虑哪些因素
7.字符串,动态规划,背包.三道题你选一个手写代码.
1.你平时写代码是喜欢自动导入代码,还是喜欢每一个字母都手敲
2.开始讲公司福利
3.现场发offer
【2019年4月16日更新】
过了半年,面试内容忘了...没有及时记录下来。我就简单记录一下面试中的几个难题吧。
一面面试官,问我protobuf的原理,让我设计一个类似的框架进行rpc操作。
二面面试官,问了点cas的东西,我给他讲了atomic包里的实现。
三面面试官,问了happenbefore,java内存模型,设计模式,以及每个设计模式用和不用的区别。