上周六一下午面了贝壳加猿辅导五轮面试,周一美团一面又光是问问题就问了将近两个小时,这两天面试面的人都给整晕了,现在才缓过来,当时也没心思记录下面试问题了,现在回想一下印象比较深刻的给我造成了一定困难的几个问题吧
贝壳
1.HashMap中红黑树是根据什么来排序了
这个真的是问到盲点了😂面试官提示了一下说对象之间一般是用什么方法来比较的,我就说应该是用compare()方法比较
他又问那如果没有实现Comparable接口怎么办,这个我真想不到了,后来查了一下好像是根据类名来排序的
2.说一说函数式接口
只知道lamda表达式是通过这个实现的,其他没细看过就说不出来了
3.具体说说怎么重写HashCode()方法(记的不清楚了)
美团一面
1.重写equals()一定要重写HashCode()吗?假如我并不使用HashMap相关功能呢?
我说除了HashMap之外其他什么地方还会用到HashCode()我也不清楚了,结果面试官给我来了个说根据实际情况看需不需要来决定重不重写HashCode()
2.MVCC机制中,假如有一个事务id为1的写事务来已经完成了对数据的修改,但是该事务还没提交,这时有一个事务id为2的读事务来读数据,它读到的是修改前的还是修改后的数据?为什么
这个问题我之前没碰到过,但想了一下读到的应该来说肯定是修改前的数据,至于原因当时想了一下有两种可能,一个是写事务会加行锁,一个是可能事务在提交的时候才会修改MVCC中该数据的事务ID,
按理来说在可重复读隔离级别下应该写事务是会加行级排它锁的,但我突然想到MVCC的目的是用来解决读-写冲突的无锁化并发控制,那如果是前者的话不还是要加锁吗
所以我回答了后者,结果面试官跟我说是前者,这个地方真的有点懵,有大佬能解惑一下吗
3.如果用加锁的方式查询不存在的数据从而在索引中没有命中会发生什么?
这个也是真的盲点了,面试官说会导致锁表,我后来查了一下,原来InnoDB行锁是通过给索引上的索引项加锁实现的,所以没有命中索引的话,InnoDB会使用表锁
美团将近面了两个小时,还是在没让我写算法题的基础上😂前一天又刚刚经历一下午五面,我面到后面都想关电脑走人了,最后干脆就像闲聊一样去回答问题了,感觉有点要凉了的预感,太难顶了,还是希望能过吧
全部评论
(2) 回帖