Scala中数组初始化差异引发ArrayIndexOutOfBoundsException的原因
Scala数组初始化差异与ArrayIndexOutOfBoundsException关联解析
两种数组初始化方式的核心差异
Scala里这两种写法看似相似,实际行为完全不同:
new Array[Int](n):创建长度为n的数组,数组内每个元素会被自动初始化为对应类型的默认值(Int类型默认是0)。比如new Array[Int](6)会生成一个长度6、所有元素都是0的数组。Array[Int](n):调用Array伴生对象的工厂方法,创建包含指定元素的数组。参数是数组的元素而非长度——比如Array[Int](6)会生成一个长度1、唯一元素是6的数组;如果传多个参数Array[Int](1,2,3),则生成包含这三个元素的长度3的数组。
为什么前者会触发数组越界异常
在你的零钱兑换方法中,dp数组需要覆盖从0到amount的所有金额,因此需要长度为amount+1的数组。
- 当用
Array[Int](amount + 1)初始化时,你实际创建的是一个长度仅为1的数组,唯一元素的值是amount+1。后续代码中必然会访问dp[1]、dp[2]直到dp[amount]这些索引,但数组的有效索引只有0,所以直接触发java.lang.ArrayIndexOutOfBoundsException。 - 而
new Array[Int](amount + 1)会创建长度正好为amount+1的数组,索引范围从0到amount,完全匹配零钱兑换逻辑的访问需求,因此运行正常。
举个具体例子:假设amount=5
new Array[Int](5+1)→ 数组长度6,索引0-5,符合逻辑需求Array[Int](5+1)→ 数组长度1,仅索引0有效,访问dp[1]及以上就会报错
内容的提问来源于stack exchange,提问作者anil
相关产品推荐
相关产品推荐

