当前位置: 首页 > news >正文

Java开发中最那些常见的坑,你踩过几个?

大家好,我是晓凡。

作为一名Java开发者,在日常编码过程中难免会遇到各种"坑"。
有些是语法层面的问题,有些则是设计或思维上的误区。
今天我们就来盘点一下Java中最常见的20个陷阱,看看你有没有踩过这些坑。

1. == 和 equals() 混淆

String a = new String("hello");
String b = new String("hello");
System.out.println(a == b);        // false
System.out.println(a.equals(b));   // true
  • ==比较的是对象引用地址
  • equals()比较的是对象内容(对于String等类已重写)

2. Integer缓存陷阱

Integer a = 127;
Integer b = 127;
System.out.println(a == b);  // trueInteger c = 128;
Integer d = 128;
System.out.println(c == d);  // false

Integer在-128到127之间有缓存机制,超出范围会创建新对象。

3. 字符串拼接性能问题

// 错误做法 - 性能差
String result = "";
for (int i = 0; i < 1000; i++) {result += "a";  // 每次都创建新对象
}// 正确做法
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {sb.append("a");
}

4. 集合遍历时修改结构

// 错误做法
List<String> list = new ArrayList<>();
list.add("a");
list.add("b");for (String item : list) {if ("a".equals(item)) {list.remove(item);  // ConcurrentModificationException}
}// 正确做法
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {String item = iterator.next();if ("a".equals(item)) {iterator.remove();}
}

5. 忘记关闭资源

// 错误做法
FileInputStream fis = new FileInputStream("file.txt");
// 忘记关闭,可能导致资源泄露// 正确做法
try (FileInputStream fis = new FileInputStream("file.txt")) {// 使用资源
} catch (IOException e) {// 处理异常
}

6. 异常处理不当

// 错误做法
try {// some code
} catch (Exception e) {// 空的catch块,异常被默默吞掉
}// 正确做法
try {// some code
} catch (SpecificException e) {logger.error("发生错误", e);// 或者重新抛出,或者适当处理
}

7. 数组和集合的toArray()陷阱

List<String> list = Arrays.asList("a", "b");
String[] array1 = list.toArray();           // 返回Object[]
String[] array2 = list.toArray(new String[0]);  // 返回String[]

不传参数的toArray()返回Object数组,不是原类型数组。

8. 泛型类型擦除

public class GenericTest<T> {public void test() {// T.class 是无法获取的,编译后泛型信息被擦除}
}

运行时无法获取泛型的实际类型信息。

9. 可变参数的陷阱

public static void print(Object... args) {System.out.println(args.length);
}print(null);        // 输出: 1 (null被视为一个元素)
print();            // 输出: 0
print("a", "b");    // 输出: 2

10. switch语句忘记break

int x = 1;
switch (x) {case 1:System.out.println("1");// 忘记break,会继续执行case 2case 2:System.out.println("2");break;
}
// 输出: 1 和 2

11. 浮点数比较精度问题

double a = 0.1;
double b = 0.2;
double c = 0.3;System.out.println(a + b == c);  // false
System.out.println(a + b);       // 0.30000000000000004

浮点数运算存在精度误差,应该使用BigDecimal或误差范围比较。

12. 日期时间处理陷阱

// 过时的做法
Date date = new Date(2023, 12, 25);  // 年份从1900开始,月份从0开始// 推荐做法
LocalDate date = LocalDate.of(2023, 12, 25);

旧的Date API设计有问题,推荐使用新的Time API。

13. 线程安全问题

// 非线程安全
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");// 线程安全做法
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");

很多常用类不是线程安全的,多线程环境下需要注意。

14. HashMap容量和负载因子

// 默认容量16,负载因子0.75
Map<String, String> map = new HashMap<>();// 如果知道大概大小,可以预设容量避免频繁扩容
Map<String, String> map2 = new HashMap<>(100);

合理设置初始容量可以提高性能。

15. 空指针异常(NPE)

String str = null;
int length = str.length();  // NullPointerException// 防御性编程
if (str != null) {int length = str.length();
}

16. 递归没有终止条件

public int factorial(int n) {return n * factorial(n - 1);  // 栈溢出Error
}// 正确做法
public int factorial(int n) {if (n <= 1) return 1;  // 终止条件return n * factorial(n - 1);
}

17. 忘记重写hashCode()

public class Person {private String name;// 如果只重写了equals()而没有重写hashCode()// 在HashSet中会出现问题
}

equals()和hashCode()必须同时重写,且保持一致性。

18. 静态变量的生命周期

public class Counter {private static int count = 0;public void increment() {count++;  // 所有实例共享同一个count}
}

静态变量属于类,不属于实例,所有实例共享。

19. substring()内存泄漏风险

// Java 6及以前版本存在此问题
String original = readLargeFile();  // 很大的字符串
String small = original.substring(0, 10);  // 仍持有原始字符串的引用

老版本substring()会持有原字符串引用,可能导致内存泄漏。

20. 未正确实现compareTo()

public class Student implements Comparable<Student> {private int age;@Overridepublic int compareTo(Student other) {return age - other.age;  // 可能整数溢出}// 正确做法public int compareTo(Student other) {return Integer.compare(age, other.age);}
}

整数相减可能导致溢出,应使用包装类的compare方法。


你在开发中还遇到过哪些有趣的Java陷阱呢?欢迎在评论区分享!

http://www.gsyq.cn/news/51687.html

相关文章:

  • 量化网络风险:持续DDoS测试的运营投资回报
  • Tenable Nessus 10.11 新增功能简介
  • midwayjs 自定义组件开发
  • Apache NetBeans 28 发布 - Java 等多语言开源跨平台 IDE
  • 读社会工程:安全体系中的人性漏洞(第2版)04读懂对方的暗示
  • [题解]【MX-S11】梦熊 NOIP 2025 模拟赛 3 WAOI R7 FeOI R6.5(同步赛) T1~T2
  • 移动应用安全测试全面指南:方法与最佳实践
  • AI元人文:人机差异律——《人机互觉协议》草案
  • AI元人文:从哲学构想走向日常实践——与LLM共筑价值新文明
  • scoop安装使用PostgreSQL
  • AI元人文:价值意义的行为化革命与文明协同框架
  • 基于神经网络控制器的倒立摆控制系统simulink建模与仿真,对比模糊控制器
  • 基于ADMM交替方向乘子法的超大规模储备系统分布式协同优化算法收敛性matlab仿真与分析
  • MySQL 查询优化器
  • C++学习日志——蓝桥杯课程总结_基础篇/2025.11.16
  • 从概念迷宫到行动共生:价值原语化与全球行为接口协议新范式
  • 2025-11-17 使用nvm下载node包失败
  • 41
  • VB6介绍
  • 移动银行安全测试的11个最佳实践
  • 2025 年 11 月苹果仓厂家推荐排行榜,苹果仓民宿,移动房苹果仓,出口苹果仓,外贸出口苹果仓,集装箱苹果仓,景区苹果仓,苹果仓房屋,网红苹果仓,可移动式苹果仓公司推荐
  • 深入解析:STM32H743-ARM例程23-USB_HID
  • 2025 年 11 月广播设备厂家推荐排行榜,视讯广播,SI广播,数字IP广播,智能广播系统,定压功放,广播周边,广播话筒,广播机柜,SIP网络广播系统,公共广播系统公司推荐
  • 2025 年 11 月全自动智能点胶机厂家推荐排行榜,视觉定位点胶机,饰品/纽扣/拉链头/商标/钥匙扣/五金/徽章/线圈/硅胶/UV胶点胶设备公司精选
  • 2025 年 11 月试验机厂家推荐排行榜,拉力试验机,江都试验机,管材环刚度试验机,电子万能试验机,橡胶试验机,压缩试验机公司推荐
  • 2025 年 11 月家居智能制造系统厂家推荐排行榜:家居ERP,家居MES,家居CRM,家居ERP系统,家居MES软件,家居CRM产品公司推荐
  • Daibitx.EFCore.AutoMigrate:模块化架构下安全、可控的 EF Core 迁移方案
  • [LangChain] 19. 持久化记忆
  • 2025 年 11 月 Q355B/Q345B/16Mn 冷拉方钢厂家推荐排行榜,高强度结构钢,建筑机械用冷拉方钢,优质钢材厂家精选
  • *题解:P11364 [NOIP2024] 树上查询