常见坑与最佳实践
这一章是"老司机的血书"——每一条都是前人踩过、线上出过事的坑。收藏下来,写完代码对照一遍,能避开 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 ",根因通常在最底下。
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 让它解释——但它给的代码,自己要能逐行讲清楚再用。