10.12去哪儿面试
一面
- 自我介绍一下
- 你Java是怎么学的?学校有讲吗?
- 进程的通信方式有哪些?
- 给你几个看看进程通信方式和几种场景,你看看它们是不是对应?
- 消息队列:redis的pub和sub
- 信号:linux的kill命令
- 管道:ps xx | grep xx
- 共享内存:MySQL的buffer pool
(这几个都是一一对应的,面试官跟我解释说这是一种抽象,不是具体编码实现,是那个思想)
- 网络五层协议是哪五层?上面三层常见的协议可以说一下吗?
- 网络层除了IP,还有哪些协议?
- linux中,哪些命令与应用层的协议相关?哪些命令与传输层的协议相关?哪些命令与网络层的协议相关?你可以举几个例子吗?
(面试官在聊天框又写了netstat,ss,lsof这些命令,然后跟我讲解这些命令,包括还提到了ip等命令)
- Map map=new HashMap(100),往里面put多少个元素会扩容?
(这里跟他说这不好说,因为hash冲突也会引起扩容,他跟我说不考虑冲突;后来面完想了想,因为容量已经大于64了,hash冲突就不会引起扩容了)
- 为什么是128*0.75?
- 为什么它要把长度调整到2的n次幂?
- ReentrantLock的lock做了什么事情?概括一下?先考虑只有一个线程的情况
- 只做了cas吗?
- 你可能漏了些什么;那我这个线程再次执行这个lock方法会怎么样?
- 那如果换一个线程过来执行这个lock呢?
- 那为啥原来的那个线程可以重入,新线程不能重入?
- aqs有个当前线程的变量吗?怎么标记当前线程是否自己呀?
- 你说得没毛病,所以你刚才lock的时候是不是漏了什么事情?
(引导我很久,就是想提示我漏了说把当前线程设置到aqs的exclusiveOwnerThread,因为一直有点想当然了,就一直忘记说了;提醒我要要理解aqs的本质,说我已经把aqs这些东西都说出来了,怎么忘了这一步)
- 那你有没有想过aqs为啥要设计成抽象类?
- aqs的核心三个组件是state、exclusiveOwnerThread和队列,你知道有哪些并发工具是只用第1个和第3个就可以实现的吗?
(然后他借这题跟我解释了为啥要设计成抽象类的原因)
- Java里面把线程挂起的方式有哪些?
- sleep和join不算吗?(名牌提示)
- 这里面有个wait方法比较特殊,你知道wait方法是要在什么条件下才能用吗?
- 为什么要在同步代码块里面才能用呢?有思考过什么原因吗?
(他说我说的没毛病,但是有点不完整,稍微完善一点的是这个意思,sync是个关键字,在编译的时候会编译成monitorenter和moniterexit指令,会生成一个辅助对象,也就是ObjectMonitor,来辅助sync的执行,这个对象里面有个核心的类似aqs的结构体,也就是我说的waiter队列和state和owner,wait必须依靠这个waiter队列进行挂起,所以说它必须依赖ObjectMonitor这个对象,如果没有这个对象,那就会报错)(无敌 )
- NIO核心的三大组件是什么?
(我在说selector的时候说了个epoll,他跟我说不一定是epoll,还可能是kqueue,甚至是select和poll,要看具体的操作系统以及操作系统的版本)
- 你在网络传输的时候,传输的字节,会出现黏包半包问题,你知道黏包半包问题有什么解决思路吗?
- 你在哪些中间件或者哪些地方见过黏包半包的这些解决思路吗?
- 除了netty还有吗?
(然后他说我刚才说的基于长度字段方式,让他想起了kafka的协议,然后讲了kafka里面的黏包半包问题)
- 问下实习吧,你在实习的公司做过什么项目?
- 你觉得你的系统的用户量是百级千级还是万级呢?
- 你们项目部署的话,是部署多少台机器呢?
- 你可以说一下你做的一些的核心功能吗?
- 你觉得你这个预约系统的接口里面,最核心的接口是哪个接口?
- 那你就说一下吧,你这个接口从前端发起请求,直到返回给前端,一共经过了哪些组件、中间件和系统?分别做了什么事?
- 你说你还有下游,你说说你跟下游通信的方式?Feign还是HttpClient?
- 我看你之前做过rpc,你应该很清楚模块与模块之间调用的方式吧?我给你举个场景,我本地服务A,有个C接口,要调用M方法,这个M方法是在服务B上的,但是我现在服务A上面只有C这个接口,而且是没有任何实现类的,那它是怎么实现调用服务B的呢?
- 你是不是还漏了什么?服务A是直接跟服务B发起请求的吗?前面没有其他步骤了吗?
(然后他开始讲起来他对rpc实现的思路,从注册中心,协议,序列化,连接方式,代理模式等等;跟我说这个框架不难写,但如果要实现的像dubbo和grpc那样,还是要有点水平)
然后就结束了,他说我是本科,看得出来我很热爱技术,对技术有自己的理解,在本科很少见,但是技术涉及的不是很多,也比较简单和基本;最后说要给我个建议,讲了十分钟。最后没有反问
可以看出来面试官是个真大佬,对很多东西都很熟悉,面试的时候边打哈欠边面,一边吃面包一边喝水,很自然但是很凌厉,一点不拘谨,随手在留言板上面写两句代码都能问很多东西,能从一个问题扩展到其他问题,也给了很多提示,补齐我说漏的东西;特别是最后赶时间还是跟我讲了好久的建议,是真的很感谢
二面
- 自我介绍一下
- 没有考虑过考研吗?考研和工作两方面是怎么考虑的?你的专业课有哪些?(作为双非本被问这些已经不惊讶了)
- 操作系统的进程和线程有什么样的联系和区别?
- Java里面也有进程和线程,Java里面的进程和线程跟操作系统的进程和线程有什么区别?
- 我在一个jvm进程里面,最多能开多少个线程,原因是什么?
- 一个线程的创建需要消耗哪些资源呢?
- http熟悉吗?1.0,1.1,2.0有什么区别?
- 3.0也出来啦,3.0解决了什么问题呢?
- 一个表有学生号,学生名,学科,学期,成绩;查出每个学期的每个学科的最高分学生名(没写出来。。。)
- 没关系,那我们再写道别的题吧;有重复元素的有序数组中找出大于等于目标值的第一个元素的下标
- 聊聊你毕业后的计划吧
二面也是没有反问
二面面试官非常和蔼可亲,很温柔,讲话也有点俏皮,sql写不出来都给我过了
但是也狠狠地批评我,说我有个问题至少犯了四次,还没看清题目,没听完要求就开始写了,他要我直接在代码里面初始化数组就好了,我还用了scanner,甚至那个算法题的题目都是有二义性的,我也没发现,也没问清楚,关键还是在于审题,而不是二分法;听得我很慌,以为要挂了
然后告诉我以后工作也是,写代码也是,都要先听需求,先思考,写代码的时候永远是最短的
最后说没关系,说我面试能学到东西就好,其他的问题跟hr聊吧
HR面
常规HR面,介绍实习,实习收获,为什么不转正,毕业志向,个人优缺点
反问
11月左右反馈面试结果
没有提前实习的要求
开泡
update:秋招池子没泡出来,春招笔试了也没约面试,无缘骆驼厂
#面经##我的实习求职记录##秋招##24届软开秋招面试经验大赏##去哪儿#