美团java后端一面
介绍项目
介绍论文
你的简历上说了会java的同步编程?有哪些?
synchronized / volatile / ReentrantLock
说一下synchronized关键字用在哪些地方?具体怎么实现的?
锁方法/锁对象/锁类/锁代码块。
讲了堆区的五种状态+mask word,balabala
以下代码由两个线程调用a()和b()会阻塞吗?
class A{ public void synchronized a(){ } public void b(){ synchronized(A.class){ } } }
- 以下代码由3个线程分别调用a() b() c(), 那a()与b(),a()与c(),b()与c 会阻塞吗?
class A{ public void synchronized a(){ } public void b(){ synchronized(A.class){ } } public void synchronized c(){ } }
说一下volatile。
有序性/可见性,没有实现原子性。
你说的原子性是什么?如以下代码,为什么说他没有实现原子性?
class A{ volatile String temp; public void fun(){ temp = new String("aa"); } }
再说说ReentrantLock的实现。
为什么把它叫做可重入锁,synchronized也是可重入的吗?
不知道...
说一下公平锁和非公平锁?默认是哪个?为什么它是默认的?
你的项目遇到了哪些数据库的优化?
索引和redis。索引应该通过字段的可区分度来从左到右建立,如a有300种取值,b有150种取值,c有10种取值,则索引顺序应该是(a,b,c)
你说的这种情况,假如a的300种取值是不均匀的,比如有10个频率特别高,其他290个特别低,你说的按可区分度也能这样建索引吗?
那就求方差作为可区分度吧。
SpringBoot有什么好处?
常见的linux命令?如何查在一个文件里指定字符串出现了几次?
讲一下四次挥手,为什么不能三次?
服务器端在发送完FIN后还能收到数据吗?
客户端什么时候开始不再接收数据?
TIME_WAIT是在什么时候,为什么要TIME_WAIT?
有10亿个整形数据,用逗号分割在一个文件里,将排序后的写到另一个文件里。要求思考3min,然后说思路,接下来5min写伪代码。
我:将每个整形数/(Integer.MAX_VALUE/10),分配到10个桶里,然后分别排序,序号小的桶必然在前面。还有个优化的点就是用频率压缩长度。
(打断)
面试官:你说分配到10个桶,为什么是10个?不能100个?1000个?越多越好吗?极端点,一个数一个桶不更好吗?
我:数量少的时候是越多越好,但感觉有个阈值,暂时想不出来...
面试官:那我换个问题,你觉得分桶一定会比不分桶快吗?
我:是的...
面试官:你写代码吧。
我:
public List<> fun(int[] a){ List<Integer>[] list = new ArrayList<>()[10]; for(int e:a){ list[e/Integer.MAX_VALUE/10].add(e); } ... }
(打断)
面试官:题目说的是10亿个整型数存在文件,用逗号分隔,你可以用int[] 存下传入吗?
我:如果是很长的string的话,那就用两个指针指向string,一个指针指向数字的开头,另一个指针到逗号为止,将两个指针间转int,再分桶处理。
面试官:你要用指针说明已知String的长度,String也存不下。
我:
class Main{ public static void main(String[] args){ Scanner scanner = new Scanner(System.in); String temp = ""; List<Integer>[] list = new ArrayList<>()[10]; while(scanner.hasNext()){ char c = scanner.nextChar();//没有这个方法,不过面试官说不介意 if(Charcter.isDigtal(c)){ temp += c; }else{ int e = Integer.parseInt(temp); list[e/(Integer.MAX_VALUE/10)].add(e); temp =""; } } ...//排序 } }
面试结束,然后是复盘环节,还是这道题。
面试官:
- 你觉得没有负数?
- 你怎么看到10亿个数呢?如果是100亿,1000亿呢?10亿个数文件大约是多大?其实是可以存下的。我希望你答出linux操作系统允许的单个文件最大大小。结果你没提到。
- 分桶方法并不会变快,就如我说的极端情况。
- 你分成了10个桶,那万一分布不均匀呢?有没有考虑数字多的桶再裂开?
总结:面试官的个人风格很强,问问题很犀利,不喜欢我背八股文,动不动他就现场手写一串代码让我分析,真的学到了很多东西,眼过前遍不如手过一遍。而且处处中引导我,教我思考问题的方式,就比如最后一道算法题,压根就不是算法,是场景...大多数都没答好,估计是凉了,但是学到了很多东西,感谢面试官小哥~
#美团22届秋招面试##面经##校招##美团##Java工程师#