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

最近更新

Java 2021-11-11

equals方法该如何重写?

文章说明何时需要重写Object的equals方法,何时可以不写,并详细阐述重写时必须遵守的五条原则(自反、对称、传递、一致、非空),以及常见违规例子。随后以AbstractSet的实现为模板,提供编写高质量equals的步骤:先检查引用相等、类型匹配、大小比较,再用containsAll逐域比较,并配合对应的hashCode实现,强调参数类型必须保持Object。

面试 阅读全文
Java 2021-11-11

如何使用Java程序读取zip文档?

本文介绍了在 Java 中使用 `ZipInputStream` 读取 ZIP 文档的基本方法。首先在 Maven 中加入 `commons-io` 依赖,然后通过 `ZipFile` 与 `ZipInputStream`(指定 GBK 编码)打开压缩包,使用 `getNextEntry()` 循环遍历每个 `ZipEntry`,打印路径并对非目录且以 `.txt` 结尾的文件读取内容,利用 `IOUtils.readLines` 将流转为字符串列表。代码示例展示了完整的文件读取、文本输出以及资源的安全关闭,运行后可在控制台打印出压缩包内所有文件及 txt 文件内容。

Java 2021-11-02

CGLIB与JDK动态代理

CGLIB和JDK动态代理都是为了解耦而产生的代理技术。JDK代理只能为实现接口的类生成基于接口的代理,需要实现InvocationHandler并使用反射;CGLIB则利用ASM字节码框架为目标类生成子类,覆盖非final方法,可对没有接口的类进行代理。Spring默认:bean实现接口时使用JDK代理,未实现接口时使用CGLIB,亦可强制指定。性能上,JDK在JDK6+及调用次数少时更快,CGLIB在大量调用且JDK8以前可能占优,但对final类/方法无能为力。CGLIB的实现核心是Enhancer.create生成子类并通过MethodInterceptor拦截方法,适用于AOP等场景。

反射 阅读全文
Java 2021-11-04

如何避免创建不必要的对象?

在 Java 开发中,应尽量避免创建功能相同的对象以节省内存和提升性能。使用字符串常量池代替 `new String`,在循环中复用同一 `String`;根据需求选用 `String`(不可变)、`StringBuilder`(可变、单线程)或 `StringBuffer`(线程安全)。对布尔值使用 `Boolean.valueOf` 而非 `new Boolean`,因为前者直接返回已缓存的实例。尽量避免自动装箱/拆箱导致的对象创建,优先使用基本类型 `int` 而非包装类 `Integer`。正则表达式应先 `Pattern.compile` 再复用匹配器,避免在循环中重复编译。上述技巧均可显著降低对象创建次数,提升程序运行效率。

面试 阅读全文
Java 2021-11-05

如何正确的释放资源?

文章指出在 Java 中手动在 finally 块里关闭 I/O 流会导致代码冗长、易忘记关闭且异常处理不佳,示例代码即有此弊端。推荐使用 Java 7 引入的 try‑with‑resources,前提是资源实现 AutoCloseable,代码更简洁、自动释放且无需关心关闭顺序。文中也给出手动关闭的可变参数工具方法,但提醒其必须严格按顺序调用。综上,最优雅可靠的资源释放方式仍是 try‑with‑resources。

面试 阅读全文
Java 2021-11-10

如何实现线程复用?

线程池通过维护 Worker 对象实现复用。execute 先在核心线程数范围内尝试 addWorker 创建线程,若达上限则把任务放入 workQueue。Worker 持有 Thread 并实现 Runnable,其 run 方法调用 runWorker。runWorker 在循环中先执行 firstTask,再不断从队列获取任务并执行 task.run();run 本身不再创建新线程,线程始终在同一 Thread 上循环处理任务直至关闭。于是同一线程被重复利用,完成线程复用的核心机制。

源码 多线程 阅读全文