百度商业变现Java后端二面面经
本来约的今天晚上七点,下午面试官加微信说到时候可能有事改到了八点,然后八点会议没结束我又等了大概20多分钟才开始。
开头还是自我介绍,自我介绍和项目介绍完之后,面试官说先聊一下java基础知识,后面再聊项目。
面试官先问了解Java中的HashMap吗,先说一下数据结构。然后问为什么是转成红黑树而不是其他树,我说红黑树是平衡二叉树的一种实现,最坏情况下查询复杂度也是O(log n)的,然后面试官说红黑树是自旋树,对它的插入操作有了解吗。我说忘了,只记得红黑树的Node有颜色属性,插入时需要保证两段路径不能全红,具体怎么旋转之类的忘了。然后问了对HashMap的put操作了解吗,说一下大致的过程。说完问对HashMap的put可能导致死锁了解吗,幸亏之前看过多线程环境下HashMap扩容可能死锁的内容,就大概说了一下为什么有可能造成死锁。然后问对ConcurrentHashMap有了解吗,我说ConurrentHashMap是通过给Node加synchronized保证不会出现死锁,面试官说是synchronized吗,我有点犹豫了,因为这块看的不是很仔细。然后面试官问那ConurrentHashMap和HashTable有什么区别。面试官说HashTable答对了,ConcurrentHashMap回头自己再看看。
然后问对Collection有了解吗。我有点懵,问面试官是指什么方面,面试官就说比如平时用过Collection的什么方法,或者具体的实现类。然后我说是指ArrayList和LinkedList吗,然后面试官问那就说一下ArrayList和LinkedList的区别。然后问ArrayList和LinkedList遍历的时候速度有差别吗,Iterator遍历的时候速度有差别吗。
然后问对线程安全的理解是什么?我回答的时候提了synchronized,于是又问我平时怎么用的synchronized关键字,我说大一写Android的时候写过单例。然后让我写一下单例模式的代码,于是让我讲一下volatile和synchronized,讲完问我synchronized是怎么实现的。答了基于Monitor对象的进出,提到了对象头Mark Word中的标识信息,然后问锁的各种状态有了解吗,它们都在什么时候转化。答了无锁、偏向锁、轻量级锁、重量级锁的概念。然后又问我平时怎么用synchronized实现线程安全的,我说就单例和最近写的项目中模拟秒杀用了synchronized,然后优化用了redis的分布式锁。于是又问我分布式锁的实现,SETNX和GETSET的作用。我说完怎么实现的分布式锁之后,面试官说有没有考虑过其他的实现,比如用redis的原子减或者java中的原子类,我说没有...
然后就是问MySQL了,先问了聚集索引和非聚集索引的理解。然后问了Innodb索引的结构和为什么用B+树,然后问了联合索引,给了一个sql语句问会不会走联合索引。
到这大概面了四五十分钟左右了,面试官说现在聊聊项目。没问我深度学习的项目,问了最近学习SpringBoot写的后端项目,问了一下实现的功能,创建的表的结构,因为这个用到了微信支付,所以又具体问了用户支付的流程以及如果微信的异步通知传给后端时服务不可用应该怎么做。我说我这就是个体验微信支付的demo,没有考虑那么多。
最后就是反问,我问后续通知大概多久会收到(感觉自己前面答得不是很好,而且面试官问的对xx的理解感觉自己回答的比较差差不多凉了),面试官说今晚有点晚了,最晚明天会通知,然后说还可以,算过了。(属实没想到)然后说一面记录我对框架不熟,所以二面没有问spring框架,以后可以好好看一下框架的知识。