2026.4.26 面经学习
StringBuilder和StringBuffer的区别是什么?
StringBuilder 和 StringBuffer 都是用来拼接字符串的可变对象,核心区别是:
StringBuilder:线程不安全,性能更高。
StringBuffer:线程安全,方法大多加了 synchronized,性能相对低。
大多数实际开发中更常用 StringBuilder,因为字符串拼接通常发生在方法内部,是局部变量,不会被多个线程共享。
遇到过哪些线程安全问题?
我遇到过比较典型的线程安全问题是共享变量并发修改导致数据不一致。
比如多个线程同时更新同一个统计值、库存数量、任务状态,如果直接用普通变量或者普通对象字段,会出现覆盖更新问题。
例如:
count++;
这行代码不是原子操作,实际包含:
读取 count
加 1
写回 count
多个线程同时执行时,可能两个线程都读到 count = 10,然后都写回 11,最终少加了一次。
可以使用AtomicInteger来解决
ArrayList和LinkedList的区别?讲一下链表的数据结构,LinkedList是双向链表还是单向链表?
ArrayList是基于动态数组实现的,有扩容机制,扩容后数组大小变为原来的1.5倍,ArrayList的元素分布在内存中是连续的
LinkedList是基于双向链表实现的,理论上没有大小限制,元素在内存中的分布是分散的
讲一下HashMap?怎么根据hash值定位到数组?一定要重写hashCode和equals吗?
HashMap是Java的键值数据结构,JDK7是链表+数组实现,JDK8是链表+数组+红黑树
怎么根据hash值定位到数组
hash & (n - 1)
n是数组长度(一定是 2 的幂)&是按位与运算,本质等价于取模,但更高效
必须重写hashCode和equals吗
如果把“自定义对象”作为 key,必须重写。 HashMap 判断 key 是否相同分两步:
- 先比
hashCode - 再比
equals如果不重写: new User(1) 和 new User(1) 默认:
hashCode不同(对象地址)equals为 false 结果:- 会被当成两个 key → 数据错乱 / 查不到
讲一下怎么实现单例模式?
用过哪些Java命令?遇到过实际问题吗?
jps:查看 Java 进程jstack:查看线程栈(排查死锁、卡顿)jmap:查看内存(dump 堆、分析对象)
jps
jps:Java 进程查看工具,用于列出当前机器上运行的 Java 进程
jps -l # 查看Java进程
最左边是进程PID
jstack
jstack:查看线程栈,把 JVM 内所有线程的运行状态 + 调用栈全部展开,用于定位并发和性能问题。
jstack PID #查看线程栈信息
jstack 27124 查看对应的线程栈
jstack排查死锁
jstack 27124 | grep -A 30 "Found one Java-level deadlock"
|:管道符,把前一个命令的输出交给后一个命令处理。
grep "Found one Java-level deadlock" 表示搜索包含这句话的行。
-A 20表示匹配到这一行之后,再往后显示 20 行。
jmap
jmap:查看内存 / 导出堆,用于查看 JVM 堆内存使用情况和导出堆快照,主要用于排查 OOM、内存泄漏、对象占用异常。
jmap -heap PID :查看堆内存概要
jmap -dump:live,format=b,file=heap.hprof PID:导出堆
导出的堆可以在IDEA中查看,文件名是
heap.hprof
导出的堆主要看什么?
最大对象和GC 根看哪些对象占用空间大,对象为什么没有被回收
怎么在Linux上查看Java进程占用端口?
jps -l 拿到Java运行进程的PID,后续几个回答默认拿到了PID
netstat -tlnp | grep PID :获取对应的端口
netstat:查看网络连接、监听端口、路由表等网络信息。
-t:只看 TCP 连接。
-l:只看监听中的端口,也就是服务端口,比如 8080、3306。
-n:用数字显示地址和端口,不做域名解析。
怎么在Linux上查看Java进程打开了哪些文件?
lsof -p PID
lsof:list open files,列出系统中被进程打开的文件。
-p PID:只查看指定进程。
怎么在Linux上查看Java进程内存占用率?
top -p PID
top:系统监控工具,类似任务管理器,实时刷新进程状态。
-p PID:只显示指定进程
讲一下输入url到返回网页的过程?
输入 URL
→ DNS 解析
→ TCP 建立连接(可能是 TLS)
→ 发送 HTTP 请求
→ 服务端处理
→ 返回响应
→ 浏览器解析 + 渲染
→ 连接复用或关闭
DNS使用的端口是哪个?DNS怎么去找到根域名服务器的?常见的DNS服务器的地址有哪些?本地DNS配置写在哪里的?
DNS默认的端口是53
常见的DNS:Google的8.8.8.8、CloudFlare的1.1.1.1
DNS怎么去找根域名服务器的?
这是递归解析 + 迭代查询的过程(以访问 www.example.com 为例):
- 本机把请求交给本地 DNS(递归解析器)
- 本地 DNS 如果没有缓存,会从**根服务器(.)**开始查:
根服务器(.)
→ 返回:.com 顶级域服务器地址
→ 访问 .com 服务器
→ 返回:example.com 权威 DNS
→ 访问 example.com 权威 DNS
→ 返回:www.example.com 的 IP
本地DNS的配置写在哪里?
linux的在/etc/resolv.conf
面经链接
#面经#记录每天Java和Agent面经学习