# HG changeset patch # User henryjen # Date 1375224455 25200 # Node ID 39e9a8d88dd8526940c46e35643c1fe1f9cc3e62 # Parent e47569593fa0718e91b138ff18b6d0ee49db104c 8020977: StringJoiner merges with itself not as expected Reviewed-by: psandoz, chegar, mduigou, smarks diff --git a/src/share/classes/java/util/StringJoiner.java b/src/share/classes/java/util/StringJoiner.java --- a/src/share/classes/java/util/StringJoiner.java +++ b/src/share/classes/java/util/StringJoiner.java @@ -206,11 +206,12 @@ public StringJoiner merge(StringJoiner other) { Objects.requireNonNull(other); if (other.value != null) { + final int length = other.value.length(); + // lock the length so that we can seize the data to be appended + // before initiate copying to avoid interference, especially when + // merge 'this' StringBuilder builder = prepareBuilder(); - StringBuilder otherBuilder = other.value; - if (other.prefix.length() < otherBuilder.length()) { - builder.append(otherBuilder, other.prefix.length(), otherBuilder.length()); - } + builder.append(other.value, other.prefix.length(), length); } return this; } diff --git a/test/java/util/StringJoiner/MergeTest.java b/test/java/util/StringJoiner/MergeTest.java --- a/test/java/util/StringJoiner/MergeTest.java +++ b/test/java/util/StringJoiner/MergeTest.java @@ -23,7 +23,7 @@ /** * @test - * @bug 8017231 + * @bug 8017231 8020977 * @summary test StringJoiner::merge * @run testng MergeTest */ @@ -121,4 +121,13 @@ sj.merge(other); assertEquals(sj.toString(), "{a,b,c,d:e:f}"); } + + public void testMergeSelf() { + final StringJoiner sj = new StringJoiner(",", "[", "]").add("a").add("b"); + assertEquals(sj.merge(sj).toString(), "[a,b,a,b]"); + assertEquals(sj.merge(sj).toString(), "[a,b,a,b,a,b,a,b]"); + + final StringJoiner sj2 = new StringJoiner(",").add("c").add("d"); + assertEquals(sj2.merge(sj2).toString(), "c,d,c,d"); + } } \ No newline at end of file