Java

浏览该分类下的所有文章

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 变动时的兼容性问题。适度、按需使用可将影响降至可接受范围。

如何让 a == 1 && a == 2 && a == 3同时成立?

文章介绍利用 Java 的 `IntegerCache` 缓存特性,使表达式 `a == 1 && a == 2 && a == 3` 成立。通过反射获取 `Integer` 的内部类 `IntegerCache`,把缓存中下标对应的对象(原本分别是 1、2、3)改为同一个实例(1),随后 `Integer.valueOf` 或强制装箱得到的对象均指向同一内存地址,比较结果为 `true`;而使用 `new Integer` 会创建全新对象,地址不同,比较为 `false`。文中给出完整代码、运行结果,并解释 `valueOf` 与 `new` 的实现差异,强调此技巧体现了对 JDK 源码和缓存机制的深入了解,可用于性能预热等实际场景。

for(;;)和while(true)的区别

文章说明 Java 中的两种死循环写法 `for(;;)` 与 `while(true)` 在功能上完全等价。通过对比 JDK 源码示例和编译后生成的字节码,发现两者的字节码已完全相同,现代编译器会进行等价优化。之所以很多作者仍倾向使用 `for(;;)`,是源于早期 C 语言和早期 Java 编译器中 `for(;;)` 生成的指令更少、占用更少内存的历史习惯。如今两者在性能和行为上没有差别,仅是编码风格的选择。

docker实时查看容器日志(实用)

本文介绍了在 Docker 中实时查看容器日志的常用命令。使用 `docker logs -f --tail 10 <容器>` 可实时刷新最新 10 行;仅查看最新 10 行则用 `docker logs --tail 10 <容器>` 或 `docker logs <容器> | tail -n 10`。若需查看日志开头的前 10 行,可使用 `docker logs <容器> | head -n 10`。通过管道结合 `grep` 可以在日志中搜索关键字,如 `docker logs <容器> | grep 'ERROR'`,进一步配合 `tail -n 2` 只获取最新的两条错误记录。上述命令简洁高效,适用于快速定位和监控容器日志。

groovy安装教程

本文介绍了 Groovy 的快速入门步骤:从官方或网盘下载 groovy‑sdk(4.0.4),解压至指定目录后配置环境变量并验证安装;随后在 IntelliJ IDEA 中新建 Groovy 项目,选择已安装的 Groovy 版本或对应文件夹;项目创建完成后即可在 src 目录编写 Groovy 脚本,示例代码演示了字符串、GString 的使用及输出。

this与super关键字详解

本文系统阐述了 Java 中关键字 **this** 与 **super** 的概念、作用及使用规范。`this` 代表当前对象实例,可用于访问本类属性/方法、区分形参与成员变量、在构造函数首行调用本类其他构造器。`super` 代表直接父类对象,可调用父类非私有成员、区分同名属性/方法、在子类构造函数首行显式调用父类构造器。文中通过 Father‑Son 示例演示了隐式 `super()` 导致的编译错误及两种解决方案(添加无参构造或显式 `super(args)`),并对两关键字的查找范围、功能等差异进行对比总结。

还在频繁定义常量?不如试试用枚举代替

常量经常被写成一组固定字符串,实际应使用枚举。枚举本质是类,可定义属性、方法,提供类型安全、可直接在switch中使用、拥有values()遍历、可封装额外信息(如HttpStatus)并实现业务逻辑。相较于单纯的String常量,代码更简洁、可靠,且易于维护。虽不是所有常量都必须改为枚举,但在成员在编译期已确定的情形下,枚举是更优选择。

Git代码提交规范

Git提交遵循“type(scope): message”格式,其中type指提交类别,如feat(新功能)、fix(修复)、docs(文档)、style(格式)、refactor(重构)、perf(性能)、test(测试)、build(构建工具)、revert(撤销)和chore(辅助),scope说明影响范围(如权限模块、首页),message为简短说明,避免过长。示例:fix(系统菜单图标):添加缺少的图标。

Java实现给PDF文件加水印、图片、签名(含测试类)

本文示例使用 iText5 在 Java 中为 PDF 添加文字水印、坐标文字、关键字定位文字、图片和签名。首先在 pom 中引入 `itextpdf` 与 `itext-asian` 依赖,随后提供 `PdfUtil` 工具类,实现:① `addWaterMark` 根据页面尺寸和透明度循环绘制倾斜文字水印;② `addText` 按坐标矩形在指定页插入文本;③ `addTextByKeyword` 解析页面文本,定位关键字坐标后写入新内容;④ `addImage` 与 `addSign` 在给定坐标或关键字位置嵌入图片/签章;⑤ `addImageAndText` 同时添加图片和文字。文末附带完整的 JUnit 测试示例,演示上述方法的调用方式与效果。