字符串比较应使用equals而非==,因==比较引用地址;循环中修改ArrayList需用迭代器remove或延迟删除;Integer等包装类比较须用equals且注意缓存范围与空指针;异常不可裸吞,须记录日志;日期处理优先用Java 8+时间API;HashMap应预设初始容量;SimpleDateFormat不可共享;异步任务须处理异常并等待完成;浮点数比较应使用误差范围判断。

字符串比较不用 equals 却用 ==
新手常写 "abc" == str 判断内容是否相等,结果在某些情况下对、某些情况错。因为 == 比的是引用地址,而字符串字面量可能被 JVM 缓存(在字符串常量池里),但 new String("abc") 就一定不等于 "abc"。正确写法永远是 str != null && str.equals("abc"),更安全可用 "abc".equals(str) 避免空指针。
循环中修改 ArrayList 导致 ConcurrentModificationException
一边遍历 ArrayList,一边调用 list.remove(),哪怕只是删一个元素,也会直接抛异常。这不是线程问题,而是 fail-fast 机制在起作用。解决办法:用迭代器的 iterator.remove();或先收集要删的元素,遍历完再批量删;或改用 CopyOnWriteArrayList(仅适合读多写少场景)。
忽略自动装箱拆箱的坑
写 Integer a = 128, b = 128; System.out.println(a == b); 输出 false —— 因为 Integer 缓存范围是 -128 到 127,超出就新建对象。同样,Integer c = null; int d = c; 运行时直接 NPE。比较包装类用 equals,赋值前务必判空,基本类型运算前确保非 null。
try-catch 吞掉异常却不处理也不记录
常见写法:catch (Exception e) { } 或只写 e.printStackTrace();。前者让错误静默失败,后者日志没进系统日志体系,线上根本查不到。正确做法:记录带上下文的 warn/error 日志(用 SLF4J),必要时重新抛出或封装成业务异常,绝不裸吞。
立即学习“Java免费学习笔记(深入)”;
日期处理用 Date 和 Calendar 硬刚
new Date(2023, 1, 1) 其实是 2024 年 2 月 1 日(月份从 0 开始);Calendar 的 set 和 add 行为容易混淆;时区、夏令时、跨年计算全是雷。Java 8 起请直接用 LocalDateTime / ZonedDateTime / DateTimeFormatter,不可变、线程安全、API 清晰。
HashMap 初始化不设初始容量
默认容量 16,加载因子 0.75,意味着放 13 个元素就扩容。频繁扩容(rehash)很耗时。如果预估要存 1000 个键值对,建议初始化写成 new HashMap(1280)(1000 ÷ 0.75 ≈ 1334,向上取 2 的幂得 2048,但 1280 更省空间且够用)。
把 SimpleDateFormat 当共享变量用
声明为 static 成员、多个线程共用同一个实例,必现解析错乱或报错。SimpleDateFormat 不是线程安全的。方案有三:方法内局部创建(轻量,推荐);用 ThreadLocal 包裹;换成线程安全的 DateTimeFormatter(Java 8+)。
异步任务忘了处理异常或等待完成
写 executor.submit(() -> { riskyCode(); }); 后不管不问,异常被吃掉,主线程也完全不知道任务失败。submit 返回 Future,必须调用 future.get()(会阻塞并抛出执行异常);或者用 CompletableFuture 链式处理异常(.exceptionally / .handle)。
用 == 比较浮点数
double a = 0.1 + 0.2; if (a == 0.3) {...} 几乎永远为 false。浮点数有精度误差。正确方式是用差值绝对值判断:Math.abs(a - 0.3) ;金额等关键场景一律用 BigDecimal。
静态方法/变量滥用导致内存泄漏
把 Activity、Context、View 等持有强引用塞进 static Map 或 static List,Android 里极易引发 OOM;Java SE 中也可能让本该回收的对象无法 GC。原则:静态容器只存生命周期长、无依赖的对象;必须存短生命周期对象时,用 WeakReference 包裹。
JSON 序列化忽略 null 字段却没配好框架
以为 Jackson 默认不输出 null,结果发现还是打了 "field": null。其实是默认行为是输出 null;需显式配置 objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL)。Gson 同理要 setExclusionStrategies。
标签: java android js json app ai stream 异步任务 数据丢失 键值对 字符串常量
还木有评论哦,快来抢沙发吧~