阿里巴巴电话一面凉凉经
我是申请的后台开发岗位
4.13的笔试,两道题
1.
第一道题:蚂蚁森林n个小动物,1~n,小动物编号越小能力越强,现在筛选国王,每个小动物都会崇拜别的小动物或者自己,但只会崇拜比自己能力强的小动物。
问每个人最多可以获得多少票。
看牛客的一些大佬说是要用树的遍历,我只会用递归破解,AC90%
import java.util.Scanner; public class Main { static int[] a; static int[] ans; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); a = new int[n]; ans = new int[n]; for (int i = 0; i < n; i++) { int x = sc.nextInt(); a[i] = x; } for (int i = 0; i < n; i++) { if (a[i]==0) { ans[i] = ans[i]+1; }else { findZero(i); } } for (int i = 0; i < n; i++) { System.out.println(ans[i]); } } private static void findZero(int i) { if (i > a.length-1 && i < 0) { return; } if (a[i] > i+1) { return; } ans[i]++; if (a[a[i]-1] == 0) { ans[a[i]-1]++; return; }else { findZero(a[i]-1); } } }
2.
做完第一题我就身下15分钟,第二题读完题目知道是图的路径搜索,但是不会就没做,后来上网查了floyd和Dijkstra(迪杰斯特拉)算法都可以破解,但floyd可能会超时
学了复习了一下Dijkstra(迪杰斯特拉)算法,没了。
4.17晚上电话面试
45分钟电话面试,30分钟说项目把;
没想到一面就疯狂说项目,我说的确实不好,问到我关于dubbo这些,还要些项目中数据传输的问题。
面试官问我的还要关于项目部署的,我接触到的确实只有单体项目,面试官似乎不满意,后面就没完了。
影响深入的几个问题:
1.
单机部署项目,问题很多,版本迭代就要kill进程,有什么问题?你有想过怎么解决好点吗?
后面问了问朋友,生产直接kill是不行的,强制杀死容易出问题,Kill这个操作不是生产操作,最简单就是布完包重启tomcat。就是取代kill操作啊,但还是以前的部署操作。(唉,我确实菜,项目经验确实不够)
2.
你的项目很慢,你应该做什么排查?例如查询一个数据很慢,你会怎么做?
我那时候一开始就说对项目的优化嘛,我直接就说建立索引什么的,我以为他会要我说说索引原理什么嘛,结果她问我怎么确定就是数据库的问题,不是其他的问题,要怎么排查
我确实不知道,后面补充一下:
1.看日志,是不是又哪写地方阻塞,也就是从应用方面排查,结合适当的debug,看哪个地方的取出来的数据不对。
2.jvm线上排查
jps 定位进程号
jstack PID
就会在终端输出我们熟悉的堆栈信息
3.linux
top 查看cpu使用情况,排除其他线程影响该程序执行的可能
单单看到各个进程的CPU使用率和内存使用率
vmstat
展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况。——进一步分析
4.
最后才是定位sql这样子的,
用数据库自带索引命令工具排查
追踪慢查询,为什么慢
在多此查询的地方设置索引
当然,索引也不是绝对的优化方法,可能本身的sql是否可以优化
连表过多,对表进行拆分
也可以这么表达:
2.1
可以从应用,数据库,和运行环境分析;可以考虑用户网络环境,然后是应用中的调用链路是否存在问题(循环调用?外部依赖过多?),然后是数据库。有应用监控系统最好不过了,可以比较具体的排查。
2.2
数据库的原因也很多,sql问题,也有可能是数据库本身延时高。
Linux查看一下进程也需要,查看进程排查应用所在环境因素(其他进程对该应用程序的影响)
2.3
而且索引也不是绝对的优化方法,可能本身的sql是否可以优化,如果连表过多,是否可以拆解到应用层做,或是压根表设计不合理
基础知识
3.
类的加载?——》
双亲委派的过程?——》
还问为什么要双亲委派?
我回答了”安全高效“了,就没说了,他就没问了。。。。
补充:
确实是安全,如果没有这种机制,编写了一个java.lang.Object的同名类并放在ClassPath中,程序一跑,多个Object继续加载,就不能保证object的唯一性。
因此,解决就说通过类加载机制。底层是代理模式,对于 Java 核心库的类的加载工作由引导类加载器来统一完成,保证了 Java 应用所使用的都是同一个版本的 Java 核心库的类,是互相兼容的。
4.
三个工厂模式,有什么区别
这块明明很熟悉,面试可能有点紧张说的迷迷糊糊。。。我也不知道有没有说准确
答案:
三个工厂模式,各有千秋
从简单工厂模式——》工厂方法模式,解决了对产品的拓展不符合OCT原则的问题
从工厂方法模式——》抽象工厂模式,解决了一个过程只能生产一个产品的问题
但是反而多了一个问题,就是又产生了部分不符合OCT原则的问题,对工厂的拓展符合OCT,但是没错要拓展一个产品,就要修改一次工厂里面的方法
5.
高并发的concurrenthashmap
推荐使用,
在jdk8之前是使用分段加锁的一个方式,分成16个桶,每次只加锁其中一个桶,而在jdk8又加入了红黑树和CAS算法来实现。
每次只会锁目前一个segment,用synchronized+CAS,效率更高了,并发度更高。
问题:concurrenthashmap,有一个线程进入这一个桶,进行put方法,他还能再进入吗?
妈呀,我竟然说不可以,前面都采用synchronized了,synchronized是可重入锁啊!!!后面纠正过来了,但是。。
6.
spring容器启动过程
spring我配置文件在哪里读取?
我看过,但是一到面试说起来就不全面,缺斤少两的
https://zhuanlan.zhihu.com/p/82136894
总结:
这次面试的不足:
1.复盘项目,我在想对于工作经验这块我还是缺少很多,得总结自己以前遇到的问题以及解决思路,小项目就小项目,但还是得积极拓展,“自己为难自己”
2.复习基础,高并发这块可以再多吃透一点,懂的东西也要深入理解,做到别人怎么问都不怕
3.面试过程容易手忙脚乱的问题,前面回答的不好,后面就应该好好调整。
这次面试才45分钟,应该是凉了,面试官人还是不错的,看到我挺紧张的,也叫我调整调整状态。
加油!争取下次更好
#面经笔经##阿里巴巴#