为何两种StringBuilder数组初始化方式效果不同?求解析
为什么增强for循环无法初始化StringBuilder数组?
核心原因是增强for循环的遍历变量是原数组元素引用的副本,赋值新对象不会修改原数组的内容,这和StringBuilder是引用类型直接相关。
两种循环的本质差异
增强for循环的执行逻辑
遍历数组时,element是一个临时局部变量,每次循环会把当前数组元素的引用(比如初始状态下sb[0]的null)复制给element。当你执行element = new StringBuilder(""),只是把这个临时变量的指向改成了新创建的StringBuilder对象,但原数组中sb[0]的引用并没有被修改,依然是null。相当于你拿了一张纸条抄了盒子上的地址,然后把纸条换成新地址,盒子本身的地址没变。普通for循环的执行逻辑
通过索引i直接访问数组的sb[i]位置,把新创建的StringBuilder对象的引用直接赋值给这个数组位置,相当于直接修改了原数组的元素内容,所以能完成初始化。
代码对比验证
无效的增强for循环:
for (StringBuilder element : sb){ element = new StringBuilder(""); }
这里的element是原数组元素引用的副本,修改它不会影响原数组本身。
有效的普通for循环:
for(int i=0; i<sb.length; i++){ sb[i] = new StringBuilder(""); }
直接操作数组的索引位置,修改原数组的元素引用,因此能正常完成初始化。
内容的提问来源于stack exchange,提问作者hello xx
相关产品推荐
相关产品推荐

