一、第一次面试
1. synchronized关键字原理及普通方法与静态方法加锁的区别
synchronized基于JVM的监视器锁(Monitor)实现,通过对象头的Mark Word标记锁状态。普通方法加锁(如synchronized method())锁定的是当前实例对象(this),同一实例的并发调用会被阻塞;静态方法加锁(如synchronized static method())则锁定类的Class对象(如ClassName.class),所有实例共享同一把类锁。两者的锁粒度不同,普通方法锁实例,静态方法锁类,因此静态锁的并发控制范围更广。
2. 常见垃圾回收算法及适用区域
• 标记-清除:标记无用对象后直接回收,产生内存碎片,适用于老年代(存活对象多)。
• 复制算法:将内存分为两块,仅使用一块存活对象复制到另一块后清空原区,适用于新生代(短命对象多)。
• 标记-整理:标记后整理存活对象至一端,避免碎片,适用于老年代。
• 分代收集:结合上述算法,新生代用复制,老年代用标记-清除/整理,是主流JVM的策略。
3. MySQL索引数据结构
InnoDB默认使用B+树作为索引结构。B+树的特点包括多叉树结构减少磁盘I/O、叶子节点形成有序链表支持高效范围查询、非叶子节点仅存索引键不存数据以节省空间。此外,内存中的哈希索引(如Memory引擎)支持O(1)查询,但不支持范围扫描,故InnoDB以B+树为主。
4. 线程池核心参数
• corePoolSize:核心线程数,即使空闲也保留。
• maximumPoolSize:最大线程数,任务队列满后创建新线程的上限。
• keepAliveTime:非核心线程的空闲存活时间。
• workQueue:任务队列,存放待执行任务(如LinkedBlockingQueue/SynchronousQueue)。
• threadFactory:线程创建工厂,可定制线程名称等。
• handler:拒绝策略(Abort直接报错、Discard丢弃、CallerRuns由调用线程执行、DiscardOldest丢弃旧任务)。
5. DDD(领域驱动设计)
DDD是一种以业务领域为核心的设计方法,通过领域模型(实体、值对象、聚合根等)映射复杂业务逻辑,解决传统开发中领域与技术代码混杂的问题。其核心是划分限界上下文,明确领域边界,通过战术设计(如领域事件、仓储)和战略设计(分层架构)构建高内聚系统。DDD强调与领域专家协作,避免“贫血模型”,提升代码可维护性与业务表达力。
6. 查找最长回文字符串
class Main {
public static void main(String[] args) {
String input = "babad";
System.out.println("输入:" + input);
System.out.println("输出:" + longestPalindrome(input));
// 其他测试用例
System.out.println("输入:cbbd → 输出:bb");
System.out.println("输入:a → 输出:a");
System.out.println("输入:ac → 输出:");
}
public static String longestPalindrome(String s) {
if (s == null || s.length() < 1) return "";
int start = 0, end = 0;
for (int i = 0; i < s.length(); i++) {
int len1 = expandAroundCenter(s, i, i); // 奇数长度
int len2 = expandAroundCenter(s, i, i + 1); // 偶数长度
int maxLen = Math.max(len1, len2);
if (maxLen > end - start) {
start = i - (maxLen - 1)/2;
end = i + maxLen/2;
}
}
return s.substring(start, end + 1);
}
private static int expandAroundCenter(String s, int left, int right) {
while (left >= 0 && right < s.length()
&& s.charAt(left) == s.charAt(right)) {
left--;
right++;
}
return right - left - 1; // 返回长度
}
}
7、反转链表
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
}
}
class Main {
public static void main(String[] args) {
String input = "1->2->3->4->5->NULL";
System.out.println("输入链表:" + input);
ListNode head = createLinkedList(input);
ListNode reversed = reverseList(head);
System.out.print("反转链表:");
printLinkedList(reversed);
}
//处理输入
// 字符串转链表
public static ListNode createLinkedList(String input) {
String[] nodes = input.split("->");
ListNode dummy = new ListNode(-1);
ListNode current = dummy;
for (String node : nodes) {
if (node.equals("NULL")) break;
current.next = new ListNode(Integer.parseInt(node));
current = current.next;
}
return dummy.next;
}
// 反转链表(迭代法)
public static ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode curr = head;
while (curr != null) {
ListNode nextTemp = curr.next;
curr.next = prev;
prev = curr;
curr = nextTemp;
}
return prev;
}
//处理输出
// 打印链表
public static void printLinkedList(ListNode head) {
StringBuilder sb = new StringBuilder();
while (head != null) {
sb.append(head.val);
if (head.next != null) sb.append("->");
head = head.next;
}
sb.append("->NULL");
System.out.println(sb.toString());
}
}
二、语雀-JVM面试题
1、简单介绍一下JIT优化技术?
1. 热点检测
2. 编译优化
1. 逃逸分析
2、对JDK进程执行kill -9有什么影响?
3、JVM的运行时内存区域是怎样的?
4、Java的堆是如何分代的?为什么分代?
1. 对象分代晋升
5、YoungGC和FullGC的触发条件是什么?
6、什么是Stop The World?
7、JVM有哪些垃圾回收算法?
1. 标记清除
2. 标记复制
3. 标记整理
8、JVM如何判断对象是否存活?
1. 可达性分析缺点
9、什么是三色标记算法?
1. 如何解决漏标
1. 增量更新
2. 原始快照
10、新生代和老年代的GC算法
11、新生代和老年代的垃圾回收器有何区别?
1. 串行垃圾回收器 Serial GC,Serial Old
2. 并行垃圾回收器 ParNew,Parallel Scavenge,Parallel Old
12、G1和CMS有什么区别?
13、CMS回收器
14、G1回收器
15、ZGC回收器
16、JVM的并发回收和并行回收
三、语雀-MySQL面试题
1、如何理解MVCC?
1. 快照读与当前读
2. 行记录的隐式字段
3. Read View
2、当前读和快照读有什么区别?
3、MySQL中的事务隔离级别?
4、介绍下InnoDB的锁机制?
1. 共享锁&排他锁
2. 意向锁
3. 记录锁
4. 插入意向锁
5、MySQL的行级锁锁的到底是什么?
1. Record Lock
2. Gap Lock
3. Next-Key Lock
4. MySQL的加锁原则
1. 主键索引例子
2. 普通索引例子
lock in share mode 为共享锁(读锁)。
排他锁会禁止其他事务读取或修改被锁定的行,语法为 SELECT ... FOR UPDATE。
5. 总结
6、什么是排他锁和共享锁?
InnoDB 支持 行级锁(Row-Level Locking),因此共享锁和排他锁通常是针对单行或多行记录的,而不是整个表。
InnoDB 的行锁是通过索引实现的。如果查询未使用索引(全表扫描),可能会退化为表级锁(实际是锁定整个聚簇索引,即整个表)。