在Java中Arrays类常见方法有哪些_Java数组操作工具解析

2026-01-30 00:00:00 作者:P粉602998670
Arrays.asList() 返回的列表不可结构性修改,因底层是 Arrays 内部类且直接引用原数组;Arrays.equals() 仅浅比较内容,嵌套数组需用 deepEquals()。

Arrays.asList() 为什么不能直接修改原数组

Arrays.asList() 返回的是 Arrays 内部的静态嵌套类 ArrayList(不是 java.util.ArrayList),它底层直接引用传入的数组,不支持 add()remove() 等结构性修改操作,调用会抛出 UnsupportedOperationException

  • 若需可变列表,应显式转为 new ArrayList(Arrays.asList(...))
  • 该方法对基本类型数组(如 int[])无效——它会把整个数组当作一个元素,返回 List,而非 List
  • 修改返回列表中的元素(如 set(0, x))会影响原数组,因为是共享引用

Arrays.sort() 对基本类型和对象数组的差异

Arrays.sort() 重载版本行为不同:对 int[]double[] 等基本类型数组,使用双轴快排(JDK 7+);对对象数组(如 String[]),默认使用 TimSort(稳定排序),且要求元素实现 Comparable 或传入 Comparator

  • Object[] 排序时若含 null,会抛 NullPointerException(除非自定义 Comparator 显式处理)
  • 多维数组(如 int[][])调用 sort() 只按首元素排序,不会递归排序子数组
  • 并发修改风险:排序过程中不应在其他线程修改该数组

Arrays.equals() 和 == 到底比什么

Arrays.equals(a, b) 比较两个数组**内容是否相等**(逐元素调用 equals()),而 a == b 只判断是否指向同一内存地址。对基本类型数组,Arrays.equals() 是唯一安全的内容比较方式;对对象数组,它不会递归比较嵌套数组内容。

  • 嵌套数组需用 Arrays.deepEquals(),否则 [[1,2]][[1,2]] 会被判为不等(因子数组引用不同)
  • Arrays.equals(null, null) 返回 true;但 Arrays.equals(arr, null) 返回 false,不抛空指针
  • 注意:Arrays.equals() 不适用于非数组对象,比如误传 List 会导致编译错误

Arrays.fill() 的边界与类型陷阱

Arrays.fill() 用于批量赋值,但容易忽略起始/结束索引语义:fill(arr, fromIndex, toIndex, val)toIndex 是**不包含**的,即填充范围为 [fromIndex, toIndex)。此外,基本类型重载版本只接受对应包装类型或原始类型字面量,不能混用。

  • boolean[]1 会编译失败;必须填 truefalse
  • Object[]null 是合法的,但后续若调用 toString() 等方法可能触发空指针
  • fromIndex > toIndex,方法静默返回,不报错也不填充
实际写业务代码时,最容易被绕进去的是 Arrays.asList() 的不可变假象和 Arrays.equals() 对嵌套结构的“浅比较”——这两处一旦出错,调试成本远高于改一行代码。

猜你喜欢

联络方式:

400 9058 355

邮箱:8955556@qq.com

Q Q:8955556

微信二维码
在线咨询 拨打电话

电话

400 9058 355

微信二维码

微信二维码