记一次电话面试的题目
昨天下午六点正准备关电脑下班去和对象约定好的地方吃饭的时候,突然接到了一个电话面试邀请,于是内心快速纠结了一下,还是同意了这次电话邀约(其实内心是拒绝的,但是转念一想刚好通过这个电话面试对自己查漏补缺),聊了接近一个小时的通话,公司的人都走的差不多了。别的不多说了,下面就整理下面试题吧。(文末公布下lz是怎么解决晚饭······聪明的你们应该能猜到结局了)
1.自我介绍 2.为什么离职
这些不关技术的事情我就不叙述了(把lz的经历的公司都问了个遍,就问为什么离职。。。好煎熬)
下面正式切入技术问题,只记了个大概,暂且写出来,并附上答案(只是lz拙见,不做深入探讨)。
3.集合HashMap、HashTable、ConcurrentHashMap区别
面试官:你了解集合吗?
lz:了解呀!
面试官:说说HashMap、HashTable有什么不同?
lz:首先最大的不同就是HashMap线程不安全,效率高、HashTable线程安全,效率低,还有HashMap允许k、v为null,HashTable不允许
面试官:HashTable为什么是线程安全的?
lz:因为HashTable内部为所有的操作都加了同步锁(synchronized)
面试官:为什么加了synchronized锁会导致效率降低?
lz:因为加了同步锁(synchronized)其他线程再想访问的话,必须等到前一个线程释放了锁才能使用。比如十个线程,只能一个一个排队等候执行,所以效率会降低。
面试官:我们公司有些大数据量等需要用到HashTable,但又想保证执行效率,怎么办?还有其他可用的集合吗?
lz:有啊ConcurrentHashMap。
面试官:ConcurrentHashMap是如何保证线程安全的?
lz:因为使用了分段锁segment。
面试官:为什么分段锁比同步锁效率高?
lz:分段锁就是把Map分成了多个segment去处理,进行put操作时,根据hashcode找到相应的锁,彼此之间不受影响,所以效率高。而同步锁--锁住的是整个HashTable,因此效率会低。
面试官:知道HashMap的实现原理吗?了解hash碰撞吗?
lz:HashMap是一个数组+链表的数据结构。采用hashing原理,在进行put 操作时根据Key计算出它的hashcode,根据hashcode找到相应的桶的位置。在进行get 时也是根据hashcode 找到相应位置的数据的。当发生hash碰撞时,即hashcode相同。那么会在相应的桶中形成一个链表结构进行存储。
4.如何保证订单重复提交的问题(当发生网络延迟等情况)
lz:楼主只回答了前端校验和后端校验具体其他操作不是很清楚,下面答案引用自百度百科只列举几个经典的(力争为园友提交较可信的答案)
更详细的答案可以参考:http://www.bkjia.com/jingyan/471187.html
1:在前端进行校验,当表单提交后,把提交按钮置灰
2:表单提交后进行页面重定向,转到处理结果页面。
3:在session中存放一个标识符(当表单数据被请求时,在session中生成一个标识符放在表单隐藏域中,当后端处理表单数据时,检查标识符是否存在,如果存在则表明第一次提交并从session中清除标识,如果不存在则表明重复提交)
4:在数据中添加约束
5.防止订单重复支付问题
lz:我们公司的支付都是跳到微信或支付宝的(--把此问题抛给了腾讯和阿里);但是我们自己应该也能想到一种解决方法:就是同一笔订单我们可以设置它的支付状态。
更详细的答案可参考:https://www.jianshu.com/p/530228b71888
6.Spring原理(Ioc、Aop、动态代理)
lz:Ioc呢就是不需要我们手动创建new对象,把这个动作交给了Spring容器去管理,大大降低了程序的耦合度。
Aop采用的就是动态代理的技术来实现切面编程的。
面试官:djk动态代理和cglib动态代理有什么不同?
lz:JDK只能代理实现了接口的类,cglib采用字节码方式, 两种类都可以代理。(注意final类和静态方法是不能被代理的,因此aop也不能织入静态方法)
7.对事物了解多少(主要是特性、传播机制、隔离级别)
lz:事物主要的特性就是:原子性、一致性、隔离性、永久性
隔离级别:default数据库默认的隔离级别、未提交读、已提交读、重复读、串行化。
传播特性:PROPAGATION_REQUIRED 、PROPAGATION_SUPPORTS 、PROPAGATION_MANDATORY、PROPAGATION_REQUIRES_NEW、PROPAGATION_NOT_SUPPORTED、PROPAGATION_NEVER、PROPAGATION_NESTED;
具体请参考:https://blog.csdn.net/weixin_38070406/article/details/78157603
lz抛个问题:假如一个没有事务的方法调用了有事务的方法然后有事务的方法又调用了其他无事务的方法。那么请问事务还生效吗?(欢迎留言评论)
8.MySQL索引
lz:主键索引、唯一索引、普通索引、组合索引
具体请参考:https://blog.csdn.net/goodsave/article/details/78018174
再抛个问题:假如表中建立了一个组合索引(name、city、age)当查询时采用city、age时索引生不生效?
9.数据库执行计划
lz:具体一些细节就是怎么优化sql、还有查看sql语句性能,当然就是采用执行计划(explain)的方式了。
具体可参考:https://blog.csdn.net/wangpeng047/article/details/12849331
10.线程池
lz:主要就是ThreadPoolExecutor类的使用构造函数,4种构造函数里各参数代表的意思。
corePoolSize:核心池大小
maximumPoolSize:线程池最大线程数。
keepAliveTime:线程没有任务执行时最多存活时间。
unit:为keepAliveTime设置时间的单位。
还有几种常见的线程池:newFixedThreadPool、newSingleThreadExecutor、newCachedThreadPool、newScheduledThreadPool
具体线程资料可参考:
https://www.cnblogs.com/dolphin0520/p/3932921.html
https://www.cnblogs.com/superfj/p/7544971.html
好了,目前lz只能记得这么多了,所以就写到这吧。(还有一些lz做的模块的细碎问题也不赘述)
ps: 最后lz完美的错过了饭局,自己一个人随便吃了点饭,然后等着对象一起愉快的回家了