1. 计算机网络传输层有哪些协议?分别适用于什么场景?
传输层核心协议有两个:
- TCP(传输控制协议):
特点:面向连接、可靠传输(通过三次握手建立连接、四次挥手断开连接,支持重传、拥塞控制等)、字节流传输。
适用场景:对可靠性要求高的场景,如文件传输(FTP)、网页浏览(HTTP/HTTPS)、邮件发送(SMTP)等。
- UDP(用户数据报协议):
特点:无连接、不可靠(不保证送达,无重传机制)、数据报传输、效率高。
适用场景:对实时性要求高但可容忍少量丢包的场景,如视频 / 语音通话(流媒体)、在线游戏、DNS 查询等。
2. 多线程的使用场景有哪些?线程开启多少个合适?判断标准有哪些?
多线程使用场景:
- 异步任务处理(如日志记录、邮件发送,不阻塞主线程);
- 并发 IO 操作(如多文件下载、数据库批量查询,利用 IO 等待时间);
- 实时数据处理(如消息队列消费、实时监控);
- 复杂计算任务拆分(如大数据量排序、分布式计算)。
线程数量没有 "固定答案",需结合任务类型判断:
- CPU 密集型任务(如数学计算):线程数≈CPU 核心数(避免线程切换开销);
- IO 密集型任务(如网络请求、文件读写):线程数可适当增加(通常为 CPU 核心数 ×2,或根据 IO 等待时间调整)。
判断标准:
- 系统响应时间(避免线程过多导致调度延迟);
- 资源利用率(CPU、内存、IO 不超限);
- 任务类型(CPU/IO 密集);
- 实际压测结果(通过监控工具观察性能瓶颈)。
3. 线程池的提交方式有哪几种?
Java 线程池(ExecutorService)有两种核心提交方式:
- execute(Runnable command):
无返回值,仅执行任务;若任务抛出异常,会直接抛出(需手动捕获)。
- submit(Callable<T> task) 或 submit(Runnable task, T result):
有返回值(Future<T>),可通过Future获取任务结果或异常;任务异常会被封装在Future中(调用get()时抛出)。
4. 锁的实现原理介绍一下?
Java 中锁的实现主要分为两类:
(1)synchronized 关键字
- 底层依赖 对象头(Mark Word) 和 Monitor(监视器锁):
- 对象头存储锁状态(无锁、偏向锁、轻量级锁、重量级锁);
- 重量级锁通过 Monitor 实现:每个对象关联一个 Monitor,线程竞争锁时需获取 Monitor 的所有权(涉及操作系统互斥锁,开销较大)。
- JDK 6 后优化:引入偏向锁(减少无竞争时的开销)、轻量级锁(自旋锁,避免立即升级为重量级锁)。
(2)java.util.concurrent.locks.Lock 接口(如 ReentrantLock)
- 基于 AQS(AbstractQueuedSynchronizer) 实现:
- AQS 通过内置的双向队列管理等待线程,用state变量表示锁的状态(0:无锁,>0:被持有);
- 线程竞争锁时,通过 CAS 操作修改state,失败则进入队列等待(可响应中断、设置超时)。
5. TCP 协议中拥塞控制的主要作用是什么?
拥塞控制是 TCP 协议为避免网络拥塞而设计的机制,主要作用:
- 防止发送方发送速率超过网络承载能力,避免数据包大量丢失;
- 维持网络稳定性,保证数据传输的高效性(在拥塞与吞吐量间平衡)。
核心算法包括:慢启动、拥塞避免、快重传、快恢复。
6. String 类的常用函数有哪些?列举十种。
String类提供了丰富的字符串操作方法,常用的有:
- int length():返回字符串长度;
- char charAt(int index):获取指定索引的字符;
- String substring(int beginIndex, int endIndex):截取子串(左闭右开);
- boolean equals(Object anObject):比较字符串内容是否相等;
- int indexOf(String str):查找子串首次出现的索引(未找到返回 - 1);
- String replace(char oldChar, char newChar):替换字符;
- String trim():去除首尾空白字符;
- String toLowerCase() / toUpperCase():转换为小写 / 大写;
- String[] split(String regex):按正则分割字符串;
- boolean startsWith(String prefix):判断是否以指定前缀开头。
7. String、StringBuffer、StringBuilder 的区别有哪些?所有类名包含 Buffer 的类的内部实现原理是什么?有什么优势?
(1)三者区别
|-------|-----------------|----------------------|----------------|
| 特性 | String | StringBuffer | StringBuilder |
| 可变性 | 不可变(底层数组final) | 可变(数组可修改) | 可变(数组可修改) |
| 线程安全 | 安全(不可变) | 安全(方法加synchronized) | 不安全(无同步) |
| 性能 | 差(修改时创建新对象) | 中(同步开销) | 优(无同步开销) |
(2)Buffer 类(如ByteBuffer、StringBuffer)的实现原理与优势
- 原理:内部基于数组存储数据,通过position(当前位置)、limit(可操作上限)、capacity(容量)三个指针控制数据读写,避免频繁创建新对象。
- 优势:
- 高效处理数据:通过指针操作减少数组复制,提升 IO / 字符串操作性能;
- 支持批量操作:如ByteBuffer可直接与 Channel 交互,适合网络 / 文件传输。
8. String 字符串的不可变是指哪里不可变?
String的不可变性体现在:
- 底层存储数据的数组被final修饰(JDK 8 为char[],JDK 9 + 为byte[]),无法修改数组引用;
- 类中未提供修改数组元素的方法(如substring、replace等方法均返回新String对象)。
即:一旦创建String对象,其内容(字符序列)无法被修改,任何 "修改" 操作都会生成新对象。
9. HTTP 协议有哪些字段,列举 3 个就可以。
HTTP 请求 / 响应头包含多个字段,常用的有:
- Host:指定请求的服务器域名和端口(如Host: www.example.com);
- Content-Type:表示请求 / 响应体的数据格式(如Content-Type: application/json、text/html);
- User-Agent:描述发送请求的客户端(如浏览器型号、操作系统,User-Agent: Mozilla/5.0 ...)。
10. Java 异常类有哪些?分别管理什么异常?
Java 异常体系以Throwable为根,分为两类:
(1)Error(错误)
- 表示 JVM 无法处理的严重错误(如内存溢出),无需捕获,如:
- OutOfMemoryError:内存不足;
- StackOverflowError:栈溢出(如递归过深)。
(2)Exception(异常)
- 表示程序可处理的异常,分为受检异常(编译时需捕获)和非受检异常(RuntimeException及其子类,编译时无需捕获)。
- 受检异常:如IOException(IO 操作错误)、ClassNotFoundException(类未找到);
- 非受检异常:如NullPointerException(空指针)、IndexOutOfBoundsException(索引越界)、ArithmeticException(算术错误,如除 0)。