java面试题(一)

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类提供了丰富的字符串操作方法,常用的有:​

  1. int length():返回字符串长度;
  2. char charAt(int index):获取指定索引的字符;
  3. String substring(int beginIndex, int endIndex):截取子串(左闭右开);
  4. boolean equals(Object anObject):比较字符串内容是否相等;
  5. int indexOf(String str):查找子串首次出现的索引(未找到返回 - 1);
  6. String replace(char oldChar, char newChar):替换字符;
  7. String trim():去除首尾空白字符;
  8. String toLowerCase() / toUpperCase():转换为小写 / 大写;
  9. String[] split(String regex):按正则分割字符串;
  10. 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)。