在java中的StringBuilder数组中操作StringBuilder

-3 java arrays stringbuilder

所以我有这段代码:

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 []表现不同,我想了解原因.

fge*_*fge 5

您看到的行为是预期的.

引用javadocArrays.fill():

将指定的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)