所以我有这段代码:
StringBuilder[] a = new StringBuilder[5];
Arrays.fill(a, new StringBuilder("asdfg"));
a[0].deleteCharAt(0);
for (StringBuilder s : a) {
System.out.println(s);
}
Run Code Online (Sandbox Code Playgroud)
和输出
sdfg
sdfg
sdfg
sdfg
sdfg
Run Code Online (Sandbox Code Playgroud)
似乎数组中的所有元素都是对同一个StringBuilder对象的引用,我猜它是因为Arrays.fill().为什么会发生这种情况?我该如何解决这个问题?ps:我不想使用循环,因为fill()只对StringBuilder []表现不同,我想了解原因.
您看到的行为是预期的.
将指定的Object引用分配给指定的Objects数组的每个元素.
强调我的.
这里的参考是val在原型中(回想:public static void fill(Object[] a, Object val),这是你的new StringBuilder("asdfg").
如果要使用不同的元素填充数组的每个元素,则需要循环遍历数组索引并每次填充新对象.例如(使用Java 8):
IntStream.range(O, a.length).foreach(index -> a[index] = new StringBuilder("asdfg"));
Run Code Online (Sandbox Code Playgroud)
作为旁注,你可以IntStream直接使用一个构建你的数组,虽然我不确定代码是否真的清晰.流API滥用警告!
final StringBuilder[] a = IntStream.range(0, 5)
.mapToObj(ignored -> new StringBuilder("asdfg"))
.toArray(StringBuilder[]::new);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
156 次 |
| 最近记录: |