ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Java开发常见陷阱:这9个坑千万别踩

Java开发常见陷阱:这9个坑千万别踩 写Java的人谁没踩过几个坑。有些坑踩一次就长记性有些坑踩了十年还在踩。下面这九个陷阱不分资历深浅只分踩过和没踩过。趁早看清少走弯路。用比较字符串十次有九次错String a hello; String b new String(hello); a b返回false。比较的是引用地址equals比较的才是内容。字符串常量池的机制让hello hello返回true恰恰是这个“偶尔正确”让无数人栽跟头。凡是对象比较一律用equals除非你明确知道自己在比较地址。更稳妥的做法是把常量放前面hello.equals(a)避免a为null时抛NPE。循环里拼字符串性能杀手java复制下载String result ; for (int i 0; i 10000; i) { result i; }每次都创建一个新的StringBuilder再toString一万次循环产生一万个临时对象。循环次数一多GC直接飙红。循环内拼接字符串必须用StringBuilder循环外用“”没问题。编译器会优化单次拼接但循环体内的优化管不到。finally里return吞掉一切java复制下载try { return 1; } finally { return 2; }这个方法返回2try里的return被吃掉了。更可怕的是如果try里抛了异常finally里return异常也会被吞掉调用方根本不知道出了什么事。finally块只做资源释放绝不写return、break或continue。这个坑踩过一次可能花你半天时间排查。equals和hashCode要么都写要么都不写只重写equals不重写hashCode把对象放进HashMap或HashSet它就成了幽灵——明明放进去两个相等的对象size却是2。HashMap先用hashCode定位桶再用equals比较。hashCode不一致equals根本走不到。反过来只写hashCode不写equals也会出现诡异行为。IDE一键生成两个一起写别偷懒。Arrays.asList返回的列表不能改java复制下载ListString list Arrays.asList(a, b); list.add(c); // UnsupportedOperationExceptionArrays.asList返回的是Arrays内部的固定长度列表底层是数组不支持增删。用new ArrayList(Arrays.asList(...))包一层才能改。这个坑在单元测试里最常踩写测试数据时顺手一写一add就崩。在增强for循环里删元素java复制下载for (String s : list) { if (s.equals(x)) { list.remove(s); // ConcurrentModificationException } }迭代器遍历时修改集合modCount对不上直接抛异常。正确做法是用Iterator的remove方法或者用removeIf。增强for循环只读不写要改就换迭代器或新集合。这个坑的名字叫“看起来对跑起来炸”。自动装箱的缓存陷阱Integer a 127, b 127; a b返回true。Integer c 128, d 128; c d返回false。IntegerCache默认缓存-128到127超出范围就new新对象。包装类型比较一律用equals别用。更隐蔽的是三目运算符里的自动拆箱Integer a null; int b true ? a : 0;直接NPE。包装类型为null时任何自动拆箱都可能炸。SimpleDateFormat不是线程安全的SimpleDateFormat内部有一个Calendar字段多线程共用时格式化结果会错乱甚至抛异常。静态的SimpleDateFormat是线上事故重灾区。用DateTimeFormatter替代它是线程安全的。如果非要用SimpleDateFormat每次new一个或者用ThreadLocal包一层。但2024年了直接上DateTimeFormatter吧。日志里别做字符串拼接java复制下载logger.debug(user: user.getName() , age: user.getAge());即日志级别设为INFO这行拼接照样执行照样创建临时对象。正确写法是logger.debug(user: {}, age: {}, user.getName(), user.getAge());用占位符级别不够时不拼接。日志是排查问题的工具别让它成为性能瓶颈。更别在日志里漏敏感信息手机号、身份证号打出来就是事故。这九个坑每一个都能在代码里找到活生生的例子。踩坑不可怕可怕的是踩了十年还觉得“程序能跑就行”。下次写代码时多想一秒这个是不是该换成equals这个循环里拼字符串是不是该用StringBuilder好代码不是写出来的是避坑避出来的。
返回列表