参加2019年的秋招,可谓是各种被虐,也知道了自己的很多问题,昨天的阿里面试让我不停反思自己,还是要多关注细节和源码,对待做过的项目一定要了如指掌,还有不能过度依赖IDE:
一些常见的java基础知识:
1索引怎么保证有效性
2如何保障秒杀过程中库存不会为负数,不会发生超卖现象
3项目如何保障Mysql和Redis中数据的一致性
4AOP的原理
5Redis常见的数据结构及底层原理
6HashMap的工作过程,加入一个数据会进行哪些操作,越详细越好
项目相关问题回答的很差,感觉自己掌握的不扎实,基础知识回答的还可以,都能回答上。
两道算法题:
1使用n个线程,每个线程输出线程的编号减去1,比如线程1输出0,线程2输出1:
public class MultiThread1 {
private static final int endNum=10;
static int orderNum=0;
static Object object=new Object();
static class ThreadPrint extends Thread{
private int printNum;
public ThreadPrint(int printNum){
this.printNum=printNum;
}
@Override
public void run() {
synchronized (object){
while (orderNum<endNum){
if(orderNum==printNum){
System.out.println(Thread.currentThread().getName()+":"+(orderNum-1));
orderNum++;
object.notifyAll();
}else {
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
public static void main(String[] args) {
ThreadPrint[] threadPrints=new ThreadPrint[10];
for(int i=0;i<endNum;i++){
threadPrints[i]=new ThreadPrint(i);
threadPrints[i].start();
}
}
}
这道题面试的时候写的很差,只想到保障数据的一致性,没想到如何保障线程的顺序,同时也在这里总结一下如何保障线程的顺序性:使用join,使用单例线程池,使用信号;反思了自己是读的太多,写的太少,面试官说我知识面很广,确实自己什么都了解一些,但是精通的很少,这点给了我很大教训。
2合并数组区间,这是leetcode上一道原题,大体写出来了,不过有些细节没把握好
public class MergeArray {
static class Node{
int start;
int end;
public Node(int start,int end){
this.start=start;
this.end=end;
}
}
static class nodeCompare implements Comparator<Node>{
@Override
public int compare(Node o1, Node o2) {
return o1.start-o2.start;
}
}
public ArrayList<Node> listsmergeArray(ArrayList<Node> lists){
Collections.sort(lists,new nodeCompare());
for(int i=1;i<lists.size();i++){
int x1=lists.get(i-1).start;
int y1=lists.get(i-1).end;
int x2=lists.get(i).start;
int y2=lists.get(i).end;
if(x2>y1){
lists.set(i,new Node(x1,Math.max(y1,y2)));
lists.set(i-1,null);
}
}
while (lists.remove(null));
return lists;
}
}
总的来说这次面试让我了解到自己的很多不足,还有很多可以提高的地方