如何向Map<String, Object[]>中的已有Object[]数组添加元素?
问题分析与修复方案
错误原因
- 数组越界问题:Java数组的有效索引范围是
0到length-1,当你尝试访问addedParams.length这个索引时,已经超出了数组的边界,必然抛出Attempt to access illegal array index异常。 - 元素未追加反而被覆盖:原代码中
addedParams[addedParams.length-1] = params的操作,是把新传入的params数组直接替换了原数组的最后一个元素,并没有将新参数的元素追加到数组中。每次调用都会覆盖之前的最后一个元素,导致最终数组里始终只有一组参数。
修复后的代码
public void addInMap(String str, Object... params) { if(params != null && params.length > 0) { if(objMap.containsKey(str)) { Object[] originalParams = objMap.get(str); // 创建足够容纳原数组+新参数的新数组 Object[] newParams = new Object[originalParams.length + params.length]; // 复制原数组元素到新数组 System.arraycopy(originalParams, 0, newParams, 0, originalParams.length); // 复制新参数元素到新数组的后半段 System.arraycopy(params, 0, newParams, originalParams.length, params.length); // 更新map中的数组 objMap.put(str, newParams); } else { objMap.put(str, params); } } }
代码说明
- 数组是固定长度的,无法直接扩容,所以必须创建新数组来容纳原数组和新参数的所有元素。
- 使用
System.arraycopy完成数组元素的复制,这是Java原生的高效数组复制方法,比手动循环复制性能更优。 - 先复制原数组的所有元素到新数组的前半部分,再把新参数的所有元素复制到新数组的后半部分,实现了参数的追加效果,不会覆盖原有元素。
内容的提问来源于stack exchange,提问作者Zia
相关产品推荐
相关产品推荐

