楼层: 首页/ 软件技术/ Java 基础/ 常见坑与最佳实践
13

常见坑与最佳实践

Pitfalls & Best Practices

这一章是"老司机的血书"——每一条都是前人踩过、线上出过事的坑。收藏下来,写完代码对照一遍,能避开 80% 的低级错误。

坑 / 原则正确做法
equals 与 hashCode 约定重写 equals 就必须重写 hashCode——两个对象 equals 相等,hashCode 必须一样。否则放进 HashMap/HashSet 就乱套。IDE 里右键 Generate 自动生成,别手写。
字符串拼接用 StringBuilder循环里 str += "x" 每次都 new 一个新 String,十万次就是性能灾难。循环拼接用 StringBuilder.append()。
== 比字符串字符串内容比较永远用 equals;字面量常量在前:"admin".equals(input),避免 input 为 null 时 NPE。
泛型类型擦除别写 instanceof List<String>,别 new T[]。需要类型判断时传个 Class<T> 进来。
并发竞态条件共享可变变量要么用原子类(AtomicInteger),要么加锁;别靠"我觉得不会同时发生"。
资源泄漏流、连接、文件句柄一律用 try-with-resources,别在 finally 里手动 close——忘了一层就是泄漏。
钱用 double金额计算用 BigDecimal,构造时传字符串:new BigDecimal("0.1"),别传 double。
集合返回 null查不到数据返回空集合 List.of(),别返回 null,调用方少一层判空。

免费学习资源(白嫖路线)

资源特点适合阶段
Oracle 官方 Java 教程权威、免费、带交互式示例,英文但不难。语法阶段查漏补缺。
菜鸟教程 / 廖雪峰 Java 教程中文、例子短、随查随用。忘记语法时翻一翻。
《On Java 8》(Bruce Eckel)有免费中译版,讲 OOP 思想比讲语法强。OOP 卡壳时读两章。
LeetCode 简单题把语法和数据结构用起来,每天一题。学完集合 / 泛型后开始。
最值钱的一条经验

别在脑子里跑代码,去跑它。Java 的类型系统、JVM 行为,很多时候和"直觉"不一样(比如 Integer 缓存 -128~127 会让 == 偶尔为 true)。怀疑某个行为时,写个 5 行的 main 方法跑一下,比争论半小时管用。报错了别只看最后一行,往上翻" caused by ",根因通常在最底下。

章末自测 · Java 基础(4 题)

1.(概念题)JDK、JRE、JVM 三者是什么关系?我自己写代码编译运行电脑里该装哪个?

查看答案

答案:JVM 是跑字节码的虚拟机;JRE = JVM + 核心类库,只能跑不能编译;JDK = JRE + 编译器和工具,开发用。自己写代码要装 JDK(推荐 Temurin 21 LTS)。

2.(代码题)String a = new String("hi"); 和 String b = "hi";,a == b 和 a.equals(b) 分别是什么结果?

查看答案

答案:a == b 是 false(new 出来的是新对象,地址不同);a.equals(b) 是 true(内容相同)。解析:== 比地址,equals 比内容。字符串比较永远用 equals。

3.(选择题)两个线程同时对一个普通 int count 执行 1000 次 count++,结果最可能是?A. 一定 2000 B. 小于等于 2000,可能更少 C. 一定 1000

查看答案

答案:B。解析:count++ 是"读-改-写"三步,线程交替执行会互相覆盖,最终结果 ≤ 2000。正确做法是用 AtomicInteger 或加锁。

4.(思考题)为什么读文本文件推荐 Files.readString(path, StandardCharsets.UTF_8),而不是老的 new FileReader(path)?

查看答案

答案:FileReader 用操作系统默认编码(中文 Windows 常是 GBK),换台机器就乱码;显式指定 UTF_8 后,无论在哪台机器读都一致。解析:编码不统一是中文乱码万恶之源,跨平台项目永远显式指定字符集。

记
下一步学什么

① 本页是Java SE 基础,往下走两条路:想做网站/后台,接着学 JavaEE / Jakarta EE(下一页)——Servlet、JSP、JDBC 是 Web 底层;想跟上主流,再直接上 Spring Boot(企业开发事实标准)。

② 想深入并发与 JVM,读《Java 并发编程的艺术》《深入理解 Java 虚拟机》(周志明),别一开始就啃,先有项目经验再看。

③ 每天写一点,报错了把红字贴给 AI 让它解释——但它给的代码,自己要能逐行讲清楚再用。