ITPub博客

首页 > 数据库 > 数据库开发技术 > 7个常见Java坑,99%的程序员都会踩!

7个常见Java坑,99%的程序员都会踩!

原创 数据库开发技术 作者:IT枫斗者 时间:2024-11-11 17:25:09 0 删除 编辑



这篇文章总结了 7 个 Java 编程中常见的坑,并提供了解决方案:包括字符串替换方法、Integer相等判断、BigDecimal精度问题、字符串拼接的选择、空字符串判断方法的区别、查询结果的判空技巧、以及indexOf方法的正确使用。通过这些示例和解释,帮助开发者提高编程质量,避免常见错误。



1. replace会替换所有匹配字符吗?



很多开发者在处理字符串替换时会直接使用replace方法,但是它和replaceAll有一些区别。看下面的代码:

String input = "Java is fun, Java is cool";String output = input.replace("Java", "Python");System.out.println(output);  // Python is fun, Python is cool


在这个例子中,replace会替换所有匹配的子字符串。而replaceAll方法则基于正则表达式进行替换。举个例子,如果你需要替换所有以字母"J"开始的单词,应该使用replaceAll方法:

String input = "Java is fun, Java is cool";String output = input.replaceAll("\\bJ\\w+", "Python");System.out.println(output);  // Python is fun, Python is cool




2. Integer不能用==判断相等?



在Java中,Integer是一个对象,使用==比较两个Integer时会比较它们的引用地址,而不是它们的值。因此,即使两个Integer对象的值相同,==判断也可能返回false。比如:

Integer num1 = new Integer(100);Integer num2 = new Integer(100);System.out.println(num1 == num2);  // false


正确的做法是使用equals方法来判断值是否相等:

System.out.println(num1.equals(num2));  // true


如果不希望出现引用比较的问题,可以使用Integer的自动装箱机制,它会为值范围在-128到127之间的数字缓存对象,这时==可能会返回true:

Integer num1 = 100;Integer num2 = 100;System.out.println(num1 == num2);  // true




3. 使用BigDecimal

就能避免精度丢失?



虽然BigDecimal用于处理高精度的数值计算,但在初始化时可能仍会出现精度问题。特别是当你使用浮动的数字(如0.1)来初始化BigDecimal时,可能会遇到精度丢失的情况:

BigDecimal value = new BigDecimal(0.1);System.out.println(value);  // 0.1000000000000000055511151231257827021181583404541015625


这是因为BigDecimal使用Double构造时会继承Double的精度问题。为了避免这种情况,最好使用BigDecimal.valueOf(double)或BigDecimal的String构造方法:

BigDecimal value = BigDecimal.valueOf(0.1);System.out.println(value);  // 0.1




4. 字符串拼接不能用String?



String是不可变的,因此每次拼接时都会创建新的字符串对象。这会影响性能,尤其是在拼接大量字符串时。为了避免这种问题,推荐使用StringBuilder:

StringBuilder sb = new StringBuilder();sb.append("Java").append(" ").append("is").append(" ").append("fun");System.out.println(sb.toString());  // Java is fun


StringBuilder比String更高效,因为它是可变的,且不需要频繁创建新对象。如果你需要线程安全的拼接,可以使用StringBuffer:

StringBuffer sb = new StringBuffer();sb.append("Java").append(" ").append("is").append(" ").append("fun");System.out.println(sb.toString());  // Java is fun




5. isEmpty与isBlank的区别?



isEmpty()与isBlank()都用于检查字符串是否为空,但它们的含义略有不同:

isEmpty()判断字符串的长度是否为0。
isBlank()判断字符串是否为空,或仅包含空白字符(如空格、换行符等)。
例如:

String str1 = "   ";System.out.println(str1.isEmpty());  // falseSystem.out.println(str1.isBlank());  // true




6. Mapper查询结果如何判空?



在使用MyBatis或其他ORM框架时,经常需要从数据库中查询数据。如果查询结果为空,正确的判空方式是:

List<User> users = userMapper.findUsers();if (users == null || users.isEmpty()) {    // 处理为空的情况}
这种方式可以避免NullPointerException并确保逻辑的正确性。




7. indexOf方法的正确使用?



indexOf方法返回子字符串第一次出现的位置,如果子字符串不存在,返回-1。很多开发者会在判断时直接用indexOf返回值进行比较:

String str = "Hello, world!";int index = str.indexOf("world");if (index >= 0) {    System.out.println("Found at index: " + index);} else {    System.out.println("Not found");}
这种方法简单有效,但要确保目标字符串不为null,避免NullPointerException。

这些常见的坑和解决方案,都是我们在日常Java开发中经常遇到的,希望大家能够避免这些错误,提高编码质量,做出更高效、更稳定的代码。


👋 大家好,我是枫哥,一名Java后端开发者!我热衷于探索新技术,并在我的微信公众号上分享关于Java 生态和后端开发的知识。欢迎关注我的公众号,期待与你一起探讨技术的无穷可能!” 目前专注于Java技术分享,覆盖春招、秋招、社招和跳槽相关内容,并提供一对一带徒学习服务。加入 学徒计划,即可享受内推机会和优质资源,签订协议确保就业无忧。此外,我们还推出了‘Java跳槽网’, 为你的求职之路提供全方位支持,助你快速找到理想工作!



- End -

原文作者:IT枫斗者;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论
大家好,我是枫哥,🌟阿里云技术专家、📝资深面试官、🌹Java跳蚤网课堂创始人。技术交流vx:itfdz666,拥有多年一线研发经验,曾就职过科大讯飞、美团网、平安等公司。看面试实战视频可以关注b站号:IT枫斗者–Java面试。需要看技术文章,可以关注CSDN:IT枫斗者。

注册时间:2020-05-13

  • 博文量
    183
  • 访问量
    81331