Java 数组必知:Arrays.toString 到底什么时候用
在日常 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
方法传参:要数组 → 不用
五、浅浅总结
数组直接打印 = 输出地址,无意义
Arrays.toString = 输出元素内容,用于展示、日志、调试
展示给人看 → 用
代码逻辑处理、传参、遍历 → 不用
如果数组里是自定义对象,比如
Emp[],直接用Arrays.toString打印的还是对象地址。 这时候需要我们在实体类中重写 toString () 方法,才能看到真实字段内容。
