文章展示在 Java 中要求在保持变量 s 引用不变的前提下,使其输出从 'abc' 变为 'abcd' 的技巧。常规的 StringBuilder 拼接或 String.replace 均无法实现,因为它们不改变原对象。通过反射获取 String 的私有 final 字段 value 并设为可访问后,可将其内部字符数组改为 "abcd"。但在 JDK 11 及以上运行时会因非法访问而抛出 IllegalArgumentException,说明 JVM 在编译期已将 final String 常量化,限制了此类反射修改。

本文介绍了 Apache Dubbo 的基本概念、特性及服务治理,推荐使用 Zookeeper 作为注册中心,并详细演示了基于 Maven 的实战项目构建流程。首先创建统一的 API 模块定义接口(HelloService),随后在 provider 模块引入 API、Dubbo 依赖并使用 @Service 注解实现接口、配置 dubbo‑provider.properties、log4j 与 RegistryConfig,将服务注册到本地 Zookeeper。接着在 consumer 模块同样引入 API 与 Dubbo 依赖,使用 @Reference 注入接口并编写消费组件,配置 dubbo‑consumer.properties。最后分别启动 Zookeeper、Provider 主程序和 Consumer 主程序,回车即触发远程调用并输出结果。完整代码已上传 GitHub,供读者参考学习。

HashMap键唯一,键可为null,值可重复,底层由数组、链表(JDK1.8 前)和红黑树(JDK1.8 后)组成,非线程安全。示例说明使用 String 作为键时会自动去重,而自定义 Person 类若不覆写 hashCode 与 equals 会出现“重复”键。HashMap 先比较键的 hashCode,hashCode 相同再通过 equals 判断相等,因此在自定义类作键时必须同时重写这两个方法。总结以上使用 HashMap 的关键注意事项。

本文系统阐述了线性表的三种基本实现——数组、链表和栈。说明了数组的连续存储、随机访问 O(1) 的读取/更新以及插入、删除需搬移元素导致 O(n) 的时间开销,并指出其空间连续性限制和广泛应用;介绍了链表的非连续存储、通过指针连接节点,实现 O(1) 的插入、删除和更新,但查找只能线性遍历 O(n),适用于频繁增删的场景;进一步解释了栈的后进先出特性,可用数组或链表实现,核心操作为 push 与 pop。最后对比数组与链表的优势与适用场景,强调没有绝对优劣,需根据读写比例选择合适结构。

本文介绍了 LeetCode 第 338 题 “比特位计数”。题目要求给定整数 n,返回长度为 n+1 的数组,其中第 i 个元素是 i 的二进制表示中 1 的个数。文中给出两组示例,说明了 0~n 的二进制形式及对应的 1 的计数。随后提供了一种动态规划实现:利用偶数 i 的二进制可由 i/2 左移得到,故 ans[i]=ans[i/2];奇数 i 则等于前一个数 ans[i-1] 加 1。代码遍历 1 到 n,按上述规则填充 ans 数组,时间复杂度 O(n),空间 O(n)。

本文介绍了 LeetCode 第 739 题 “每日温度”。给定一个整数数组 temperatures,要求计算每一天需要等待多少天才能出现更高的温度,若之后无更高温度则填 0。文章通过示例说明输入输出关系,并提供了基于单调栈的 O(n) 解法:遍历温度数组,用栈存储索引,当当前温度高于栈顶索引对应的温度时弹出栈顶并记录间隔天数,随后将当前索引入栈。最终返回记录间隔的结果数组。代码实现简洁,利用 Java 的 Stack 与数组填充完成。