简要 Java 面试题学习 1、Java 的四种引用和应用场景强引用普通常用的对象GC 不会主动回收需要置 null内存不足会引起 OOM软引用当内存不足时会进行回收常见于图片缓存、数据缓存等弱引用当发生 GC 时会进行回收常用于 ThreadLocal 等虚引用回收前通知get() 永远为空用于堆外内存释放、资源清理等2、HashMap 和 ConcurrentHashMap 的底层实现机制HashMap数据结构数组 链表/红黑树数组默认初始长度16计算 Key 的 hash 值对 Key 高 16 位与低 16 位进行异或能更均匀地分布而非直接使用 Key 的 hashcode对 Key 的定位使用 (n-1)hash值而非 hash值%n位运算更快扩容机制默认因子 0.75当数组长度大于 16*0.7512 时开始翻倍扩容长度哈希冲突当 Key 计算的 hash 值有冲突时在数组位置的以链表形式往下增加当 链表长度大于 8 且数组长度大于 64 时单链表转为红黑树结构ConcurrentHashMap数据结构同上不同线程安全CAS用于初始化数组、创建第一个节点、扩容数组时synchronized用于发生哈希冲突时仅锁住当前链表或者树的头节点高效的扩容机制旧数据与新数据会同时存在旧数据存在特殊节点哈希值为-1的节点当一个线程查到特殊节点是会自动到新数组找数据当一个线程发现在扩容会协助一起进行数据迁移3、ArrayList 和 LinkedList 的底层原理区别两个都是有序的容器ArrayList 像一排储物格LinkedList 像串起来的珍珠。ArrayList底层是数组开辟一块连续的内存地址数组默认长度为 10扩容时数组长度翻1.5倍将数据复制到新的数组上查找快队尾新增元素快队中新增元素慢要挪后续的LinkedList底层是双向链表使用零散的内除地址每个元素存储数据前后节点的引用地址每个节点由于额外消耗存放指针的内存比 ArrayList 多用 20~30% 内存对比随机查询(get)ArrayList: O(1)LinkedList: O(n)尾部添加(add)ArrayList: O(1)LinkedList: O(1)中间插入/删除ArrayList: O(n) —— 底层是 C 语言的 System.arraycopy, 也极快LinkedList: O(1) —— 实际需要先遍历到目标, 先耗时 O(M)场景ArrayList查得多查得快LinkedList实现栈、队列4、Checked Exception 和 Unchecked Exception 的区别Checked Exception继承于java.lang.Exception编译期就会检查常见于网络中断、资源文件不存在等外部因素这种属于可预见性的但又是无法避免的情况需要 try-catch 捕捉解决或者抛出让人来解决Unchecked Exception继承于 java.lang.RuntimeException or Error编译期不会强制检查常见于编写程序时的逻辑错误或不完善如未判空、数组越界等这种可以在编写程序时处处加上判断或在不断优化完善代码中解决(主要是通过不断修正代码逻辑来避免这种异常)5、反射机制原理和使用事项原理反射允许在运行过程中动态地获取类信息并操作类的成员“前置操作” —— 反射的基石类加载JVM 的类加载器将一个类 .class 字节码文件读取放入内存中元数据JVM 在内存中读出类的字节码后解析出这个类的结构信息如类名、类方法、类字段等Class 对象JVM 在堆内存中创建这个类的唯一入口 —— java.lang.Class反射的使用获取入口通过 Class.forName() 或 Obj.getClass() 获取目标类的 Class 对象查询元数据通过 Class 类对象提供的方法获取类的构造器、方法、字段等信息创建对象通过获取的类构造器等进行创建使用事项性能开销反射操作慢很多比年高频调用代码时使用安全性反射可以绕过访问控制修饰符如 private代码可维护性可读性以及编译器难发现错误6、深拷贝和浅拷贝的实现方式深拷贝创建新的内存空间复制对象本身后再递归循环其引用类型字段核心实现方式一重写 clone() 方法递归克隆要求所有字段都实现了 Cloneable 接口(并重写了 clone() 方法)方式二序列化与反序列化将对象序列化成字节流在反序列化出新对象要求都实现了 Serializable 接口浅拷贝复制对象本身对于对象内的引用类型字段只复制其引用地址原对象和被复制对象其引用字段是指向同一个堆内存地址核心实现实现 Cloneable 接口重写 clone() 方法 —— 重写时调用 super.clone()7、Java 泛型的本质与类型擦除机制泛型是什么泛型是一种编译期的类型安全工具。它允许我们编写通用的类、接口或方法如 List在使用时再指定具体的类型如 List。这样既能复用代码又能避免强制类型转换和运行时错误。通俗理解泛型是提供了一种模式(只需要一个通用的类、方法等让使用泛型的地方在程序员编写代码的时候可以任意指定类型然后启动程序开始编译时编译器会将指定的类型给擦除即泛型擦除让所有用了该东西的地方回归原始等在运行的时候由于是通过了编译所以在运行到这块的时候也不会有啥问题。类型擦除是怎么回事Java 的泛型是通过 “类型擦除” 实现的编译时编译器会检查泛型使用的合法性比如不能往 List 里放整数编译后所有泛型信息都会被擦除替换为原始类型如 List或上界类型如 Object运行时JVM 完全不知道泛型的存在执行的是擦除后的普通代码。为什么要有擦除主要是为了向后兼容——让 Java 5 引入泛型后新代码仍能在旧版本的 JVM 上运行。擦除带来的限制常见问题运行时无法获取泛型的具体类型list instanceof List 是非法的因为运行时 List 已变成 List。不能创建泛型数组new T[] 或 new ArrayList[] 会编译报错因为数组需要运行时类型信息而泛型没有。不能直接实例化类型参数无法写 new T()因为编译器不知道 T 到底是什么类也无法调用其构造函数。多态需“桥接方法”支持编译器会自动生成额外方法确保泛型继承下的多态行为正确对开发者透明。关键一句话记住“泛型只存在于源码中编译后就消失了。” —— 泛型是编译器的承诺不是JVM 的能力。8、JVM和性能调优之——JVM内存结构堆、栈、方法区、元空间堆内存所有线程共享存放对象实例和数组垃圾回收的主要区域新生代存放新建的对象优先放在 Eden 区Eden 区满了触发 Minor GC存活的移至 Survivor老年代多次 Minor GC 还存活的对象移至老年代或大对象直接进入老年代常见问题新建对象过多触发 OOM设置堆内存大小 -Xms 和 -Xmx调整新生代和老年代比例 -XX:NewRatio调整 Eden 和 Survivor 比例 -XX:SurvivorRatio栈内存各线程私有线程中每个方法有自己的栈帧栈帧存放局部变量、方法入口等方法执行完毕自动释放内存常见问题线程请求的栈深度大于虚拟机所允许的深度如递归过深触发 StackOverflowError线程过多导致栈内存总和超过物理内存触发 OOM调整栈大小 -Xss方法区 和 元空间JDK7 之前是使用方法区使用的是 JVM 的堆内存被称为永久代JDK8 之后是使用元空间使用的是本地内存都是用于存储类元数据、运行时常量池、静态变量引入元空间原因永久代大小固定容易 OOM类元数据太复杂GC 麻烦元空间有自己的垃圾回收机制调整触发 Full GC 的阈值 -XX:MetaspaceSize9、JVM和性能调优之 —— 垃圾回收算法在堆内存中Java 对象在被回收后空下来的内存是零碎分散的需要对堆内存进行整理以便使用。内存碎片清理后产生大量不连续空间。当大对象无法分配时会触发一次Full GCSerial Old 收集器导致长时间停顿。标记清除/整理标记清除最基础的垃圾回收算法从 GC root 开始遍历标记存活的对象再遍历一次回收清除未标记的对象适用老年代对象存活率较高代表CMS 收集器标记整理从 GC root 开始遍历标记存活的对象再遍历一次将后面的标记的对象移动到前面内存位置优点无内存碎片内存利用率高适用老年代对象存活率较高移动成本可接受代表Serial OldParallel Old复制将内存平时分为两个区域一个存对象一个空着Eden(新对象创建区)S0(存活对象区)S1(空闲备用)GC 时将存活的对象复制到另一个区域再清空当前区域两个区域的角色互换适用新生代对象存活率低需要复制的成本低代表SerialParNewParallel Scavenge常见的收集器收集器新生代算法老年代算法特点Serial复制标记 - 整理单线程简单高效ParNew复制标记 - 整理Serial 的多线程版Parallel Scavenge复制标记 - 整理关注吞吐量CMS复制标记 - 清除关注低延迟已废弃G1复制 标记 - 整理复制 标记 - 整理可预测停顿时间ZGC染色指针 读屏障染色指针 读屏障超低停顿10ms10、JVM 与 性能调优之 —— CMS和G1的原理和区别CMS (Concurrent Mark Sweep) 和 G1 (Garbage-First) 是 Java 发展史上两个里程碑式的垃圾收集器。CMS 是“老年代专用”的并发收集器追求最短停顿但会产生碎片G1 是“全堆管理”的分区收集器追求可预测的停顿时间且无碎片。现状CMS 已在 JDK 14 被废弃G1 是 JDK 9 的默认收集器。CMSCMS 的核心目标是让 GC 线程和用户线程同时运行减少停顿阶段1初始标记标记 GC Roots 能直接关联到的阶段2并发标记从初始标记的对象开始遍历整个老年代阶段3重新标记修正并发标记时因用户线程导致阐述的变动阶段4并发清除G1面向服务端管理整个堆内存新生代 老年代追求可预测的停顿时间G1 不再物理隔离新生代和老年代而是划分成多个等大的独立区域(Region)阶段1初始标记阶段2并发标记阶段3最终标记阶段4筛选回收衡量每个 Region 的回收空间/时间成本根据最大停顿时间优秀按回收垃圾最多的 Region将存活的复制到空的 Region 中11、Redis 备份和日志配置备份RDB按时间点生成数据快照速度快但可能丢失部分数据AOF记录所有写操作命令可靠性高但文件速度慢生产环境设置 NOTICE 或 WARNING 级别避免日志过大AOF文件过大导致 Redis 重启时间过长配置auto_aof_rewrite_percentag/min-size备份占主机过多资源配置no-appendfsync-on-rewrite:yes在重写期间不进行fsync操作高并发场景下 Redis 备用会影响性能从时间上选低峰2点4点进行 RDB 备份从资源上使用备库进行备份不影响主库调整 AOF 的 fsync 为 no,牺牲一点安全换取性能峰值恢复为 everysec 模式12、Redis 集群要点为解决单机容量有限、内存不足、并发压力大采取分片机制分散在多个节点上使用哈希槽hash slot概念共 16384 个 slot每个 key 通过 CRC16 算法算出一个值对 16384 取模后决定放入哪个 slot 中集群每个节点负责一部分 slot优势可水平扩展 增加节点 重分配 slot可直连节点发送命令支持自动纠正节点高可用保证主从复制 故障转移一个 master读写多个 slave复制 master 的数据主节点宕机 —— 故障检测 —— 半数以上认为已经下线 —— 在从节点中选新主节点 —— 基于 Raft算法(投票)Redis 哨兵模式主要用于监控 redis 主从架构中节点状态并在主节点故障时自动故障转移由一个或多个哨兵节点组成它会自动从所有从节点中选举一个新的主节点再通知客户端主节点地址已经更新工作原理1、监控定期 PING 超时未响应 标记为 SDOWN(主观下线) 多个哨兵(半数以上)标记了SDOWN被标记为ODOWN(客观下线)2、故障转移哨兵选一个领导领导从从节点选一个作为主节点考虑复制偏移量、优先级

相关新闻

最新新闻

LayaBox游戏引擎Android打包全流程解析与优化

LayaBox游戏引擎Android打包全流程解析与优化

1. LayaBox项目打包Android包的核心流程解析作为一款成熟的HTML5游戏引擎,LayaBox提供了完整的Android平台发布方案。从3.2版本开始,引擎支持两种打包模式:新手友好的一键APK打包和面向资深开发者的原生工程导出。这两种方案各有优势&#xf…

2026/7/21 22:56:40
Agent Runtime 解耦:从 Context Window 到事件日志的工程演进

Agent Runtime 解耦:从 Context Window 到事件日志的工程演进

1. 这不是新赛道,是 runtime 层的“临终告别式”上周二(4月8日),Anthropic 宣布 Claude Managed Agents 进入公开测试阶段。新闻稿里写着“十倍提速”“Notion 和 Asana 已接入”“沙箱执行会话快照凭证托管由 Anthropic 全权负责…

2026/7/21 22:56:40
SAP PP 一些意料之外的报错

SAP PP 一些意料之外的报错

作为笔者常见的一些非常规报错记录。1、CO03查看工单组件,直接为空,但RESB表有值:问题现象:CO03输入工单号,点击组件按钮,组件列表全清空了。但是COOIS或其它方式查组件清单,又能获取数据。出错…

2026/7/21 22:56:40
哔咔漫画离线阅读终极指南:如何用免费工具快速构建个人漫画图书馆

哔咔漫画离线阅读终极指南:如何用免费工具快速构建个人漫画图书馆

哔咔漫画离线阅读终极指南:如何用免费工具快速构建个人漫画图书馆 还在为哔咔漫画的网络卡顿而烦恼吗?picacomic-downloader 是一款专为 manhuabika.com(哔咔漫画、pica漫画)设计的专业级多线程下载器,通过现代化的图…

2026/7/21 22:56:40
Webhook 实战:准入控制与默认值注入

Webhook 实战:准入控制与默认值注入

系列导读 你现在看到的是《Kubernetes Operator 从入门到生产:原理、实战与排错指南》的第 6/10 篇,当前这篇会重点解决:Webhook 是 Operator 的门卫,能减少用户错误并保证 CR 的合法性。 上一篇回顾:第 5 篇《控制器与资源管理:创建、更新、删除资源的正确姿势》主要聚…

2026/7/21 22:56:40
java,,

java,,

异常体系异常的作用自定义异常异常处理方案

2026/7/21 22:51:40

月新闻