Skip to content

Commit 0f7d484

Browse files
authored
LANG-1675 - Improve performance of StringUtils.join for primitives (#812)
* String.join - boolean - use StringBuilder * Replaced StringJoiner by StringBuilder * Fix: formatting, removed condition in for * Use substring instead of deleteCharAt. Computed StringBuilder size for - char, boolean join methods * Reformating
1 parent 0d729dd commit 0f7d484

1 file changed

Lines changed: 41 additions & 39 deletions

File tree

‎src/main/java/org/apache/commons/lang3/StringUtils.java‎

Lines changed: 41 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -3930,11 +3930,13 @@ public static String join(final boolean[] array, final char delimiter, final int
39303930
if (endIndex - startIndex <= 0) {
39313931
return EMPTY;
39323932
}
3933-
final StringJoiner joiner = newStringJoiner(delimiter);
3933+
final StringBuilder stringBuilder = new StringBuilder(array.length * 5 + array.length - 1);
39343934
for (int i = startIndex; i < endIndex; i++) {
3935-
joiner.add(String.valueOf(array[i]));
3935+
stringBuilder
3936+
.append(array[i])
3937+
.append(delimiter);
39363938
}
3937-
return joiner.toString();
3939+
return stringBuilder.substring(0, stringBuilder.length() - 1);
39383940
}
39393941

39403942
/**
@@ -4007,11 +4009,13 @@ public static String join(final byte[] array, final char delimiter, final int st
40074009
if (endIndex - startIndex <= 0) {
40084010
return EMPTY;
40094011
}
4010-
final StringJoiner joiner = newStringJoiner(delimiter);
4012+
final StringBuilder stringBuilder = new StringBuilder();
40114013
for (int i = startIndex; i < endIndex; i++) {
4012-
joiner.add(String.valueOf(array[i]));
4014+
stringBuilder
4015+
.append(array[i])
4016+
.append(delimiter);
40134017
}
4014-
return joiner.toString();
4018+
return stringBuilder.substring(0, stringBuilder.length() - 1);
40154019
}
40164020

40174021
/**
@@ -4084,11 +4088,13 @@ public static String join(final char[] array, final char delimiter, final int st
40844088
if (endIndex - startIndex <= 0) {
40854089
return EMPTY;
40864090
}
4087-
final StringJoiner joiner = newStringJoiner(delimiter);
4091+
final StringBuilder stringBuilder = new StringBuilder(array.length * 2 - 1);
40884092
for (int i = startIndex; i < endIndex; i++) {
4089-
joiner.add(String.valueOf(array[i]));
4093+
stringBuilder
4094+
.append(array[i])
4095+
.append(delimiter);
40904096
}
4091-
return joiner.toString();
4097+
return stringBuilder.substring(0, stringBuilder.length() - 1);
40924098
}
40934099

40944100
/**
@@ -4161,11 +4167,13 @@ public static String join(final double[] array, final char delimiter, final int
41614167
if (endIndex - startIndex <= 0) {
41624168
return EMPTY;
41634169
}
4164-
final StringJoiner joiner = newStringJoiner(delimiter);
4170+
final StringBuilder stringBuilder = new StringBuilder();
41654171
for (int i = startIndex; i < endIndex; i++) {
4166-
joiner.add(String.valueOf(array[i]));
4172+
stringBuilder
4173+
.append(array[i])
4174+
.append(delimiter);
41674175
}
4168-
return joiner.toString();
4176+
return stringBuilder.substring(0, stringBuilder.length() - 1);
41694177
}
41704178

41714179
/**
@@ -4238,11 +4246,13 @@ public static String join(final float[] array, final char delimiter, final int s
42384246
if (endIndex - startIndex <= 0) {
42394247
return EMPTY;
42404248
}
4241-
final StringJoiner joiner = newStringJoiner(delimiter);
4249+
final StringBuilder stringBuilder = new StringBuilder();
42424250
for (int i = startIndex; i < endIndex; i++) {
4243-
joiner.add(String.valueOf(array[i]));
4251+
stringBuilder
4252+
.append(array[i])
4253+
.append(delimiter);
42444254
}
4245-
return joiner.toString();
4255+
return stringBuilder.substring(0, stringBuilder.length() - 1);
42464256
}
42474257

42484258
/**
@@ -4315,11 +4325,13 @@ public static String join(final int[] array, final char delimiter, final int sta
43154325
if (endIndex - startIndex <= 0) {
43164326
return EMPTY;
43174327
}
4318-
final StringJoiner joiner = newStringJoiner(delimiter);
4328+
final StringBuilder stringBuilder = new StringBuilder();
43194329
for (int i = startIndex; i < endIndex; i++) {
4320-
joiner.add(String.valueOf(array[i]));
4330+
stringBuilder
4331+
.append(array[i])
4332+
.append(delimiter);
43214333
}
4322-
return joiner.toString();
4334+
return stringBuilder.substring(0, stringBuilder.length() - 1);
43234335
}
43244336

43254337
/**
@@ -4601,11 +4613,13 @@ public static String join(final long[] array, final char delimiter, final int st
46014613
if (endIndex - startIndex <= 0) {
46024614
return EMPTY;
46034615
}
4604-
final StringJoiner joiner = newStringJoiner(delimiter);
4616+
final StringBuilder stringBuilder = new StringBuilder();
46054617
for (int i = startIndex; i < endIndex; i++) {
4606-
joiner.add(String.valueOf(array[i]));
4618+
stringBuilder
4619+
.append(array[i])
4620+
.append(delimiter);
46074621
}
4608-
return joiner.toString();
4622+
return stringBuilder.substring(0, stringBuilder.length() - 1);
46094623
}
46104624

46114625
/**
@@ -4664,17 +4678,7 @@ public static String join(final Object[] array, final char delimiter) {
46644678
* @since 2.0
46654679
*/
46664680
public static String join(final Object[] array, final char delimiter, final int startIndex, final int endIndex) {
4667-
if (array == null) {
4668-
return null;
4669-
}
4670-
if (endIndex - startIndex <= 0) {
4671-
return EMPTY;
4672-
}
4673-
final StringJoiner joiner = newStringJoiner(delimiter);
4674-
for (int i = startIndex; i < endIndex; i++) {
4675-
joiner.add(toStringOrEmpty(array[i]));
4676-
}
4677-
return joiner.toString();
4681+
return join(array, String.valueOf(delimiter), startIndex, endIndex);
46784682
}
46794683

46804684
/**
@@ -4826,11 +4830,13 @@ public static String join(final short[] array, final char delimiter, final int s
48264830
if (endIndex - startIndex <= 0) {
48274831
return EMPTY;
48284832
}
4829-
final StringJoiner joiner = newStringJoiner(delimiter);
4833+
final StringBuilder stringBuilder = new StringBuilder();
48304834
for (int i = startIndex; i < endIndex; i++) {
4831-
joiner.add(String.valueOf(array[i]));
4835+
stringBuilder
4836+
.append(array[i])
4837+
.append(delimiter);
48324838
}
4833-
return joiner.toString();
4839+
return stringBuilder.substring(0, stringBuilder.length() - 1);
48344840
}
48354841

48364842
/**
@@ -5522,10 +5528,6 @@ public static String mid(final String str, int pos, final int len) {
55225528
return str.substring(pos, pos + len);
55235529
}
55245530

5525-
private static StringJoiner newStringJoiner(final char delimiter) {
5526-
return new StringJoiner(String.valueOf(delimiter));
5527-
}
5528-
55295531
/**
55305532
* <p>
55315533
* Similar to <a

0 commit comments

Comments
 (0)