快手 java后端开发 实习 一面

1、自我介绍

2、哪个项目给你带来了哪些提升?分着说了几个项目,从产品、业务、上线项目、需求对接等方面说了一下几个项目

3、这是后端岗,能不能说一下对技术上提升的项目?说了数据中台的项目,讲了讲自己的两个认为的两个亮点。功能设计上共享屏幕展示了几个数据库表的设计,代码上讲了一个自己写的外键依赖管理的工具。

4、问了一下工具的使用场景

5、又讲了一个主要做JOB的项目,遇到的问题大概是由于需求不明确就开始coding导致的返工,长了教训。

6、讲一下java里面list的实现,几种实现有什么不同。array、linked。

7、具体在什么场景下应该用哪种。面试官逐步引导,我说了数组扩容、空间浪费、随机读写、等问题。面试官引导,问从尾部插入数据效率如何,看起来linked没有任何优点。然后突然醒悟,又说了头插法插入时的数组整理问题。

8、并发安全list是什么怎么实现的。忘了,我说能不能说hashmap,面试官说可以

9、hashmap怎么实现的,ConcurrentHashMap怎么实现的。说了1.8为分割的前后两个的实现差异以及搜索效率。这里没怎么说ConcurrentHashMap的加锁机制。

10、面试官开始引导,问如果是你你该怎么设计给某个hashmap加锁。我理解的有点远,先说了线程死锁的条件,面试官发现扯得有点远赶紧往回引导,说就说你怎么设计给ConcurrentHashMap加锁吧。然后开始讲给整个MAP加锁的问题,锁的粒度,读写锁的应用,锁升级都主动说了一下。

11、面试官问锁升级机制的几个锁,如果是你你怎么去实现。说了个无锁的场景以及为什么无锁,后面从偏向锁开始就忘了原理,开始胡扯说CAS复制对象头什么的,扯了半天说不下去了。

12、怎么在实践中用锁的。说了一个项目的双队列缓冲机制,解决两个层的运行速率不同的问题。

13、线程和进程的区别。这边八股忘光了,靠举例子说的。

14、面试官没问出来想问的问题,开始引导,你如何选择使用线程或者进程呢,什么时候用线程什么时候用进程。设想场景,要处理10万条数据。然后说了线程上下文和进程上下文的区别,如何设置线程数,JVM里面线程和进程的区别。最后回答的答案是如果仅仅是单主机,那就单进程多线程,根据内核数定线程数。如果是多主机分配,那就每个主机各自一个进程,然后多线程。然后又讲了一下JVM的内存模型,证明切换进程的开销。

15、JVM内存模型里的堆和栈有什么区别。堆中存对象,栈中存方法调用关系,参数,中间计算数据等。然后主动补充如果开启了逃逸分析会有可能在栈中存对象。

16、栈中存的到底是指针还是对象。一下子被忽悠瘸了,想了半天没想明白,然后从头给面试官捋的。JVM内存全部都在内存硬件里面分配,所以堆中存对象也不会很快加速方法的执行,因为整块内存都具备随机读取的能力,所以存引用指针仍然可以通过两三次寻址找到堆中存的对象,这个过程是非常快的。所以存指针也没问题,存对象的话反而会因为栈的高频变动造成不必要的换入换出损耗,将对象放到堆中,由特定的清理算法去清理更好。

17、设计模式了解哪些。什么是设计模式。

18、数据库你写了mysql、redis,说一下mysql的innodb与MyISAM的区别。只记得了对事务的支持,说事务意味着同一时间的高并发。面试官赶紧打断说怎么个事。我又补充说前提是保障数据可靠性,不会在多线程情况下造成脏读幻读等等问题。又说了什么情况下选什么引擎。

19、还有其他方面的区别吗。想不起来了,面试官说那就算了。

20、事务是怎么实现的。先讲了ACID。面试官直接开始问ACID到底是什么意思,为了保障什么。然后背四个隔离级别,MYSQL默认的RR,通过MVCC加锁解决了一部分幻读。

21、算法题:leetcode.5最长回文子串。服了,一眼看出来思路但是写的太复杂了,写了半天没写完。面试官最后说对着代码讲一下思路,分析一下时间复杂度。

22、反问:部门业务、BASE、有哪些需要改进的地方。

总结:面试时长1小时,非常爽,回放发现自己很多地方都有表述问题,说着说着说兴奋了就跑远了,还得是面试官循循善诱。

#快手##java##后端##实习##软件开发笔面经#
全部评论

相关推荐

7 23 评论
分享
牛客网
牛客企业服务