38 归档分页
370 留言互动
4 核心专题

堆与栈

文章阐述了 Java 内存划分:堆区存放对象实例,由所有线程共享,需通过 new 分配,由垃圾回收器回收;栈区为每线程私有,仅存基本类型值和对象引用,由编译器自动分配释放,访问速度快;方法区(静态区)存放类信息、static 与全局变量,同样共享。对比堆与栈:堆容量大、手动/GC 分配、访问相对慢;栈容量小、自动分配、后进先出、访问快。并通过字符串创建示例说明两者在实际使用中的差异。

队列

Java PriorityQueue 是基于堆实现的无界队列,元素按自然顺序或自定义比较器排序。创建时可指定比较器,队列不接受 null 值。它不是线程安全的,入队和出队的时间复杂度均为 O(log n)。

高级算法

文章介绍了几种常见的面试算法及实现要点。首先阐述了LRU(最近最少使用)缓存的原理、get/put 接口及其命中率、复杂度等特性。随后简述逆波兰(后缀)表达式无需括号的优势。接着给出基于 MD5 的 URL 短链压缩思路。随后详细说明 SnowFlake 分布式全局唯一自增 ID 的 64 位结构、优缺点。最后提供了 LFU(最不经常使用)缓存的 O(1) 时间复杂度实现代码,包括节点和哈希表的设计。

设计模式

本文围绕面向对象的设计原则与常用设计模式展开。概述了六大原则:单一职责、里氏替换、依赖倒置、接口隔离、迪米特(最少知识)和开闭原则,阐明其含义及对高内聚、低耦合、可复用、可维护和可扩展性的促进作用。随后给出单例模式的实现示例,包括饿汉式、懒汉式及其线程安全写法。最后介绍工厂模式的概念及实现,分别展示了简单工厂、工厂方法的代码结构,说明了工厂模式在把对象创建职责抽象化、解耦客户端与具体实现方面的价值。

场景题

文章分别介绍了微信红包、秒杀系统、扫码登录、单点登录和本地缓存的实现要点。红包采用实时内存计算、随机算法、Cache计数防超发;秒杀需防超卖、限流、Redis预减库存、URL动态化、异步下单等;扫码登录通过二维码ID关联Token,分待扫描、已扫待确认、已确认三阶段完成;SSO实现全局会话与局部会话的令牌授权及统一注销;本地缓存关注数据结构、容量上限、LRU/FIFO等淘汰策略、过期时间和线程安全。

UML

UML提供多种图形化符号描述系统的静态和动态结构,包括用例图、类图、时序图、协作图、状态图、活动图、构件图、部署图等。其中,用例图用于捕获需求并展示功能模块及其关系,类图描述类及类间关联,时序图展示对象交互及消息顺序,这三图是最关键的。

es 在数据量很大的情况下(数十亿级别)如何提高查询效率?

es 在大规模数据(十亿级)下的查询性能主要依赖 OS 缓存;因此应让索引文件尽量能放入内存。可通过减少写入字段、将非检索数据迁至 MySQL/HBase、对热点数据预热、冷热分离(热、冷数据分别建索引并分配节点)来降低磁盘访问。文档模型要在写入时完成关联,避免在 ES 中使用 join、nested、parent‑child 等高开销操作。分页应避免深度分页,改用 scroll 或 search_after 逐页获取快照。上述措施综合使用,可显著提升 ES 在海量数据下的查询效率。

如何对Integer和Double类型判断相等?

Integer 与 Double 不能直接使用 `==`、字符串比较或 `compareTo` 进行相等判断,因为它们类型不同且 `compareTo` 只能在同类之间使用。两者都继承自 `Number`,该类提供 `intValue、doubleValue` 等转换方法。可先将 Integer 与 Double 转换为相同的基本类型(如 `double`),再使用 `==` 比较数值是否相等。示例代码展示了 `i.doubleValue() == d.doubleValue()` 返回 `true`,实现了正确的相等判断。

反射的基本概念

反射是一种在运行时动态获取、创建、检查和调用类及其成员(包括 private)的机制,核心类为 Class、Constructor、Method、Field。它可用于突破访问限制、实现自定义注解、动态加载第三方 jar、按需加载以缩短编译和初始化时间。实现原理是 ClassLoader 将 .class 文件加载后生成 Class 对象,反射通过上述四个类操作这些对象。优点是灵活自由,缺点包括性能下降、破坏封装导致安全风险以及 API 变动时的兼容性问题。适度、按需使用可将影响降至可接受范围。