2019秋招Java面经(未完待续)

2019秋招Java面经(凭记忆回忆, 可能不准)

随着我们从大三升到大四...秋招也开始了. 秋招进行的还比较顺利, 刚开始没几天, 我的秋招就结束了.

到现在我玩了差不多十多天了, 总想着总结一下面经, 一直懒. 现在就以这篇面经来宣告我的秋招结束吧.....

我在整个秋招期间在技术面没有挂过(贝壳 去哪儿 美团 百度, 百度金融. ...), 不喜欢收割offer, 觉得没意思而且浪费时间, 我只去参加自己中意的公司的面试.

而且我也不看钱(年薪二十万以上就可以了, 挣大钱是以后的事情[最终拿到的最低的offer年薪22万]), 我现在更关注公司的技术对我的发展会不会有很多帮助. 

学历情况

双非, 本科

算法学习情况

剑指offer只看了前4道题  (现在是看到了第9题了).

左程云的书只看了前2道题.

贝壳 提前批一面(大概80分钟?)

这是我秋招面的第一个公司, 而且也是发挥最好的面试. 完全由我自己发挥, 让我发挥自己的擅长之处.

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

       5> http

       6> redis

       7> 手写lru缓存和优化

这几个关键词...)

6. 你对synchronized关键词的了解和对并发的看法.

谈了一下多线程的概念, 线程和进程的区别. 举了一个死锁的demo, 举了一个线程不安全的demo.

然后我就开始介绍synchronized关键词, 我还比较擅长这块, 就答得比较多:

     1> 讲了讲锁的语义.

     2> synchronized关键词加在成员方法上的时候, 底层是在方法表的访问标志中增加了ACC_SYNCHORONIZED.

     3> synchronized关键词用在代码块的时候, 底层是直接在上下代码中插入了monitorenter和monitorexit. 

     4> 其实本质上都是moniter.

     5> 还讲了一下synchronized加在静态方法(类方法)上和成员方法上的区别.

     6> synchronized相关的知识点--对象头结构

     7> 偏向锁  轻量级锁  重量级锁的 场景和升级的情况. 而且只可升级不可降级

     8> synchronized相关的jvm参数   比如关闭偏向锁 -XX:UseBiasedLocking=false  之类的...还有更改默认自旋次数的一个...忘了...

     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. 你还有没有什么问题

有. 讲了讲面试中的误解. 面试官说我不能答到问题的点上. 说我技术本身没有大问题, 说我的沟通能力很差.

我就解释了一下我母语不是中文, 面试官突然惊讶一下...

二面还是给我通过了...

贝壳 hr面(大概20分钟)

1. 你是哪里人

2. 对加班的看法

3. 为什么不留在上一家公司(我实习的公司)

4. 你还有什么问题?

我: 没有

去哪儿网 一面(大概80分钟)

1. 自我介绍

2. 讲解项目

         1> 一致性哈希

         2> 缓存

         3> 微服务

         4> ......

3. 来写个算法吧

然后我没写出来.......

4. 写个sql吧, 根据业务进行一个查找

墨迹了半天, 我也没写出来....(中间伴随着面试官烧热水...喝热水...还听到隔壁在聊布隆过滤器...   分神了)

5. linux 你用过吗?

我: 用过, 实习的时候在服务器上查个日志什么的

面试官: 用过哪些命令?

我: grep top tcpdump

面试官: 想只要一个关键词在文章中出现的行数, 怎么统计?

我: 不会....

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. 你认为你哪方面做的很好, 或者如何胜任这个职务呢?

(我知道我前面答得很差, 算法和sql和花了很久时间都没写出来, 基本上是挂了. 而且linux也没答出来. 我擅长的 jvm/并发/jdk集合源码 都没考我...)

(我就豁出去, 自己强答了一波并发, 面试官当时在敲键盘, 我就自言自语了)

我就跟面试官说: 我平时学习中特别喜欢java并发相关的内容, 而且学的很底层, 保证跟其他来面试的同学讲解的不一样, 或者更底层.

然后我就讲了讲java cas. 从Atomic类讲到jdk的c++代码, 又讲了内联汇编. 又讲了必须要在cmpchg指令的第二操作数是内存寻址时才可以加这个lock前缀.又讲了cmpchg指令和EAX寄存器比较时, 成功和失败分别对应着哪种影响.  讲了讲x86架构下lock cmpchg指令的作用. (锁总线 所缓存行 总线嗅探 之类的) . 

然后又说了LockSupport下的park和unpark. 

然后说了先unpark再park会导致什么..为什么会这样..

去哪儿网 二面

1. 假设一个人不知道netty, 你会怎么样给他介绍, 如何使用, 以及他的优点?

2. 为什么要nio, 不用nio会怎么样?

3. 你对异步的理解

4. 对Actor模型的认识

5. 线程和性能的关系

简单来看的话, 多线程执行会比单线程处理要性能高. 但这不是绝对的. 就像高并发下的cas争抢, 会导致cpu忙轮询. 线程开启过多, 会给cpu很大负担. 

线程之间如果过度地进行时间片轮转, 进行调度切换, 有时性能还不如单线程.

比如synchronized的优化, 让同步锁在失败时自旋, 在少量争抢时是一种优化, 挂起操作在少量争抢时是一种很不必要的耗时操作. 但是高并发下, 大规模的cas任务失败, 反而会加大cpu负担, 大部分的失败应该直接悲观地挂起, 这样会减轻cpu的负担.

6. 线程池的活跃线程个数订制在多少个比较合适? 需要考虑哪些因素?

7. 字符串, 动态规划, 背包. 三道题你选一个手写代码.

去哪儿网 hr面

1. 你平时写代码是喜欢自动导入代码, 还是喜欢每一个字母都手敲?

2. 开始讲公司福利

3. 现场发offer

美团 

【2019年4月16日更新】

过了半年,面试内容忘了...没有及时记录下来。我就简单记录一下面试中的几个难题吧。

一面面试官,问我protobuf的原理,让我设计一个类似的框架进行rpc操作

二面面试官,问了点cas的东西,我给他讲了atomic包里的实现。

三面面试官,问了happen before,java内存模型,设计模式,以及每个设计模式用和不用的区别。

百度金融(度小满)

回忆中...

posted @ 2018-09-25 19:40  GoldArowana  阅读(1893)  评论(4编辑  收藏  举报