去哪儿后台开发岗社招面经
· Java基本数据类型
·装箱和拆箱
· Java的特点
·怎么实现多态的
·什么动态绑定,什么是动态代理(这个没答好)
·熟悉哪些Java集合类
· ArrayList和LinkedList的区别和适用场景
· HashMap的底层实现,以及put 操作,hash函数,二次扰动,扩容机制
· LinkHashMap了解吗?(不了解)
· ConcurrentHashMap的底层实现,怎么做到线程安全的
·比较了JDK 1.7和JDK 1.8中HashMap和ConcurrentHashMap的不同
·写过多线程Java编程吗,都是怎么写的(答:Synchronized)
· Synchronized底层是怎么实现的,同步代码块和同步方法
·扯到了Synchronized的锁优化,偏向锁、轻量级锁、重量级锁
·说一下wait和sleep的区别
·可不可以自己手动加锁,手动加锁你怎么实现,底层又是怎么实现的(不太明白,扯
了lock和unlock指令)
·上面扯到指令,然后又开始了类加载机制
·对象何时初始化,初始化的顺序
·类加载器以及双亲委派机制,以及破坏双亲委派机制的场景
· Java怎么去实现共享操作,多线程访问同一数据(不了解)
·怎么创建线程,说一下线程池,自己手动构造线程池的核心参数,线程池的工作原理
·说一说AQS,底层怎么实现的(没答好,当时已经有点蒙了,问题太多了,也有很多没
答好)
·然后CAS是什么(这个我知道)
·说一下Future和FutureTask,以及他们之间的区别(说得七七八八)
·怎么实现在一个线程中,把计算结果这个操作放在一边执行,然后线程继续别的操作(不
了解)
·怎么实现多个计算线程全部到达之后再进行下一步的操作(我说
了CountDownLatch和join)
·最后算法题:给一个数组和target值,找出长度最长的且和等于target的连续子数组的长
度(写了个O(n^2)的,但是面试官说有O (n)的,我没想出来)
放下算法题代码,O(n)复杂度。
public class Main {
public static void main(String[] args) {
int[] nums = {1,3,4,5,1,1,1,1};
int target = 5;
System.out.println(maxLenthSubArray(nums,target));
}
public static int maxLenthSubArray(int[] nums, int target) {
int ans = 0;
int[] d = new int[nums.length];
d[0] = nums[0];
for (int i = 1; i < nums.length; i++) { d[i] = d[i - 1] + nums[i];
}
int pre = 0;
int last = 1;
while (last < nums.length && pre < nums.length){
if (d[last] - d[pre] == target){
if (ans < last - pre)
ans = last - pre;
last++;
continue;
}
if (d[last] - d[pre] > target)
pre++;
if (d[last] - d[pre] < target)
last++;
System.out.println(last + " " + pre); //看双指针的移动
}
return ans;
}
}