加载中

面试

文章分类

浏览该分类下的所有文章

29 篇文章 3

每日一题(2022/1/20)

代码演示了 Java 中字符串比较的细节。`s1` 通过 `new String("xiaozou")` 在堆中创建了独立对象,`s2` 直接引用常量池中的字面量,两者地址不同,`s1 == s2` 为 `false`。调用 `s1.intern()` 时,若常量池已有相同内容的字符串,则返回该池中对象的引用,否则将其加入池中。因为常量池已经存在 `"xiaozou"`,`s3` 获得的正是 `s2` 的引用,故 `s2 == s3` 为 `true`。文章通过源码解释说明了 `intern()` 的工作原理及其在字符串共享中的作用。

每日一题(2022/1/19)

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

equals方法该如何重写?

本文围绕Java中Object类的equals方法展开,说明何时需要或不需要重写:在需要比较“逻辑相等”(如作为Map、Set键)时应重写,而唯一实例、私有类、已在超类实现等情况可不写。重写时必须遵守五大约定——自反、对称、传递、一致、非空——并配合重写hashCode。文中以Date与Timestamp的对称性失效为例,提醒避免跨类比较;并以AbstractSet的实现展示高质量equals的写法:先判引用相等、类型检查、大小比较、containsAll,最后捕获异常。最后强调参数类型必须保持Object,避免误写成重载。

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

在Java开发中应尽量复用对象、避免重复创建。使用字面量或String.valueOf而非new String,可让字符串进入常量池;可变字符场景选用StringBuilder或线程安全的StringBuffer。Boolean也应通过Boolean.valueOf获取共享实例,避免new Boolean产生新对象。基本类型比包装类更高效,尽量减少自动装箱/拆箱。正则匹配时应先用Pattern.compile一次性编译正则,再复用Matcher,避免在循环中频繁创建Pattern,大幅提升性能。通过这些细节可显著降低内存占用和运行时间。

如何正确的释放资源?

文章指出传统的 try / finally 关闭 I/O 资源代码冗长、易漏且异常处理不佳,推荐使用 Java 7 引入的 try‑with‑resources(需实现 AutoCloseable),示例展示了代码简化后更清晰、自动安全释放资源。文中还提供了手动关闭多个 Closeable 的工具方法,但强调资源释放顺序容易出错,最终结论是 try‑with‑resources 是最优雅、可靠的资源管理方案。