实习项目相关

决策引擎实现机制

决策引擎结果与实际不同情况的处理

高并发高QPS情况

  1. 弹性阔缩容
  2. 通信协议

    线上问题处理

    Java相关

    Spring相关

    Bean的依赖注入

    @Autowired 与 @Resource

    JDK相关

    线程池

  3. 工作机制

  4. 拒绝策略

    线程池实际问题

  • 线程池大小为5,如何先执行3个线程的任务,再执行2个线程的任务
  • 5台机器,先执行3个机器的任务,再执行2个机器的任务

    ConcurrentHashMap数据结构与锁的位置

    锁升级

    无锁情况下notify

    JVM相关

    变量保存的位置

    栈帧

    有哪些垃圾回收算法

    如何判断该回收的对象

    算法题

    数据流的中位数
    如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。

    输入 [5,2,3,4,1,6,7,0,8]

    输出 “5.00 3.50 3.00 3.50 3.00 3.50 4.00 3.50 4.00 “

    说明 数据流里面不断吐出的是5,2,3…,则得到的平均数分别为5,(5+2)/2,3…

  1. // 排序后的有序序列分为左右两个堆,左为大顶堆,右为小顶堆
  2. // 左右数量不一致情况下:堆顶元素为中位数;
  3. // 左右数量一致情况下:堆顶元素为左右堆顶平均数
  4. Queue<Integer> l = new PriorityQueue<>((n1, n2) -> n2 - n1);
  5. Queue<Integer> r = new PriorityQueue<>();
  6. public void addNum(int num) {
  7. // 数字进入左序列
  8. if(l.size() == r.size()) {
  9. // 右序列添加了一个比最小值大的元素,使右序列最小元素进入左序列
  10. if(r.size() != 0 && num > r.peek()) {
  11. l.offer(r.poll());
  12. r.offer(num);
  13. } else {
  14. l.offer(num);
  15. }
  16. }
  17. // 数字进入右序列
  18. else {
  19. // 左序列添加了一个比最大值小的元素,使左序列最大元素进入右序列
  20. if(num < l.peek()) {
  21. r.offer(l.poll());
  22. l.offer(num);
  23. } else {
  24. r.offer(num);
  25. }
  26. }
  27. }
  28. public double findMedian() {
  29. // 左右子序列等长返回平均值
  30. if(l.size() == r.size()) {
  31. return (l.peek() + r.peek()) / 2.0;
  32. }
  33. // 左右不等长返回中位数
  34. return l.peek();
  35. }

设计相关

OJ网站的实现流程