summaryrefslogtreecommitdiff
path: root/libjava/java/lang/StringBuffer.java
diff options
context:
space:
mode:
Diffstat (limited to 'libjava/java/lang/StringBuffer.java')
-rw-r--r--libjava/java/lang/StringBuffer.java8
1 files changed, 7 insertions, 1 deletions
diff --git a/libjava/java/lang/StringBuffer.java b/libjava/java/lang/StringBuffer.java
index 4127d54787f..70f78fbf8e5 100644
--- a/libjava/java/lang/StringBuffer.java
+++ b/libjava/java/lang/StringBuffer.java
@@ -98,7 +98,13 @@ public final class StringBuffer implements Serializable
{
if (shared || minimumCapacity > value.length)
{
- minimumCapacity = Math.max(minimumCapacity, value.length*2+2);
+ // We don't want to make a larger vector when `shared' is
+ // set. If we do, then setLength becomes very inefficient
+ // when repeatedly reusing a StringBuffer in a loop.
+ int max = (minimumCapacity > value.length
+ ? value.length*2+2
+ : value.length);
+ minimumCapacity = Math.max(minimumCapacity, max);
char[] nb = new char[minimumCapacity];
System.arraycopy(value, 0, nb, 0, count);
value = nb;