2026-05-17 04:09:07
字节跳动Java研发岗4面技术面真题及核心知识点总结如下:
技术一面线程参数含义线程参数包括优先级、守护状态、线程组等,优先级范围为1-10(默认5),守护线程随JVM退出而终止。
Innodb索引实现使用B+树结构,数据存储在叶子节点,非叶子节点仅存索引键,支持范围查询和高效磁盘IO。
B+树优势相比B树,B+树所有数据存储在叶子节点并通过链表连接,查询效率稳定(O(log n)),且更适合磁盘存储。
Redis分布式锁实现通过SETNX命令实现,结合过期时间防止死锁,或使用RedLock算法(多Redis实例投票)。
虚拟内存换页过程当物理内存不足时,操作系统将不常用页面换出到磁盘交换区,需访问时再换入,涉及缺页中断处理。
TCP三次握手客户端发送SYN,服务端回复SYN+ACK,客户端再发送ACK,建立可靠连接。
volatile关键字作用保证变量可见性(修改后立即同步到主内存)和禁止指令重排序,但不保证原子性。
乐观锁与悲观锁乐观锁通过版本号(CAS)实现,适合读多写少;悲观锁通过同步机制(如synchronized)实现,适合写多场景。
设计模式应用单例模式(懒汉/饿汉)、工厂模式、观察者模式等,需结合实际项目说明。
算法题:滑动窗口通过双指针维护窗口,解决如“最大子数组和”或“无重复字符的最长子串”问题。

B树与B+树区别B树非叶子节点也存数据,查询效率不稳定;B+树数据全在叶子节点,查询效率稳定且支持范围查询。
HashMap实现与扩容基于数组+链表/红黑树,扩容时重新哈希并分批迁移数据,通过sizeCtl控制并发操作。
Redis扩容机制渐进式单线程扩容,每次操作仅迁移部分数据,避免阻塞服务。
Spring IoC原理通过反射和工厂模式管理Bean生命周期,依赖注入通过XML或注解实现,循环依赖通过三级缓存解决。
多线程加1问题结果不确定(竞态条件),需通过synchronized、AtomicInteger或CAS解决。
CAS与原子类CAS(Compare-And-Swap)通过硬件指令保证原子性,AtomicInteger等类基于CAS实现。
synchronize与Locksynchronized是JVM级锁,Lock是API级锁(如ReentrantLock),支持更灵活的锁操作。
AQS特点基于CLH队列实现,支持独占/共享模式,通过状态变量state和CAS操作管理锁。
网络协议
DNS协议:使用UDP(默认端口53),因查询数据量小且需快速响应。
HTTPS协议:基于SSL/TLS加密,握手过程包括证书验证、密钥交换和会话密钥生成。
代码题
反转单链表:迭代或递归实现。
复杂链表复制:需复制节点并处理随机指针,可通过哈希表存储原节点与新节点的映射。

Java垃圾回收机制分代收集(年轻代/老年代),年轻代使用复制算法,老年代使用标记-清除或标记-整理算法。
算法题
赛马问题:64匹马,8赛道,最少需7轮比赛(分组淘汰+决赛)。
合并数组找第k大:归并后直接查找或双指针遍历。
数组重复元素检测:利用数组长度与元素范围的关系,通过哈希表或原地标记法解决。
多线程与多进程区别多线程共享内存空间,通信效率高但需同步;多进程独立内存,通信需IPC但稳定性强。
JVM垃圾回收触发条件
Minor GC:Eden区满时触发。
Full GC:老年代空间不足、方法区空间不足或调用System.gc()时触发。可回收对象:不可达对象(无引用链)或通过finalize()方法未被复活的对象。
Spring核心思想控制反转(IoC)和面向切面编程(AOP),通过依赖注入和动态代理实现解耦。

短域名服务设计
生成短码:使用哈希算法(如MD5)或自增ID+Base62编码。
存储与查询:通过Redis缓存热门短链,数据库存储完整映射关系。
分布式ID生成:雪花算法(Snowflake)或数据库自增序列。
TCP三次握手与四次挥手
三次握手:建立连接需同步序列号和确认号。
四次挥手:因TCP半关闭特性,需分别发送FIN和ACK。
数据库隔离级别
读未提交:可能脏读。
读已提交:避免脏读但不可重复读。
可重复读(MySQL默认):避免不可重复读但可能幻读。
串行化:最高隔离级别,完全串行执行。
SQL题连表查询需注意关联条件,模糊查询使用LIKE和通配符(如%)。
算法:镜像二叉树递归或迭代交换左右子树节点。

完整版面试题及字节2-2师兄整理的面试手册已打包,涵盖更多细节和扩展知识,欢迎进一步探讨学习!
