It certainly is not obvious from looking at the JRE method that calling toArray this way is faster... some // comments would be nice.
Gary On Thu, Dec 26, 2019 at 7:25 PM sebb <seb...@gmail.com> wrote: > Also, where is it documented that modern JVMs are faster? > To which JVMs does this apply? > > S. > > On Thu, 26 Dec 2019 at 22:08, Gary Gregory <garydgreg...@gmail.com> wrote: > > > Please do not cause garbage to apparently be generated all over the place > > by creating new empty arrays all the time. Use the constants Commons Lang > > constants already defines; see ArrayUtils. > > > > Gary > > > > On Thu, Dec 26, 2019 at 4:48 PM <pascalschumac...@apache.org> wrote: > > > > > This is an automated email from the ASF dual-hosted git repository. > > > > > > pascalschumacher pushed a commit to branch master > > > in repository https://gitbox.apache.org/repos/asf/commons-lang.git > > > > > > > > > The following commit(s) were added to refs/heads/master by this push: > > > new 84668a2 Use Collection#toArray(new T[0]) instead of a > presized > > > array as it is faster on modern JVMs. > > > 84668a2 is described below > > > > > > commit 84668a2d980316a580030fd64764cb072b520b09 > > > Author: pascalschumacher <pascalschumac...@gmx.net> > > > AuthorDate: Thu Dec 26 22:48:12 2019 +0100 > > > > > > Use Collection#toArray(new T[0]) instead of a presized array as it > is > > > faster on modern JVMs. > > > --- > > > src/main/java/org/apache/commons/lang3/CharSet.java | 2 +- > > > src/main/java/org/apache/commons/lang3/StringUtils.java | 10 > > > +++++----- > > > .../org/apache/commons/lang3/exception/ExceptionUtils.java | 6 > > +++--- > > > src/main/java/org/apache/commons/lang3/reflect/FieldUtils.java | 4 > ++-- > > > .../java/org/apache/commons/lang3/reflect/MethodUtils.java | 2 +- > > > src/main/java/org/apache/commons/lang3/reflect/TypeUtils.java | 2 +- > > > src/main/java/org/apache/commons/lang3/text/StrTokenizer.java | 4 > ++-- > > > .../org/apache/commons/lang3/time/DurationFormatUtils.java | 2 +- > > > .../java/org/apache/commons/lang3/time/FastDatePrinter.java | 2 +- > > > .../commons/lang3/concurrent/EventCountCircuitBreakerTest.java | 2 +- > > > 10 files changed, 18 insertions(+), 18 deletions(-) > > > > > > diff --git a/src/main/java/org/apache/commons/lang3/CharSet.java > > > b/src/main/java/org/apache/commons/lang3/CharSet.java > > > index 3fdfd07..7955115 100644 > > > --- a/src/main/java/org/apache/commons/lang3/CharSet.java > > > +++ b/src/main/java/org/apache/commons/lang3/CharSet.java > > > @@ -225,7 +225,7 @@ public class CharSet implements Serializable { > > > // NOTE: This is no longer public as CharRange is no longer a public > > > class. > > > // It may be replaced when CharSet moves to Range. > > > /*public*/ CharRange[] getCharRanges() { > > > - return set.toArray(new CharRange[set.size()]); > > > + return set.toArray(new CharRange[0]); > > > } > > > > > > > > > > > //----------------------------------------------------------------------- > > > diff --git a/src/main/java/org/apache/commons/lang3/StringUtils.java > > > b/src/main/java/org/apache/commons/lang3/StringUtils.java > > > index abde7ec..d629806 100644 > > > --- a/src/main/java/org/apache/commons/lang3/StringUtils.java > > > +++ b/src/main/java/org/apache/commons/lang3/StringUtils.java > > > @@ -7507,7 +7507,7 @@ public class StringUtils { > > > currentType = type; > > > } > > > list.add(new String(c, tokenStart, c.length - tokenStart)); > > > - return list.toArray(new String[list.size()]); > > > + return list.toArray(new String[0]); > > > } > > > > > > /** > > > @@ -7735,7 +7735,7 @@ public class StringUtils { > > > } > > > } > > > > > > - return substrings.toArray(new String[substrings.size()]); > > > + return substrings.toArray(new String[0]); > > > } > > > > > > // > > > ----------------------------------------------------------------------- > > > @@ -7923,7 +7923,7 @@ public class StringUtils { > > > if (match || preserveAllTokens && lastMatch) { > > > list.add(str.substring(start, i)); > > > } > > > - return list.toArray(new String[list.size()]); > > > + return list.toArray(new String[0]); > > > } > > > > > > /** > > > @@ -8022,7 +8022,7 @@ public class StringUtils { > > > if (match || preserveAllTokens && lastMatch) { > > > list.add(str.substring(start, i)); > > > } > > > - return list.toArray(new String[list.size()]); > > > + return list.toArray(new String[0]); > > > } > > > > > > /** > > > @@ -8835,7 +8835,7 @@ public class StringUtils { > > > if (list.isEmpty()) { > > > return null; > > > } > > > - return list.toArray(new String[list.size()]); > > > + return list.toArray(new String[0]); > > > } > > > > > > /** > > > diff --git > > > a/src/main/java/org/apache/commons/lang3/exception/ExceptionUtils.java > > > b/src/main/java/org/apache/commons/lang3/exception/ExceptionUtils.java > > > index 5969614..dd154e3 100644 > > > --- > > a/src/main/java/org/apache/commons/lang3/exception/ExceptionUtils.java > > > +++ > > b/src/main/java/org/apache/commons/lang3/exception/ExceptionUtils.java > > > @@ -274,7 +274,7 @@ public class ExceptionUtils { > > > } > > > frames.addAll(trace); > > > } > > > - return frames.toArray(new String[frames.size()]); > > > + return frames.toArray(new String[0]); > > > } > > > > > > /** > > > @@ -325,7 +325,7 @@ public class ExceptionUtils { > > > while (frames.hasMoreTokens()) { > > > list.add(frames.nextToken()); > > > } > > > - return list.toArray(new String[list.size()]); > > > + return list.toArray(new String[0]); > > > } > > > > > > /** > > > @@ -438,7 +438,7 @@ public class ExceptionUtils { > > > */ > > > public static Throwable[] getThrowables(final Throwable > throwable) { > > > final List<Throwable> list = getThrowableList(throwable); > > > - return list.toArray(new Throwable[list.size()]); > > > + return list.toArray(new Throwable[0]); > > > } > > > > > > /** > > > diff --git > > > a/src/main/java/org/apache/commons/lang3/reflect/FieldUtils.java > > > b/src/main/java/org/apache/commons/lang3/reflect/FieldUtils.java > > > index d72dc53..553be4e 100644 > > > --- a/src/main/java/org/apache/commons/lang3/reflect/FieldUtils.java > > > +++ b/src/main/java/org/apache/commons/lang3/reflect/FieldUtils.java > > > @@ -199,7 +199,7 @@ public class FieldUtils { > > > */ > > > public static Field[] getAllFields(final Class<?> cls) { > > > final List<Field> allFieldsList = getAllFieldsList(cls); > > > - return allFieldsList.toArray(new Field[allFieldsList.size()]); > > > + return allFieldsList.toArray(new Field[0]); > > > } > > > > > > /** > > > @@ -237,7 +237,7 @@ public class FieldUtils { > > > */ > > > public static Field[] getFieldsWithAnnotation(final Class<?> cls, > > > final Class<? extends Annotation> annotationCls) { > > > final List<Field> annotatedFieldsList = > > > getFieldsListWithAnnotation(cls, annotationCls); > > > - return annotatedFieldsList.toArray(new > > > Field[annotatedFieldsList.size()]); > > > + return annotatedFieldsList.toArray(new Field[0]); > > > } > > > > > > /** > > > diff --git > > > a/src/main/java/org/apache/commons/lang3/reflect/MethodUtils.java > > > b/src/main/java/org/apache/commons/lang3/reflect/MethodUtils.java > > > index bbd5019..491470d 100644 > > > --- a/src/main/java/org/apache/commons/lang3/reflect/MethodUtils.java > > > +++ b/src/main/java/org/apache/commons/lang3/reflect/MethodUtils.java > > > @@ -878,7 +878,7 @@ public class MethodUtils { > > > final boolean > > > searchSupers, final boolean ignoreAccess) { > > > final List<Method> annotatedMethodsList = > > > getMethodsListWithAnnotation(cls, annotationCls, searchSupers, > > > ignoreAccess); > > > - return annotatedMethodsList.toArray(new > > > Method[annotatedMethodsList.size()]); > > > + return annotatedMethodsList.toArray(new Method[0]); > > > } > > > > > > /** > > > diff --git > > a/src/main/java/org/apache/commons/lang3/reflect/TypeUtils.java > > > b/src/main/java/org/apache/commons/lang3/reflect/TypeUtils.java > > > index 2a6ccd0..f9df8c6 100644 > > > --- a/src/main/java/org/apache/commons/lang3/reflect/TypeUtils.java > > > +++ b/src/main/java/org/apache/commons/lang3/reflect/TypeUtils.java > > > @@ -1149,7 +1149,7 @@ public class TypeUtils { > > > } > > > } > > > > > > - return types.toArray(new Type[types.size()]); > > > + return types.toArray(new Type[0]); > > > } > > > > > > /** > > > diff --git > > a/src/main/java/org/apache/commons/lang3/text/StrTokenizer.java > > > b/src/main/java/org/apache/commons/lang3/text/StrTokenizer.java > > > index c9ab666..97fae7d 100644 > > > --- a/src/main/java/org/apache/commons/lang3/text/StrTokenizer.java > > > +++ b/src/main/java/org/apache/commons/lang3/text/StrTokenizer.java > > > @@ -604,10 +604,10 @@ public class StrTokenizer implements > > > ListIterator<String>, Cloneable { > > > if (chars == null) { > > > // still call tokenize as subclass may do some work > > > final List<String> split = tokenize(null, 0, 0); > > > - tokens = split.toArray(new String[split.size()]); > > > + tokens = split.toArray(new String[0]); > > > } else { > > > final List<String> split = tokenize(chars, 0, > > > chars.length); > > > - tokens = split.toArray(new String[split.size()]); > > > + tokens = split.toArray(new String[0]); > > > } > > > } > > > } > > > diff --git > > > a/src/main/java/org/apache/commons/lang3/time/DurationFormatUtils.java > > > b/src/main/java/org/apache/commons/lang3/time/DurationFormatUtils.java > > > index 83af2e0..4a75237 100644 > > > --- > > a/src/main/java/org/apache/commons/lang3/time/DurationFormatUtils.java > > > +++ > > b/src/main/java/org/apache/commons/lang3/time/DurationFormatUtils.java > > > @@ -564,7 +564,7 @@ public class DurationFormatUtils { > > > if (inLiteral) { // i.e. we have not found the end of the > > literal > > > throw new IllegalArgumentException("Unmatched quote in > > > format: " + format); > > > } > > > - return list.toArray(new Token[list.size()]); > > > + return list.toArray(new Token[0]); > > > } > > > > > > > > > > > //----------------------------------------------------------------------- > > > diff --git > > > a/src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java > > > b/src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java > > > index a5edb28..888d3fb 100644 > > > --- a/src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java > > > +++ b/src/main/java/org/apache/commons/lang3/time/FastDatePrinter.java > > > @@ -160,7 +160,7 @@ public class FastDatePrinter implements > DatePrinter, > > > Serializable { > > > */ > > > private void init() { > > > final List<Rule> rulesList = parsePattern(); > > > - mRules = rulesList.toArray(new Rule[rulesList.size()]); > > > + mRules = rulesList.toArray(new Rule[0]); > > > > > > int len = 0; > > > for (int i=mRules.length; --i >= 0; ) { > > > diff --git > > > > > > a/src/test/java/org/apache/commons/lang3/concurrent/EventCountCircuitBreakerTest.java > > > > > > b/src/test/java/org/apache/commons/lang3/concurrent/EventCountCircuitBreakerTest.java > > > index b3fb5cf..2819006 100644 > > > --- > > > > > > a/src/test/java/org/apache/commons/lang3/concurrent/EventCountCircuitBreakerTest.java > > > +++ > > > > > > b/src/test/java/org/apache/commons/lang3/concurrent/EventCountCircuitBreakerTest.java > > > @@ -407,7 +407,7 @@ public class EventCountCircuitBreakerTest { > > > */ > > > public void verify(final Boolean... values) { > > > assertArrayEquals(values, > > > - changedValues.toArray(new > > > Boolean[changedValues.size()])); > > > + changedValues.toArray(new Boolean[0])); > > > } > > > } > > > } > > > > > > > > >