搜狐校招Java后端开发一面面经——已过一面
全程一个半小时,给我说得口干舌燥,面完还以为过不了了,去问了 hr ,hr 说过了,我说我很多没答好诶,她说考察可能会很深入但是不要求一定了解,主要看同学的基础和学习能力
- 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) 的,我没想出来)
全程没有问 gc 和 数据库,明明还好好准备了,最怕并发,结果一堆并发...
放下算法题代码,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; } }