在日常 Java 开发中,我们经常会和数组打交道,尤其在日志打印、接口传参、批量操作时,总会遇到一个问题:为什么有时候直接用数组没问题,有时候必须套一层 Arrays.toString ()?

很多我们在写批量删除、批量查询接口时,代码类似这样:

@DeleteMapping
public Result delete(Integer[] ids) {
    log.info("根据id批量删除员工:{}", Arrays.toString(ids));
    empService.delete(ids);
    return Result.success();
}

明明遍历数组时不用做任何转换,偏偏打印日志、拼接信息时必须用 Arrays.toString,为什么?到底什么时候使用字符串转换的方法?


一、先搞懂:为什么直接打印数组会 “乱码”?

Java 中的数组是引用类型,它继承自 Object,但没有重写 toString () 方法。

直接打印数组时,JVM 会调用 Object 默认的 toString:类型名@哈希码

比如 Integer [] 数组直接打印,会输出:

[Ljava.lang.Integer;@1234abcd

这串内容对我们调试毫无意义,我们想看的是数组里真实的元素,比如 [1,2,3]。

而 Arrays.toString () 的作用,就是把数组内容转换成人类可读的字符串,自动遍历、拼接、格式化,输出 [元素1, 元素2, 元素3] 这种格式。


二、When use Arrays.toString ()?

只要是把 “整个数组” 用来展示、打印、拼接字符串,就必须用 Arrays.toString ()。

必须使用的场景

  • 日志打印数组内容(最常见)
log.info("批量删除ids:{}", Arrays.toString(ids));
  • 控制台打印数组
String msg = "本次删除的id为:" + Arrays.toString(ids);
  • 字符串拼接,要显示数组内容

String msg = "本次删除的id为:" + Arrays.toString(ids);
  • 调试时查看数组元素

共同点:需要把数组展示给人看,而不是交给代码逻辑处理。


三、什么时候完全不需要用 Arrays.toString ()?

同样一句话: 只是把数组传给方法、遍历元素、判断长度,完全不用转换。

不需要使用的场景

  • 遍历数组,处理单个元素

for (Integer id : ids) {
    empMapper.deleteById(id);
}
  • 直接把数组传给接收数组类型的方法

// 方法定义:void delete(Integer[] ids)
empService.delete(ids);
  • 判断数组是否为空、获取长度

if (ids == null || ids.length == 0) {
    return Result.error("id不能为空");
}

共同点:代码只认数组类型,不认字符串,直接传数组即可。


四、代码示例

@DeleteMapping
public Result delete(Integer[] ids) {
    // 日志展示给人看 → 必须用 Arrays.toString
    log.info("根据id批量删除员工:{}", Arrays.toString(ids));

    // 传给service,要的是数组类型 → 直接传,不用
    empService.delete(ids);

    return Result.success();
}
  • 日志:要内容 → 用 Arrays.toString

  • 方法传参:要数组 → 不用


五、浅浅总结

  1. 数组直接打印 = 输出地址,无意义

  2. Arrays.toString = 输出元素内容,用于展示、日志、调试

  3. 展示给人看 → 用

  4. 代码逻辑处理、传参、遍历 → 不用

如果数组里是自定义对象,比如 Emp[],直接用 Arrays.toString 打印的还是对象地址。 这时候需要我们在实体类中重写 toString () 方法,才能看到真实字段内容。

更多推荐