后端开发工程师[Java]-商业产品技术职位 [社招-一面]
- 面试介绍自己
- 八股文 经典的一些
- 线程之间的同步及机制 有哪些种类 以及区别
CountDownLatch CyclicBarrier Semaphore LockSupport
synchronized
和ReentrantLock
实现和区别,jvm
层的字节码等等(回答的不是很好)- 线上服务某些
pod
cpu
过高怎么排查,负载不均匀
是什么问题,经典Linux场景题,回答差不多就行(top jstatck arthas dump
等 ) MySQL
的三个日志文件binlog
redolog
undolog
分别是什么作用,这个问题隐藏的mvvc原理呀,等深入的问题,回答不太好(redo log日志保证事务的持久性,使用undo log日志保证事务的原子性。binlog 做从库或者中间件的数据来源,以及保证数据库的一致性
)- 项目使用了队列
Kafka
说一下你们为什么用,一直Kafka的优点,你们消费者群组怎么设置,如何防止重复消费,分区的目的是啥?创建Topic如何将分区放置到不同Broker。(我其实之前用的Redis,后来领导买了Kafka我就改了,你要问我为啥,领导让用啥用啥,对了,还问你Redis队列构建,数据补偿,有什么优化措施,这点很怕问zookeeper,还好没问,不过高版本Kafka舍弃了zookeeper,改为了KRaft,好像更麻烦了) - 看你用了不少Redis,熟悉结构吧,一堆瞎编(看过一点源码),然后就是
redis大key
怎么处理(其实就是减小单个key大小,可以根据属性拆分,亦可以拆成不同部分,关键在于降低一个key的大小) - 热点key定义,如何
缓存热点key
,这点就要说下缓存常见问题,缓存穿透、缓存击穿
等等,面试反问是不是可以做二级 三级缓存,是的,可以在redis做一个,以及jvm使用hashmap等类似的缓存工具做一个 - redis 还有什么使用吗 就是
分布式锁
之类的了,实现基于k8s部署的自动雪花算法
机器中心以及数据中心维护,心跳
- 做道题吧,如下 由于他那个飞书(打不开代码框),就让我说下思路,这题一看就是第一个
思路双指针
,不过做的时候真不一定十分钟ac
//输入:head = [1,2,3,4]
//输出:[1,4,2,3]
//
// 示例 2:
//
//
//
//
//输入:head = [1,2,3,4,5]
//输出:[1,5,2,4,3]
//
//
//
// 提示:
//
//
// 链表的长度范围为 [1, 5 * 10⁴]
// 1 <= node.val <= 1000
//
//
//leetcode submit region begin(Prohibit modification and deletion)
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public void reorderList(ListNode head) {
if (head == null || head.next == null) {
return;
}
//快慢指针找到中间节点
ListNode slow = head;
ListNode fast = head;
while (fast.next != null && fast.next.next != null) {
slow = slow.next;
fast = fast.next.next;
}
//反转后半部分链表
ListNode pre = null;
ListNode cur = slow.next;
slow.next = null;
while (cur != null) {
ListNode next = cur.next;
cur.next = pre;
pre = cur;
cur = next;
}
//合并两个链表
ListNode p1 = head;
ListNode p2 = pre;
while (p1 != null && p2 != null) {
ListNode next1 = p1.next;
ListNode next2 = p2.next;
p1.next = p2;
p2.next = next1;
p1 = next1;
p2 = next2;
}
}
}
//leetcode submit region end(Prohibit modification and deletion)
-
咱们平常排序比较多,说下快排思想,java的快排呢,时间复杂度多少,什么时候快排并不好用,堆排序呢,时间复杂度,java中有吗,对于n个数取Top m ,应该使用什么,时间复杂度(脑残了,说成,应该是,介绍下堆排序,其实使用
PriorityQueue<Integer> queue = new PriorityQueue<>(n);
默认小顶队, 大顶堆PriorityQueue<Integer> queue = new PriorityQueue<>((o1, o2) -> o2 - o1);
-
然后就是反问,45分钟左右,主要是代码编辑器打不开,省时间,估计没有后续。