2026-05-28 04:37:03
重点考察算法细节,如正态分布的数学原理及应用场景。
需清晰解释项目中的技术选型原因及优化思路。
HashMap原理:基于哈希表实现,通过hashcode定位数组索引,链表解决冲突。
Hash碰撞解决:拉链法(链表)和开放定址法(线性探测、二次探测等)。
StringBuilder与StringBuffer:
区别:StringBuilder非线程安全,StringBuffer线程安全(方法加synchronized)。
单线程下性能:StringBuilder更快,因无同步开销。
ConcurrentHashMap:分段锁(JDK1.7)或CAS+synchronized(JDK1.8),减少并发竞争。
synchronized:静态方法锁Class对象,实例方法锁当前对象。
ReentrantLock:基于AbstractQueuedSynchronizer(AQS),支持公平锁、可中断锁。
队列同步器:维护双向链表同步队列,通过tryAcquire自旋获取锁。
ArrayList:基于动态数组,查询快(O(1)),插入慢(O(n))。
LinkedList:基于双向链表,插入快(O(1)),查询慢(O(n))。
参数:核心线程数corePoolSize、最大线程数maximumPoolSize、存活时间keepAliveTime、阻塞队列(如LinkedBlockingQueue)。
流程:任务提交→检查核心线程→加入队列→创建新线程→触发拒绝策略(如AbortPolicy)。
TCP vs UDP:TCP可靠(三次握手、四次挥手),UDP不可靠但高效。
HTTP版本:
HTTP/1.0:默认短连接,需显式设置Connection: keep-alive。
HTTP/1.1:默认长连接,支持管道化。
HTTP/2.0:二进制分帧、多路复用、头部压缩。
HTTPS:在HTTP上加入SSL/TLS加密层。
引擎对比:InnoDB支持事务和行锁,MyISAM仅支持表锁。
索引底层:B+树结构,查询快但插入/删除需维护树平衡。
TOP命令:监控CPU、内存使用率,swap为虚拟内存。
GC策略:年轻代用复制算法,老年代用标记-清除或标记-整理。
OOM原因:老年代空间不足(如大对象直接分配到老年代)。
HashMap无序性:因hashcode再散列定位索引,与插入顺序无关。
海量数据性能:HashMap扩容机制保证时间复杂度O(1),但频繁扩容可能引发短暂性能波动。
reHash安全:多线程下可能形成环状链表,导致死循环(JDK1.7问题,1.8优化)。
HashTable安全:方法级synchronized,性能较差。
reHash过程:渐进式迁移数据,避免阻塞,通过ht[0]和ht[1]交替使用。
数据结构:支持字符串、列表、哈希、集合、有序集合(ZSET)。
单线程模型:通过I/O多路复用(epoll)实现高并发,避免线程切换开销。
UDP最大容量:理论64KB(受IP数据包大小限制),实际需应用层分片。
DNS解析优化:本地缓存、TTL机制减少重复查询。
LRU算法:双向链表+哈希表实现,淘汰最近最少使用数据。
桶问题算法:7升和3升桶取2升水,通过倒水操作模拟(如7→3剩4,3倒空,4→3剩1,7装满→3倒满剩5,3倒空,5→3剩2)。
项目拓展:需深入讲解技术选型、架构设计及优化点。
HTTP与DNS:
HTTP过程:DNS解析→TCP连接→发送请求→接收响应→关闭连接。
DNS实现:分布式集群(如根域名服务器、顶级域名服务器),支持递归查询。
hosts文件:本地域名解析,优先级高于DNS查询。
负载监控:top(CPU/内存)、netstat(网络流量)、vmstat(系统整体性能)。
CPU使用率:通过时间片分配计算,如进程A在1秒内占用500ms,则使用率为50%。
用户态与内核态:用户态需通过系统调用切换到内核态执行特权操作。
最长子序列:动态规划解法,dp[i]表示以nums[i]结尾的最长子序列长度。
文本前缀匹配:使用Redis的SCAN命令(非阻塞)或Trie树结构。
CPU调度策略:
FIFO:先进先出,可能饥饿。
优先级调度:高优先级优先执行,低优先级可能长期等待。
协程优势:轻量级(用户态调度)、避免线程切换开销、适合高并发I/O场景。
Go语言特点:静态类型、并发支持(goroutine)、垃圾回收、跨平台。
书籍:《Java并发编程实战》《TCP/IP详解》《Redis设计与实现》。
工具:Linux命令(top、netstat)、Wireshark抓包分析。
实践:参与开源项目、编写技术博客总结知识点。