字符串生成器如何替换工作?
How does string builder replace work?
StringBuilder sbt = new StringBuilder(2);//
System.out.print(sbt+"G");
sbt.replace(0,2,"Mano");
System.out.println(sbt+"Length is:"+sbt.capacity());
我希望它应该打印 GManoLength is:4
.
但是returnsGManoLength is:6
这个分配是如何工作的?
我读了this
StringBuilder
将数据保存在 char[]
数组中,capacity()
方法 returns 这个数组的长度(不是附加值的长度)。
当达到容量并且您想附加更多值时,应扩展数组。在此过程中提供额外的 space 并且不要在每次附加后进行扩展(这是昂贵的操作)是一个好主意:
int newCapacity = value.length * 2 + 2;//called when capacity is reached during append
所以capacity
总是大于等于那么实际数据的长度(这个值可以调用length()
方法得到)
您没有显示 StringBuilder
内容的 长度 。您显示的是 容量。 StringBuilder 可以根据需要分配任意多的 space,即使您从不使用 space。通常,假设 StringBuilder 将用于向其中添加更多数据是明智之举,否则您将使用 String 或其他恒定大小构造。
如果要显示数据的长度,请使用length()
方法。
当您尝试将这 4 个字符 "Mano" 添加到容量为 2 的 StrigBuilder 时,将使用 minimumCapacity 作为分配新字符串所需的最小大小调用 AbstractStringBuilder 的 expandCapacity 方法:
void expandCapacity(int minimumCapacity) {
int newCapacity = value.length * 2 + 2;
if (newCapacity - minimumCapacity < 0)
newCapacity = minimumCapacity;
if (newCapacity < 0) {
if (minimumCapacity < 0) // overflow
throw new OutOfMemoryError();
newCapacity = Integer.MAX_VALUE;
}
value = Arrays.copyOf(value, newCapacity);
}
它尝试做的第一件事是将当前容量加倍并求和 2。您的原始容量为 2,因此 newCapacity 将为 6。这大于 4("Mano" 的长度) 所以这就是你看到 6.
的原因
StringBuilder sbt = new StringBuilder(2);//
System.out.print(sbt+"G");
sbt.replace(0,2,"Mano");
System.out.println(sbt+"Length is:"+sbt.capacity());
我希望它应该打印 GManoLength is:4
.
但是returnsGManoLength is:6
这个分配是如何工作的?
我读了this
StringBuilder
将数据保存在 char[]
数组中,capacity()
方法 returns 这个数组的长度(不是附加值的长度)。
当达到容量并且您想附加更多值时,应扩展数组。在此过程中提供额外的 space 并且不要在每次附加后进行扩展(这是昂贵的操作)是一个好主意:
int newCapacity = value.length * 2 + 2;//called when capacity is reached during append
所以capacity
总是大于等于那么实际数据的长度(这个值可以调用length()
方法得到)
您没有显示 StringBuilder
内容的 长度 。您显示的是 容量。 StringBuilder 可以根据需要分配任意多的 space,即使您从不使用 space。通常,假设 StringBuilder 将用于向其中添加更多数据是明智之举,否则您将使用 String 或其他恒定大小构造。
如果要显示数据的长度,请使用length()
方法。
当您尝试将这 4 个字符 "Mano" 添加到容量为 2 的 StrigBuilder 时,将使用 minimumCapacity 作为分配新字符串所需的最小大小调用 AbstractStringBuilder 的 expandCapacity 方法:
void expandCapacity(int minimumCapacity) {
int newCapacity = value.length * 2 + 2;
if (newCapacity - minimumCapacity < 0)
newCapacity = minimumCapacity;
if (newCapacity < 0) {
if (minimumCapacity < 0) // overflow
throw new OutOfMemoryError();
newCapacity = Integer.MAX_VALUE;
}
value = Arrays.copyOf(value, newCapacity);
}
它尝试做的第一件事是将当前容量加倍并求和 2。您的原始容量为 2,因此 newCapacity 将为 6。这大于 4("Mano" 的长度) 所以这就是你看到 6.
的原因