460道Java后端面试高频题
01 Java基础
- 解释下什么是面向对象?面向对象和面向过程的区别?
- 面向对象的三大特性?分别解释下?
- JDK、JRE、JVM 三者之间的关系?
- 重载和重写的区别?
- Java 中是否可以重写一个 private 或者 static 方法?
- 构造器是否可以被重写?
- 构造方法有哪些特性?
- 在 Java 中定义一个不做事且没有参数的构造方法有什么作用?
- Java 中创建对象的几种方式?
- 抽象类和接口有什么区别?
- 静态变量和实例变量的区别?
- 成员变量和局部变量的区别?
- short s1 = 1;s1 = s1 + 1;有什么错?那么 short s1 = 1; s1 += 1;呢?有没有错误?
- Integer 和 int 的区别?
- 装箱和拆箱
- switch 语句能否作用在 byte 上,能否作用在 long 上,能否作用在 String 上?
- 字节和字符的区别?
- String 为什么要设计为不可变类?
- String、StringBuilder、StringBuffer 的区别?
- String str = "i" 与 String str = new String("i") 一样吗?
- String 类的常用方法都有那些?
- final 修饰 StringBuffer 后还可以 append 吗?
- Object 的常用方法有哪些?
- 为什么 wait/notify 方法放在 Object 类中而不是 Thread 类中?
- final、finally、finalize 的区别?
- finally 块中的代码什么时候被执行?finally 是不是一定会被执行到?
- try-catch-finally 中哪个部分可以省略?
- try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
- static 关键字的作用?
- super 关键字的作用?
- transient关键字的作用?
- == 和 equals 的区别?
- 两个对象的 hashCode() 相同,则 equals() 也一定为 true 吗?
- 为什么重写 equals() 就一定要重写 hashCode() 方法?
- & 和 && 的区别?
- Java 中的参数传递时传值呢?还是传引用?
- Java 中的 Math.round(-1.5) 等于多少?
- 两个数的异或结果是什么?
- error 和 exception 的区别?
- throw 和 throws 的区别?
- 常见的异常类有哪些?
- 运行时异常与受检异常有何异同?
- 主线程可以捕获到子线程的异常吗?
- Java 的泛型是如何工作的 ? 什么是类型擦除 ?
- 什么是泛型中的限定通配符和非限定通配符 ?
- List<? extends T> 和 List <? super T> 之间有什么区别 ?
- 如何实现对象的克隆?
- 深克隆和浅克隆的区别?
- 什么是 Java 的序列化,如何实现 Java 的序列化?
- Java 中的反射是什么意思?有哪些应用场景?
- 反射的优缺点?
- Java 中的动态***是什么?有哪些应用?
- 怎么实现动态***?
- Java 中的 IO 流的分类?说出几个你熟悉的实现类?
- 字节流和字符流有什么区别?
- BIO、NIO、AIO 有什么区别?
02 Java集合类
- Java 中常用的容器有哪些?
- ArrayList 和 LinkedList 的区别?
- ArrayList 的扩容机制?
- Array 和 ArrayList 有何区别?什么时候更适合用 Array?
- HashMap 的实现原理/底层数据结构?JDK1.7 和 JDK1.8
- HashMap 的 get、put、resize 方法的过程?
- HashMap 的 size 为什么必须是 2 的整数次方?
- HashMap 多线程死循环问题?
- HashMap 的 get 方法能否判断某个元素是否在 Map 中?
- HashMap 与 HashTable/ConcurrentHashMap 的区别是什么?
- HashTable 和 ConcurrentHashMap 的区别是什么?
- ConcurrentHashMap 的实现原理是什么?
- HashSet 的实现原理?怎么保证元素不重复的?
- LinkedHashMap 的实现原理?
- Iterator 怎么使用?有什么特点?
- Iterator 和 Enumeration 接口的区别?
- fail-fast 与 fail-safe 有什么区别?
- Collection 和 Collections 有什么区别?
03 Java并发
- 并行和并发有什么区别?
- 线程和进程的区别?
- 守护线程是什么?
- 创建线程的几种方式?
- runnable 和 callable 有什么区别?
- 线程状态及转换?
- sleep() 和 wait() 的区别?
- 线程的 run() 和 start() 有什么区别?
- 在 Java 程序中怎么保证多线程的运行安全?
- Java 线程同步的几种方法?
- Thread.interrupt() 方法的工作原理是什么?
- 谈谈对 ThreadLocal 的理解?
- 多线程并行运行,主线程怎么收集子线程的信息?
- 说一说自己对于 synchronized 关键字的了解?项目中怎么使用的?
- 说说 JDK1.6 之后的 synchronized 关键字底层做了哪些优化,可以详细介绍一下这些优化吗?
- 谈谈 synchronized 和 ReenTrantLock 的区别?
- synchronized 和 volatile 的区别是什么?
- 简单介绍下 volatile?volatile 的底层原理是什么?内存屏障是如何实现的?
- 说下对 ReentrantReadWriteLock 的理解?
- 说下对悲观锁和乐观锁的理解?
- 乐观锁常见的两种实现方式是什么?分别有什么问题?
- CAS 和 synchronized 的使用场景?
- 什么是 CAS,内部怎么实现的?
- 简单说下对 Java 中的原子类的理解?atomic 的原理是什么?
- 说下对同步器 AQS 的理解?
- 说下对信号量 Semaphore 的理解?
- CountDownLatch 和 CyclicBarrier 有什么区别?
- 说下对线程池的理解?为什么要使用线程池?
- 实现 Runnable 接口和 Callable 接口的区别?
- 执行 execute() 方法和 submit() 方法的区别是什么呢?
- 如何创建线程池?
- 创建线程池的参数有哪些?
- 线程池中的的线程数一般怎么设置?需要考虑哪些问题?
- 说下对 Fork/Join 并行计算框架的理解?
- JDK 中提供了哪些并发容器?
- 谈谈对 CopyOnWriteArrayList 的理解?
- 谈谈对 ConcurrentLinkedQueue 的理解?
- 谈谈对 ConcurrentSkipListMap 的理解?
- 谈谈对 BlockingQueue 的理解?分别有哪些实现类?
04 Java虚拟机
- 说一下 Jvm 的主要组成部分?及其作用?
- 谈谈对运行时数据区的理解?
- 谈谈对堆和栈的理解?堆中存什么?栈中存什么?
- 为什么要把堆和栈区分出来呢?栈中不是也可以存储数据吗?
- Java 中的参数传递时传值呢?还是传引用?
- Java 对象的大小是怎么计算的?
- 对象的访问定位的两种方式?
- 判断垃圾可以回收的方法有哪些?有什么优缺点?
- 被标记为垃圾的对象一定会被回收吗?
- 谈谈对 Java 中引用的了解?
- 谈谈对内存泄漏的理解?举几个内存泄漏的案例?
- 常用的垃圾收集算法有哪些?各自的优缺点是什么?
- 为什么要采用分代收集算法?
- 什么是浮动垃圾?
- 常用的垃圾收集器有哪些?
- 谈谈 CMS 和 G1 的区别?
- 谈谈对 G1 收集器的理解?
- 详细说下垃圾回收策略?
- 谈谈你对内存分配的理解?大对象怎么分配?空间分配担保?
- 说下你用过的 JVM 监控工具?
- 谈谈你对 JVM 调优的理解?有过工程调优经验吗?
- JVM 设置最大堆的参数是什么?
- 谈谈你对类文件结构的理解?有哪些部分组成?
- 谈谈你对类加载机制的了解?
- 类加载各阶段的作用分别是什么?
- 有哪些类加载器?分别有什么作用?
- 怎么实现一个自定义的类加载器?需要注意什么?
- 谈谈你对双亲委派模型的理解?工作过程?为什么要使用?
- 怎么打破双亲委派模型?有哪些实际场景是需要打破双亲委派模型的?
- 谈谈你对编译期优化和运行期优化的理解?
- 谈谈你对词法分析和语法分析的理解?
- 为何 HotSpot 虚拟机要使用解释器与编译器并存的架构?
- 编译优化技术有哪些?
- 说下你对 Java 内存模型的理解?
- 内存间的交互操作有哪些?需要满足什么规则?
05 计算机网络
- 谈谈你对五层网络协议的理解?每一层的作用是什么?每一层的数据单元是什么?
- 简单说下每一层对应的网络协议有哪些?
- ARP 协议的工作原理?
- 谈下你对 IP 地址分类的理解?
- TCP 和 UDP 的区别?
- TCP 和 UDP 分别对应的常见应用层协议有哪些?
- 详细说下 TCP 三次握手的过程?
- 为什么两次握手不可以?为什么不需要四次握手?
- 为什么要回传 SYN? 为什么要传 ACK?
- 详细说下 TCP 四次挥手的过程?
- 为什么 TIME-WAIT 状态必须等待 2MSL 的时间呢?
- 为什么第二次跟第三次不能合并, 第二次和第三次之间的等待是什么?
- 保活计时器的作用?
- TCP 协议是如何保证可靠传输的?
- 谈谈你对停止等待协议的理解?
- 谈谈你对 ARQ 协议的理解?
- 滑动窗口有什么作用?
- 谈下你对 TCP 拥塞控制的理解?四种算法?
- TCP 黏包是怎么产生的?怎么解决?
- 说几个你知道的 HTTP 状态码?
- HTTP 状态码 301 和 302 代表的是什么?有什么区别?
- forward 和 redirect 的区别?
- HTTP 方法有哪些?
- 说下 GET 和 POST 的区别?
- HTTP 的首部字段有哪些?
- 在浏览器中输入 URL 地址到显示主页的过程?
- 说下 DNS 解析的过程?
- 谈下你对 HTTP 长连接和短连接的理解?分别应用于哪些场景?
- 谈下 HTTP1.0 和 1.1、1.2 的主要变化?
- HTTPS 的工作过程?
- HTTP 和 HTTPS 的区别?
- HTTPS 的优缺点?
- 什么是数字签名?什么是证书?
- 什么是对称加密和非对称加密?
- 常用的加密算法有哪些?
- Session 和 Cookie 的区别?
- 什么是 CAS 单点登录?
- 如何设计一个 CAS 单点登录系统?
- Socket 两个典型的接收方式方式?
- Socket 在 OSI七 层模型中的哪一层?
- Java 如何实现无阻塞方式的 Socket 编程?
- 说下你知道你知道的攻击手段有哪些?
- 跨站脚本攻击的原理、危害和防范手段?
- 跨站请求伪造的原理、危害和防范手段?
- SQL 注入攻击的原理、危害和防范手段?
- 拒绝服务攻击 DOS 的原理、危害和防范手段?
06 计算机操作系统
- 进程与线程的区别?
- 进程的状态及其转换?
- 进程间的通信方式有哪些?
- 进程(或作业)的调度算法有哪些?
- 同步和互斥的区别?
- 同步、异步、阻塞、非阻塞的区别?
- 线程/进程同步的方式有哪些?
- 什么是缓冲区溢出,有什么危害,原因是什么?
- 什么是死锁?
- 死锁产生的必要条件?
- 死锁的检测和消除?
- 怎么处理死锁?
- 怎么预防死锁?
- 怎么避免死锁?
- 固定分区、动态分区、分段式存储管理和分页式存储管理的区别?
- 页面置换算法有哪些?
- 什么是虚拟内存技术?
- 动态链接库和静态链接库的区别?
- 说下你对磁盘结构的认识?
- 磁盘调度算法?
- 中断的类型有哪些?
07 设计模式
- 简单说下常用的设计模式有哪些?
- 工厂方法模式和抽象工厂模式有什么区别?
- 实际开发中用过设计模式吗?怎么用的?
- 解释器、迭代器、观察者、适配器、组合、外观、***等模式的原理是什么?
- 文件目录采用的是哪种设计模式?
- JDK 中用到了哪些设计模式?
- Spring 中用到了哪些设计模式?
08 MySQL
- 手写/口述场景题的 SQL 语句
- 一条 SQL 语句在数据库框架中的执行流程?
- 数据库的三范式是什么?
- MySQL 中的数据类型有哪些?
- char 和 varchar 的区别?
- 谈谈你对索引的理解?底层数据结构?
- 为什么要使用索引?一定要使用索引吗?
- 为什么索引的底层数据结构采用 B+ 树而不是红黑树?
- 索引的类型?
- 什么叫聚簇索引?什么叫联合索引?
- 谈下什么是前缀索引?
- 谈下什么是覆盖索引?
- 什么情况下索引会失效?即查询不走索引?
- 查询性能的优化方法?
- InnoDB 和 MyISAM 的比较?
- 为什么要分库分表?分库分表后,主键 ID 怎么设置?
- 水平切分和垂直切分该如何选择?存在什么问题?
- 主从复制中涉及到哪三个线程?
- 如何实现 MySQL 的读写分离?
- MySQL 的主从复制原理是什么?如何解决 MySQL 主从同步延迟问题?
- 谈下你对读写分离的理解?
- 谈下你对数据库事务的理解?不同隔离级别下会产生什么问题?怎么解决?
- MySQL 默认的隔离级别是什么?
- MVCC 的实现原理是什么?
- 数据库中常用的锁有哪些?
- 表锁和行锁有什么区别?
- InnoDB 什么时候使用行级锁?什么时候使用表级锁?
- InnoDB 存储引擎的锁的 3 种算法?
- MySQL 数据库 CPU 飙升到 500% 的话他怎么处理?
09 Spring
- AOP 的***有哪几种方式?
- 怎么实现 JDK 动态***?
- AOP 的基本概念:切面、连接点、切入点等?
- 谈谈你对 IOC 的理解?
- Bean 的生命周期?
- Bean 的作用域?
- Spring 中的单例 Bean 的线程安全问题了解吗?
- 谈谈你对 Spring 中的事物的理解?
- Spring 中的事务隔离级别?
- Spring 中的事物传播行为?
- Spring 常用的注入方式有哪些?
- Spring 框架中用到了哪些设计模式?
10 SpringMVC
- 谈谈你对 MVC 模式的理解?
- SpringMVC 的工作原理/执行流程?
- SpringMVC 的重要组件有哪些?
- 谈谈你对 DispatcherServlet 的源码理解?
- SpringMVC 常用的注解有哪些?
- SpringMVC 怎么样设定重定向和转发的?
- 如何解决 POST 请求中文乱码问题,GET 的又如何处理呢?
- SpringMVC 的控制器是不是单例模式,如果是,有什么问题,怎么解决?
- SpringMVC 里面***是怎么写的?
- SpringMVC 用什么对象从后台向前台传递数据的?
11 MyBatis
- Mybatis 中 #{}和 ${}的区别是什么?
- Mybatis 有几种分页方式?
- Mybatis 逻辑分页和物理分页的区别是什么?
- Mybatis 是否支持延迟加载?延迟加载的原理是什么?
- 说一下 Mybatis 的一级缓存和二级缓存?
- Mybatis 和 Hibernate 的区别有哪些?
- Mybatis 有哪些执行器(Executor)?
- Mybatis 分页插件的实现原理是什么?
12 Redis
- Redis 是什么?Redis 有哪些功能?都有哪些使用场景?
- Redis 为什么是单线程的?
- Redis 支持的数据类型有哪些?
- 什么是缓存雪崩?该如何解决?
- 什么是缓存穿透?怎么解决?
- 怎么保证缓存和数据库数据的一致性?
- Redis 持久化有几种方式?
- Redis 怎么实现分布式锁?Redis 分布式锁有什么缺陷?
- Redis 淘汰策略有哪些?
- redis 常见的性能问题有哪些?该如何解决?
12 消息队列
- 消息队列的主要作用?
- 消息队列的优缺点?
- 如何保证消息队列的高可用?
- 如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性?
- 如何保证消息的可靠性传输?或者说,如何处理消息丢失的问题?
- 如何保证消息的顺序性?
- 如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,说说怎么解决?
- 如果让你写一个消息队列,该如何进行架构设计?说一下你的思路
- RabbitMQ 有哪些重要的角色?有哪些重要的组件?
- RabbitMQ 怎么避免消息丢失?
- 要保证消息持久化成功的条件有哪些?
- RabbitMQ 有几种广播类型?
- RabbitMQ 怎么实现延迟消息队列?
- Kafka 可以脱离 zookeeper 单独使用吗?为什么?
- Kafka 有几种数据保留的策略?
13 Zookeeper
- zookeeper 都有哪些功能?
- zookeeper 有几种部署模式?
- 集群中有 3 台服务器,其中一个节点宕机,这个时候 zookeeper 还可以使用吗?
- zookeeper 怎么保证主从节点的状态同步?
- 集群中为什么要有主节点?
- 说一下 zookeeper 的通知机制?
- 说一下两阶段提交和三阶段提交的过程?分别有什么问题?
- 你认为几阶段提交可以实现可靠事务?
- 如何使用 zookeeper 实现分布式锁?
14 Dubbo
- Dubbo 的组件有哪些?作用是什么?
- Dubbo 的集群容错模式有哪些?
- Dubbo 中 zookeeper 做注册中心,如果注册中心集群都挂掉,发布者和订阅者之间还能通信么?
- Dubbo 连接注册中心和直连的区别?
- Dubbo 协议为什么要消费者比提供者个数多?
- Dubbo 协议为什么不能传大包?
- Dubbo 协议为什么采用异步单一长连接?
- Dubbo 支持哪些序列化协议?说一下 Hession 的数据结构?
- 分布式服务接口的幂等性如何设计?
- 分布式服务接口请求的顺序性如何保证?
15 分布式理论
- 谈一下你对 CAP 的认识?
- 什么是 Base 理论?
- 两阶段提交和三阶段提交的过程?两阶段提交有什么问题?三阶段提交有什么问题?
- 分布式事务常用的解决方案有哪些?
- 说一下你对 TCC 模式的理解?
- Paxos 算法
- 说一下你对 ZAB 协议的理解?
- 什么是分布式锁?
- 分布式锁应该具备哪些功能?
- 分布式锁的实现方式有哪些?
16 数据结构与算法
1、数组
- 找出数组中出现次数大于数组长度一半和 N / K 的数
- 数组的奇偶位置问题:给定一个整型数组,请在原地调整这个数组,保证要么偶数位置上都是偶数,或者奇数位置上都是奇数。
- 调整数组顺序使奇数位于偶数前面
- 数组的度
- 求一个数组中的第 K 小 / 大的数
- 将一个整数数组划分为 K 个相等的子集问题
- 旋转数组中的最小数字
- 在二维数组中查找一个数
- 找出数组中重复的数字
- 找出数组中只出现一次的那个数,其他都出现两次
- 子数组最大累乘积:给定一个 double 类型的数组 arr,其中的元素可正、可负、可 0,返回子数组累乘的最大乘积。
- 需要排序的最短子数组长度
- 最长的可整合子数组的长度
- 最短无序连续子数组
- 连续子数组的最大和
- 字符串的排列与组合
- 最长回文子串
- 正则表达式匹配:实现一个函数用来匹配包括'.'和'*'的正则表达式
- 替换空格
- 字符串的翻转和旋转及其应用
- 字符串解码
- 无重复字符的最长子串
- 字符串的最长公共子串和最长公共子序列
- 请实现一个函数用来判断字符串是否表示数值
- 判断一个字符串是否是一个合法的
3、哈希表
- 手写一个简单的 HashMap
- 和为 K 的子数组:给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数
- 一种接收消息并按顺序打印的结构设计
- 哈希表增加 setAll 功能
4、栈
- 用固定大小的数组实现栈
- 如何仅用队列实现栈
- 最小值栈:能够返回栈中最小元素的栈
- 栈的压入、弹出序列:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序
- 单调栈结构的实现
- 直方图中的最大矩形面积
- 求最大子矩阵的大小
- 可见山峰问题
5、队列
-
用固定大小的数组实现队列
-
如何仅用栈结构实现队列
6、链表
-
反转单向链表
-
反转双向链表
-
K 个一组翻转链表
-
合并两个排序的链表
-
链表中倒数第 K 个节点
-
O(1) 时间内删除一个节点
-
删除链表中重复的节点
-
从尾到头打印链表
-
判断一个链表是否为回文结构
-
给出两个有序链表的头结点,打印出两个链表中相同的元素
-
将单向链表按某值划分成左边小、中间相等、右边大的形式
-
复制含有随机指针节点的链表
-
两个单链表相交的一系列问题
-
链表中环的入口节点
-
复杂链表的复制
7、树
- 二叉树的前序、中序、后序遍历的递归实现
- 二叉树的前序、中序、后序遍历的非递归实现
- 二叉树的层序遍历
- Morris 遍历二叉树:前序、中序、后序
- 输入一个数组,判断是不是二叉搜索树的后序遍历序列
- 二叉树的序列化:前序、层序
- 反序列化:怎么序列化的就怎么反序列化
- 在二叉树中找一个节点的后继节点
- 判断一棵树是否是完全二叉树
- 判断一棵树是否是搜索二叉树
- 判断一棵树是否是平衡二叉树
- 判断一棵树是否是对称的二叉树
- 二叉树的镜像
- 树的子结构:输入两棵二叉树 A 和 B,判断 B 是不是 A 的子结构
- 合并二叉树
- 二叉树中和为某一值的路径
- 重建二叉树:输入某二叉树的前序遍历和中序遍历的结果,请重新构造出该二叉树
- 求一棵完全二叉树的节点个数,时间复杂度低于O(N)
- 找二叉树左下角的值
- 把二叉搜索树转换为累加树
- 舞会的最大活跃度
- 求一棵二叉树中最大二叉搜索子树的节点个数
- 求一个二叉树的最远距离
- 二叉树的最大路径和
8、图
-
深度优先搜索
-
广度优先搜索
-
拓扑排序
9、数字与位运算
-
两数之和、三数之和
-
大数问题:大数相加和大数相乘问题 + Karatsuba 算法
-
打印从 1 到最大的 n 位数:需要考虑大数问题
-
数值的整数次方
-
二进制中 1 的个数
10、排序的应用
- 求一个数组中的第 K 小 / 大的数
- 最小的 K 个数
- 求一个数组中的逆序对数问题
- 小和问题:把数组中每一个数左边比当前数小的累加起来,叫着这个数组的小和
11、矩阵问题
-
顺时针打印矩阵
-
将一个正方形旋转90度
-
之字型打印矩阵
-
在一个行和列都有序的 m 行 n 列的矩阵中查找一个数是否存在
12、递归
-
求 n! 的结果
-
汉诺塔问题
-
打印一个字符串的全部子序列,包括空字符串
-
打印一个字符串的全排列
-
母牛问题:母牛每年生一只母牛,新出生的母牛成长三年后也能每年生一只母牛,假设不会死。求 N 年后,母牛的数量
-
机器人走路问题
-
给定一个数字组成的字符串,返回有多少种合法的 IPV4 组合
13、动态规划
-
机器人走路问题
-
给定一个数字组成的字符串,返回有多少种合法的 IPV4 组合
-
矩阵最小路径问题:二维数组从左上角走到右下角的最短距离
-
剪绳子:剪成 m 段,最大乘积问题
-
数组中任意数累加得到目标值
14、贪心算法
-
按最低字典序拼接字符串
-
切分金条总代价最小
-
最多做 K 个项目的最大利润
-
安排最多的宣讲场次
15、回溯算法
-
机器人的运动范围
16、经典结构
-
单调栈结构
-
滑动窗口结构
-
滑动窗口结构的实现
-
生成窗口最大值数组
-
求一个数组中最大值减去最小值小于或等于 num 的子数组数量(要求O(N))
17、经典算法
-
蓄水池算法:解决等概率问题
-
Manacher 算法:解决回文串问题
-
KMP 算法:解决字符串匹配问题
-
BRPRT 算法:解决第 k 大数问题
-
单例模式:懒汉+恶汉+静态内部类+双重校验锁
-
生产者消费者模式:wait/notify 、BlockingQueue 实现
-
多个线程交替打印:锁、信号量 Semaphore 实现
18、其他
-
二叉搜索树与双向链表:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表
-
数据流中的中位数:两个堆实现:最大堆和最小堆
上诉算法题目的详解:
https://blog.csdn.net/pcwl1206/article/details/97390314
个人微信:pcwl_Java 个人公众号:码农求职小助手 牛客网博客:震哥聊校招
码农求职小助