以下整理了阿里巴巴 Java 面试中常见的各类题目,涵盖基础、框架、系统设计、数据库等多个方向,供大家参考与准备。

JAVA 基础

Java 基本数据类型有哪些?各自占多少字节?

String 类能否被继承?为什么?

String、StringBuffer、StringBuilder 的区别。

ArrayList 与 LinkedList 的区别。

类的实例化顺序(父类与子类的静态数据、构造函数、字段等)。

常用的 Map 类及其区别,HashMap 是否线程安全?并发下用什么 Map?它们的存储、哈希、扩容机制如何?

JDK8 中 ConcurrentHashMap 为何放弃分段锁?如果你来设计会如何改进?

是否有有序的 Map 实现?如何保证顺序?

抽象类与接口的区别,类能否多继承?接口能否多继承?类能否实现多个接口?

继承与聚合的区别。

IO 模型有哪些?NIO 与 BIO、AIO 的区别,Reactor 模型的理解。

反射的原理及创建类实例的三种方式。

Class.forName() 与 ClassLoader 的区别。

动态代理的实现方式及其优缺点。

动态代理与 CGLIB 的区别。

为什么 CGLIB 能对接口进行代理?

final 关键字的作用。

写出三种单例模式的实现。

如何在父类中统一实现子类的 hashCode 与 equals?优劣如何?

谈谈 public、private、protected、default 在面向对象设计中的作用。

深拷贝与浅拷贝的区别。

数组与链表的数据结构及时间复杂度分析。

error 与 exception 的区别,CheckedException 与 RuntimeException 的区别。

列举 5 个常见的运行时异常。

能否自定义一个 java.lang.String 类并被类加载器加载?为什么?

对 Object 中 hashCode() 与 equals() 的理解,什么场景下需要重写?

泛型的作用是什么?

hashCode() 与 equals() 的关系。

两个不相等的对象是否可能有相同的 hashCode?

HashSet 的内部工作机制。

什么是序列化?如何实现?为什么需要序列化?反序列化可能遇到什么问题?

Java 8 有哪些新特性?

JVM 知识

什么情况下会导致栈内存溢出?

JVM 内存结构,Eden 与 Survivor 区的比例。

为什么 JVM 内存要分为新生代、老年代?新生代为什么分 Eden 和 Survivor?

一次完整的 GC 流程,对象如何进入老年代,常见的 JVM 参数有哪些?

常见的垃圾收集器及其优缺点,重点说明 CMS 与 G1 的原理与流程。

垃圾回收算法的实现原理。

内存溢出时如何排查?

JVM 内存模型:重排序、内存屏障、happen-before、主内存与工作内存等概念。

类加载器有哪些?能否打破双亲委派模型?如何打破?

Java 反射机制。

你们线上环境的 JVM 参数是怎样的?

G1 与 CMS 的区别,吞吐量优先与响应优先的收集器选择。

如何打印线程栈信息?

解释以下 JVM 参数:
-server -Xms512m -Xmx512m -Xss1024K -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxTenuringThreshold=20 -XX:
CMSInitiatingOccupancyFraction=80 -XX:+UseCMSInitiatingOccupancyOnly

开源框架

Tomcat 的结构、类加载流程与线程模型。

Tomcat 调优涉及哪些参数?

Spring 的加载流程。

Spring AOP 的实现原理。

Spring 事务的传播属性。

Spring 如何管理事务?

Spring 中事务的配置方式(关键 XML 元素)。

谈谈你对 Spring 的理解:非单例注入原理、生命周期、循环依赖、AOP 术语与协作机制。

SpringMVC 中 DispatcherServlet 的初始化过程。

Netty 的线程模型及其基于 Reactor 模式的实现。

为什么选择 Netty?

什么是 TCP 粘包与拆包?如何解决?

Netty 中 HashedWheelTimer 的用法、原理及延迟问题处理。

弱网环境下 Netty 的心跳处理机制。

Netty 的通信协议设计。

SpringMVC 常用注解及其原理。

SpringBoot 的启动机制。

操作系统

Linux 系统中你关注哪些内核参数?

Linux 下的 IO 模型及其含义。

epoll 与 poll 的区别。

常用的 Linux 命令有哪些?

用一行命令查看文件最后五行。

用一行命令查看正在运行的 Java 进程。

操作系统中的线程切换过程。

进程与线程的区别。

top 命令输出内容及其作用。

CPU 使用率过高时如何定位问题?

多线程

多线程的实现方式,什么是线程安全?

volatile 的作用与原理,能否替代锁?

画出线程的生命周期状态图。

sleep() 与 wait() 的区别。

sleep(0) 的作用。

Lock 与 synchronized 的区别。

synchronized 的原理、使用场景(静态方法与非静态方法的区别)、相关概念:重排序、自旋锁、偏向锁、轻量级锁、可重入锁、公平锁、非公平锁、乐观锁、悲观锁。

原子类的使用及原理。

JUC 中常用的并发工具及其原理。

线程池的使用、参数含义(coreSize、maxSize 等)、newCachedThreadPool 与 newFixedThreadPool 的区别。

线程池的关闭方式及其区别。

如何限制每秒最多 10 个线程调用某个接口?

Spring 的 Controller 是单例还是多例?如何保证线程安全?

三个线程按顺序循环打印 ABC。

ThreadLocal 的作用、原理及使用注意事项。

如何实现一个线程安全的链表?

无锁数据结构及其实现原理。

wait() 与 notify() 机制。

CAS 机制及 ABA 问题的解决。

线程挂起如何处理?

CountDownLatch 与 CyclicBarrier 的原理、用法与区别。

AQS(AbstractQueuedSynchronizer)的理解,加锁与解锁流程,独占锁与公平锁的区别。

synchronized 修饰静态方法与非静态方法的区别。

ConcurrentLinkedQueue 与 LinkedBlockingQueue 的区别与用途。

线程死锁的原因与解除方法。

多个线程(可能跨机器)之间如何协调完成任务?

读写锁的原理与使用场景。

如何保证多个线程按顺序执行或全部执行完毕再获取结果?

延迟队列的实现方式,DelayQueue 与时间轮算法的异同。

TCP 与 HTTP

HTTP/1.0 与 HTTP/1.1 的区别。

TCP 三次握手与四次挥手的流程,为什么断开需要四次握手?两次握手会有什么问题?

TIME_WAIT 与 CLOSE_WAIT 的区别。

常见的 HTTP 状态码(200、302、404 等)。

浏览器输入 URL 后发生了什么?

TCP/IP 如何保证可靠性?TCP 头部结构是怎样的?

如何避免浏览器缓存?

如何理解 HTTP 协议的无状态性?

GET 与 POST 的区别及数据包格式。

HTTP 有哪些请求方法?

HTTP 请求报文的格式。

HTTP 长连接的含义。

HTTPS 的加密流程。

HTTP 与 HTTPS 在握手过程中的区别。

什么是分块传输?

Session 与 Cookie 的区别。

架构与分布式

自己实现一个 LRU 缓存。

分布式环境下如何生成唯一序列号?

设计一个秒杀系统,支持 30 分钟未付款自动关闭订单。

如何用 Redis 与 ZooKeeper 实现分布式锁?各自的优缺点与适用场景。

如何防御恶意连接攻击?

分布式事务的原理、实现方式、2PC 与 3PC 的区别及尚未解决的问题。

什么是一致性哈希?

对 RESTful 的理解。

如何设计良好的 API?

如何建立并维持百万级长连接?

什么是 MESI 协议(缓存一致性)?

常见的哈希算法有哪些?

Paxos 算法与 ZAB 协议。

如何防止多人同时编辑同一份在线文档?

系统突然变慢如何排查?

常用的设计模式。

Dubbo 的原理、集群、负载均衡、服务注册与发现、重试与容错机制。

一次 RPC 请求的流程。

自己实现 RPC 的思路,RPC 要解决什么问题?

异步模式的意义与应用。

你在编程中如何应用开闭原则等设计原则?

设计一个高并发、可扩展的私信系统,画出架构图。

MVC 模式及其常见框架。

分享你参与过的服务器架构设计,遇到的问题及解决方案。

如何监控应用服务器性能?不同监控方式的区别。

如何设计高并发支付系统?

负载均衡的实现方式与常见算法。

ZooKeeper 的用途与选举原理。

ZooKeeper 的 Watch 机制原理。

MyBatis 的底层原理。

如何在分布式环境中实现 CountDownLatch?

如何防止重复提交?

描述一个服务从发布到被消费的完整流程。

谈谈你对服务治理的理解。

如何保证接口的幂等性?

限流策略:令牌桶与漏斗算法的适用场景。

如何理解数据一致性?

服务调用方如何容错?服务重启时如何减少资源浪费?什么是流量半开?

Dubbo 泛化调用的实现原理。

远程调用超时如何优雅处理?JDK 自带的超时机制有哪些?

算法

从 10 亿个数字中找出最小的 10 个。

从 1 亿个数字中快速找出重复的那个。

从 2 亿个无序整数中找出中位数。

对未知长度的输入字符串进行去重设计。

二叉树遍历。

从 3n+1 个数字中找出唯一不重复的那个。

实现字符串反转函数。

常见排序算法(快排、归并、冒泡)及其时间复杂度,冒泡排序的优化。

二分查找的时间复杂度与优势。

如何对 TreeSet 进行倒序输出?

B+ 树与 B- 树的区别与实际应用场景。

删除单向链表中倒数第 N 个节点。

从 200 个有序数组(每个数组 100 个元素)中找出 Top 20 元素。

找出单向链表的中间节点。

数据库

数据库隔离级别及其含义,MySQL 默认隔离级别。

什么是幻读?

MySQL 的存储引擎及其优缺点。

高并发下如何安全地修改同一行数据?

乐观锁与悲观锁,InnoDB 的行级锁类型。

SQL 优化的一般步骤,如何查看执行计划?

数据库死锁的例子及 MySQL 解决方案。

MySQL 索引原理、索引类型、如何创建与优化索引?

聚集索引与非聚集索引的区别。

SELECT FOR UPDATE 的含义及锁的范围。

为什么使用 B+ 树?它是如何分裂与保持平衡的?

数据库的 ACID 特性。

千万级数据表的 CRUD 优化方法。

如何避免全表扫描?

如何利用复合索引?

IN 与 EXISTS 的区别。

自增主键可能带来的问题。

MVCC 的含义与实现。

分库分表的经验与中间件(如 Sharding-JDBC)的原理。

如何解决 MySQL 主从延迟?

消息队列

消息队列的使用场景。

消息重发与补偿策略。

如何保证消息的顺序性?

常用的 MQ 及其优缺点,MQ 连接是否线程安全?你们公司的 MQ 架构是怎样的?

如何保证消息不丢失?

RabbitMQ 如何实现高可用集群?

Kafka 高吞吐的原因。

Kafka 与其他 MQ 的区别,如何实现主从同步?

如何利用 MQ 实现最终一致性?

使用 Kafka 遇到过哪些问题?如何解决?

消息重复消费如何避免?如何实现幂等?

消息延迟与过期如何处理?

缓存

常见的缓存策略,如何保证缓存与数据库的一致性?你们项目中用了什么缓存系统?

如何防止缓存击穿与雪崩?

缓存数据过期后的更新策略。

Redis 的 List 结构操作。

Redis 支持的数据结构。

Redis 的使用注意事项:持久化方式、内存设置、集群优劣、淘汰策略等。

Redis 2.x 与 3.x 的区别,3.x 的通信机制。

Redis 集群方案及其优缺点。

Memcached 的原理与适用场景。

Redis 与 Memcached 在内存管理上的区别。

Redis 的并发竞争问题如何解决?了解 Redis 事务的 CAS 吗?

Redis 集群的选举流程。

Redis 的持久化机制,AOF 与 RDB 的区别。

Redis 集群如何同步数据?

Redis 的优化手段。

Redis 主从复制的原理。

Redis 的线程模型。

设计一个可自动调整大小的本地缓存。

本地缓存与集中式缓存的优缺点及注意事项。

搜索

Elasticsearch 的倒排索引是什么?你们公司的 ES 集群架构、索引大小与分片情况是怎样的?

ES 索引数据过大如何调优与部署?

ES 如何实现 Master 选举?

ES 索引文档的过程。

ES 搜索的过程。

部署 ES 时,对 Linux 有哪些优化建议?

Lucene 的内部结构。

以上题目整理自网络,仅供学习参考,无标准答案。希望大家对照查漏补缺,提升面试准备效率。