经过朋友们的推荐,也是抽空面试了几家,也把面试的过程及新的总结了一下。
天润融通科技Java社招面经
说实话,这个节点儿上,裸辞的我,在家大半年,嵌入式转行Java,心情你懂得
一开始,两个戴口罩的进来,一男一女。
果不其然,
女的先问:先介绍一下自己,
我:巴拉巴拉,介绍自己经历……感觉这女的是一个项目经理
女的再问:为什么离职啊,看你是7月底离职的,这段时间干啥了?
我:(心里想,果不其然),然后就各种解释了,处于职业规划和公司社保问题两个方向说了一下,空档期就说自己一直在学Java,提升自己的技术
女的对旁边那个技术说,我暂时没什么问题了,你问吧
男技术:看你简历有说到集合,那先谈谈集合吧。
我:从Collection、Map开始,然后说到List实现类ArrayList、LinkedList;Set:TreeSet、HashSet;Map:hashMap,TreeMap;主要又说了HashMap。这个很常见,就不贴答案了
男技术:嗯,你的项目业务上用的是MySQL,能说说MySQL调优吗?
我:这个我自己总结了一下答案如下:
数据选型:首先是数据选型方面进行优化,选取最适用的字段属性,数据的表越小,查询越快
范式应用:合理使用范式和反范式
存储引擎的选择:如果该数据库读操作较多,存储引擎选择MyISAM,如果是写操作多,选择innodb
主键选择:代理主键
-
执行计划explain:使用explain+sql测试sql语句执行情况,然后优化sql语句
- 注意的关键字:type关键字,通常达到range级别,最好是ref,而ref最好是一个常数。
-
索引优化:
尽量在主键上添加使用索引
利用覆盖索引、索引下推机制,注意组合索引的匹配原则,
尽量使用唯一索引,避免使用普通索引
-
查询优化:这个应该被包含在执行计划中,但是个人觉得还是拆出来,其实我们在写的时候就该注意sql的效率,explain执行计划只是验证
优化数据访问,避免查询中出现筛选大量数据,可以通过limit限制;
避免select * from table这种全表扫描的语句
如果业务没有特殊规定数据,那么就尽量避免使用UNION,可以考虑UNION-ALL替换,因为后者不会过滤重复数据,效率高于UNION
男技术:嗯,说得挺全,你说HashMap时,谈到了红黑树,那说说MySQL索引为什么用B+树呢,b树,红黑树呢?为什么不用
我:谈了一下B树与B+树的区别,从key说起,B+树节点不存储数据,只有叶子节点存储数据,B树的key既存储数据又存储key,导致key的减少,数据增多的时候,树的高度增加,IO次数变多,导致查询效率降低;红黑本身自旋,尽管它的自旋次数少于AVL树,但是数据增多,同样会降低插入删除效率,并且树的高度同样增加,所以不用这两个
男技术:嗯,看你项目中有用到redis,redis支持的数据类型以及数据结构,以及你用过那个数据类型,说一下场景
我:这个可以百度到,至于场景自己想吧。然后可能问到底层的数据结构怎么实现,答不出来也没关系,我顺便把redis的穿透讲了一下,因为之前项目中用到。
结果这时候女的插了一句嘴:redis另外两个场景遇到过吗?
我:(心里……)redis击穿、和redis雪崩,然后说了一下如何解决
男技术:你前面说到了锁,那redis分布式锁实现怎么实现?
我:思路setnx,考虑死锁->设置锁过期时间-,然后考虑锁提前过期,任务未执行完毕->多线程监控
男技术:看你用过Spring MVC,说一下请求处理流程
我:
请求解析DipatcherServlet路径:客户端发出⼀个http请求给web服务器,web服务器对http请求进⾏解析,如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),web容器将请求转交给DispatcherServlet.
匹配处理器Handler:DipatcherServlet接收到这个请求之后将根据请求的信息(包括URL、Http⽅法、请求报⽂头和请求参数Cookie等)以及HandlerMapping的配置找到处理请求的处理器(Handler)。
处理器进⾏处理:DispatcherServlet根据HandlerMapping找到对应的Handler,将处理权交给Handler(Handler将具体的处理进⾏封装),再由具体的HandlerAdapter对Handler进⾏具体的调⽤。
处理器返回逻辑视图ModelAndView对象给DispatcherServlet:Handler对数据处理完成以后将返回⼀个ModelAndView()对象给DispatcherServlet。
Dispatcher通过ViewResolver将逻辑视图转化为正式视图view:Handler返回的ModelAndView()只是⼀个逻辑视图并不是⼀个正式的视图,DispatcherSevlet通过ViewResolver将逻辑视图转化为真正的视图View。
Dispatcher通过model解析出ModelAndView()中的参数进⾏解析最终展现出完整的view并返回给客户端。
男技术:什么是Restful,能讲一下吗?(我有点儿蒙xx)
我:不了解,因为我之前的项目都是基于cloud,所以没答出来
男技术:没关系,前端与后端通信可以调用接口,后端与后端之间rpc用过吗,就是服务之间的调用(没看rpc,所以pass)
我:没答出来
男技术:没关系,fegin了解吗,手写过源码吗?
我: (pass,没写过,说了一下fegin的作用)
男技术:最后问两个问题:你对自己的职业规划有什么打算吗?长短期都说一下
我:从近期和职和职业规划来说。
女的开始了:如果有任务完不成了,你会怎么处理
我:这个大家自行百度
女的:对于加班有什么看法
我:这个也百度去吧
女的:你还有什么想问的
我:问了一下技术框架,以及开发人员构成
顺丰后端社招面经
一面:
挑一个熟悉的java容器聊一下,我选的hashmap
hashmap里的hash函数你自己的话如何实现,如果你的hash函数总是取模后在固定的几个位置,如何优化这种情况,各个角度都可以说,可以是算法和数据结构等
聊一下你知道的索引;有一个表存在字段id(非主键、递增可重复)、name,如果有1000W条数据,查其中一条,有索引和没索引的情况下执行时间,建索引是否有用、会走索引吗、为什么
TCP的三次握手四次挥手、滑动窗口
TCP/IP四层协议、ip在哪层
TCP有无状态
如何判断一个链表是环链
聊项目
能接受加班吗
二面:
聊项目
dubbo原理,dubbo往zk写入的内容是什么
dubbo客户端负载均衡如何实现的,给你你如何实现,一步步提示和完善
zk除了做注册中心还有什么用途
zk的数据类型;zk分布式锁,讲具体实现
聊下hashmap和concurrentHashMap
spring启动流程
spring bean生命周期、bean实例化过程
类加载过程
二叉树遍历,写了递归,非递归会吗,忘了
多线程了解吗,threadPoolExcutor构造函数的各个参数详解
三面是HR