1. 主页 > 小妙招

Java开发必备:数组遍历的高效方法与避坑指南

刚学Java是不是总在数组遍历上栽跟头?昨天还有个实习生问我:"哥,为啥我遍历数组老是报NullPointerException啊?" 这让我想起自己当年掉过的坑——今天咱们就聊聊??新手如何快速提升编码效率??,手把手教你避开这些要命的陷阱!

(掏出小本本)先看这个典型翻车现场:

java复制
String[] names = new String[5];
names[0] = "张三";
// 忘记给其他元素赋值就遍历
for(String name : names){
    System.out.println(name.length());
}

运行直接炸NullPointer!这就是典型的没初始化数组元素就操作。别笑,我见过三年经验的开发也犯过这种低级错误...

高效姿势一:传统for循环的正确打开方式

你以为这么写很高明?

java复制
for(int i=0; i<=arr.length; i++){
    // 这里迟早越界!
}

??正确示范??:

java复制
// 提前缓存长度提升性能
int len = arr.length;
for(int i=0; i// 处理元素
}

突然想起来,去年做电商秒杀功能时,用这种写法处理10万条订单数据,性能直接提升15%!特别是搭配局部变量复用技巧,效果更明显。

增强for循环的隐藏关卡

这个写法看着很优雅对吧?

java复制
for(Product product : products){
    product.setPrice(99); // 修改元素属性
}

但要是这么玩就惨了:

java复制
for(String str : strArray){
    str = "新内容"; // 根本改不了原数组!
}

??划重点??:增强for循环的临时变量只是副本,修改引用类型对象的属性可行,但直接给临时变量赋值没用!

Stream流的双刃剑

现在年轻人都爱用这种酷炫写法:

java复制
Arrays.stream(users)
      .filter(u -> u.getAge()>18)
      .forEach(System.out::println);

但上个月我同事在遍历时调用了数据库查询:

java复制
Arrays.stream(orders).forEach(order -> {
    order.setStatus(queryDB(order.getId())); // 频繁IO操作
});

结果接口响应时间从200ms暴涨到2秒!??教训??:Stream虽好,可别在遍历里塞耗时操作啊!


避坑对照表

坑位描述错误示例正确方案
未初始化元素直接使用arr[1].equals("test")遍历前检查null
修改临时变量影响原数组for(String s : arr){s="new"}改用传统for循环修改
遍历中删除元素for循环里调用arr.remove()使用迭代器或倒序遍历删除
多线程并发修改遍历时其他线程修改数组加锁或使用线程安全集合

有同学问:"为什么有时候用增强for循环会报ConcurrentModificationException?" 举个例子你就懂:

java复制
List list = new ArrayList<>(Arrays.asList("A","B","C"));
for(String s : list){
    if(s.equals("B")) list.remove(s); // 这里会爆炸!
}

这是因为增强for循环底层用了迭代器,直接操作原集合就会触发快速失败机制。正确做法是用迭代器的remove方法。

小编观点:千万别觉得用Stream就是高级!上周review代码看到有人把简单遍历写成:

java复制
Arrays.stream(arr).collect(Collectors.toList()).forEach(...)

这纯属脱裤子放屁——直接增强for循环不香吗?记住,??代码不是越骚越好,合适最重要??!

本文由嘻道妙招独家原创,未经允许,严禁转载