加载中

Java

文章分类

浏览该分类下的所有文章

237 篇文章 20

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

在海量(十亿级)数据场景下提升 Elasticsearch 查询性能的核心是让索引文件尽可能落在 OS filesystem cache 中。做法包括:①为机器配置足够内存,使所有 idx segment 能被缓存;②仅在 ES 中存储用于检索的关键字段,其余数据转存 MySQL、HBase 等;③对热点数据进行预热,使用冷热分离,将热数据单独建索引并分配专用 shard,避免冷数据冲刷缓存;④在写入阶段完成关联,采用合理的 document 模型,避免在查询时使用 join、nested、parent‑child 等高开销特性;⑤分页时禁用深度分页,改用 scroll 或 search_after 逐页检索。通过这些措施,可把查询大幅从磁盘 I/O 转为内存访问,显著提升响应速度。

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

Integer 与 Double 不能直接用 `==`、字符串或 `compareTo` 比较,因为它们是不同的包装类型且 `compareTo` 只接受相同类型。两者都继承自 `Number`,可利用其提供的 `doubleValue()`(或其他基本类型转换)将它们统一转为相同的原始数值后,再用 `==` 判断相等。示例:`Integer i = 100; Double d = 100.00; System.out.println(i.doubleValue() == d.doubleValue());` 即可实现正确比较。

反射的基本概念

反射是Java在运行时动态获取和修改类的属性、方法(包括private)的机制。核心类为Class、Constructor、Method、Field。它可突破访问限制、实现自定义注解、动态加载第三方jar、按需加载类等。原理是ClassLoader加载.class文件生成Class对象,利用上述四类在内存中操作。优点是灵活自由,缺点是性能较差、破坏封装导致安全风险、版本兼容问题。适度、按需使用可降低影响,使用Android API时需注意兼容性。

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

利用 Java 的 `IntegerCache`(-128~127 的整数被缓存)并通过反射修改缓存中的对象,可以让同一个 `Integer a = 1` 同时等于 1、2、3。代码先取得 `Integer` 的内部类 `IntegerCache`,把 `cache[130]`、`cache[131]` 指向 `cache[129](值为 1)`,随后 `a == Integer.valueOf(1) && a == Integer.valueOf(2) && a == Integer.valueOf(3)` 为 true。由于 `Integer.valueOf` 对小整数返回缓存对象,而 `new Integer()` 每次都创建新实例,后者比较始终为 false。此技巧展示了 JDK 缓存机制及其对对象相等性的影响。

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

文章介绍了 Java 中两种常见的死循环写法——`for(;;)` 与 `while(true)`,并通过 JDK 源码实例说明它们的使用场景。作者分别编写测试类,使用 `javap -v` 查看编译后生成的字节码,发现两者在现代编译器下产生的字节码完全相同,性能上没有区别。之所以源码中常见 `for(;;)`,是源于早期 C 语言及早期 Java 编译器对 `for` 循环生成的字节码更简洁、占用更少内存,形成了编程习惯。随着编译器优化的提升,这两种写法在当前主流 JDK 中已无实质差异。

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

本文介绍了在 Docker 中实时查看容器日志的常用命令。使用 `docker logs -f --tail 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安装教程

本文介绍了在 Windows 环境下安装 Groovy 的完整步骤,包括下载 Groovy‑SDK(提供官网和网盘链接)、解压到指定目录、配置环境变量、验证安装是否成功,以及在 IntelliJ IDEA 中创建 Groovy 项目并编写示例代码,帮助读者快速上手 Groovy 脚本语言。

this与super关键字详解

this 与 super 是 Java 中指向当前对象和直接父类对象的关键字。this 用于访问本类属性、方法、区分形参与成员变量,并可在构造器首行调用同类其他构造函数;若不显式写出,编译器会自动插入 this()。super 用于访问父类的非私有属性、方法、区分同名成员,以及在构造器首行显式调用父类构造函数。若子类构造器未显式写 super(),编译器会默认调用父类的无参构造,父类若未提供无参构造则会报错,需自行添加或使用 super(…) 指定有参构造。两者均只能在构造函数的第一行使用,且都是引用自身或父类实例的语法糖。

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

文章指出,频繁使用字符串常量会导致代码冗余且缺乏类型安全,推荐使用枚举(enum)来替代。枚举本质是类,除提供固定常量外,还能定义属性、方法,支持类型安全、信息扩展、遍历(values())以及业务逻辑封装,如 Spring 中的 HttpStatus 示例。通过示例演示将字符串参数改为枚举参数后,代码更简洁、可靠。作者提醒并非所有常量都必须枚举,需根据实际需求斟酌使用。

Git代码提交规范

Git提交规范采用“type(scope): message”格式,其中type表示提交类型(如 feat 新功能、fix 修复、docs 文档、style 格式、refactor 重构、perf 性能、test 测试、build 构建、revert 撤销、chore 其他),scope说明改动涉及的模块或范围,message为简短说明。通过统一的提交结构提升代码可读性和协作效率。

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

本文示例了使用 iText(5.5.13)在 Java 中为 PDF 添加水印、文字、图片及签章的完整实现。首先在 pom 中引入 itextpdf 与 itext‑asian 依赖,然后提供 `PdfUtil` 工具类,核心方法包括: * `addWaterMark`:遍历 PDF 页,按指定透明度、字号、倾斜角在页面网格中循环绘制文字水印。 * `addText`:根据坐标列表 (`PdfAddContentParam`) 在指定页的矩形区域写入文字,可自定义字体大小。 * `addTextByKeyword`:解析页面文本,定位关键字所在坐标后在其附近插入文字,实现关键字定位式编辑。 * `addImage`/`addStamp`(源码中略):按坐标或比例向 PDF 写入图片、印章,实现签名效果。 文末附有测试类演示上述方法的调用方式,涵盖文件读取、输出流处理以及异常日志记录,帮助读者快速在项目中集成 PDF 水印与签章功能。

给PDF添加水印并保存(Java实现)

本文介绍如何使用 Java 的 iText5 库为 PDF 添加文字水印并保存。首先在 Maven 中引入 `itextpdf` 与 `itext-asian` 依赖,然后实现 `PDFUtils.addWaterMark` 方法:读取原 PDF、创建 `PdfStamper`、加载自定义字体、设置透明度、遍历每页按指定间距和倾斜角度绘制水印文本,最后关闭流。文末给出调用示例 `AddWaterMarkTest`,演示将本地 PDF 加水印后输出新文件。整个过程代码完整,可直接复制使用。