0%

阿里巴巴数据开发实习生一面面经

首先还是自我介绍, 介绍了项目和实习

你们这个实习数据量多大? 只负责的离线计算吗? 有没有做实时计算?

说一下HashMap和Hashtable区别?

介绍下java里优先队列的实现?

说一下使用线程池的好处?

在你的项目里怎么确定的线程池的参数?

你的项目里提到爬虫, 爬取的过程中怎么避免爬取重复的URL的问题呢? 用集合来存储

如果是定时爬取的话, 怎样设置集合中URL的过期时间呢?

了解redis删除过期的key的原理吗? 不了解, 蒙了一个不知道对不对

降价通知功能中每个股票对应的list是遍历一遍来扫描的吗?

为什么订阅后只发布一次通知, 如果用户想自定义发送通知的次数和步长, 和过期时间, 你应该怎么设计? (这个太难了, 不得不说阿里的面试官水平是真的高, 几分钟的交流就已经了解我做的项目的原理了, 并且发现了不足的地方)

jvm有了解吗? 讲讲类加载的机制吧

说一下java进程的几个状态?

说一下java多线程的关键字?

说一下synchronized原理?

写个题吧

这个题是真的简单, 感觉和three sum一样, 甚至还更简单一些

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
有序数组n,输入k,找出满足两个数相加=k的所有序列对
List<List<Integer>> sumK(int[] n, int k){
List<List<Integer>> ans = new ArrayList<>();
if(n == null || n.length < 2){
return ans;
}
int left = 0;
int right = n.length - 1;

while(left < right){
while(left > 0 && left < n.length && n[left] == n[left-1]){
++left;
}
while(right >= 0 && right < n.length - 1 && n[right] == n[right+1]){
--right;
}
if(left >= right){
break;
}
int tmp = n[left] + n[right];
if(tmp == k){
ans.add(Arrays.toList(new int[2]{n[left], n[right]}));
//这里应该是 ans.add(new ArrayList<Integer>(Arrays.asList(n[left], n[right])));
++left;
--right;
}
else if(tmp > k){
--right;
}
else{
++left;
}
}
return ans;
}