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

最近更新

Java 2023-02-02

反射的基本概念

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

面试 反射 阅读全文
Java 2023-01-31

如何让 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 源码和缓存机制的深入了解,可用于性能预热等实际场景。

面试 JDK 阅读全文
Java 2023-02-01

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

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

面试 阅读全文
Java 2023-02-01

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` 只获取最新的两条错误记录。上述命令简洁高效,适用于快速定位和监控容器日志。

Docker 阅读全文
Java 2023-01-30

groovy安装教程

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

Groovy 阅读全文
Java 2023-01-30

this与super关键字详解

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

面试 阅读全文