diff --git a/src/main/java/com/fasterxml/jackson/core/util/JsonParserSequence.java b/src/main/java/com/fasterxml/jackson/core/util/JsonParserSequence.java index 5ea25ca6a0..0081ececc8 100644 --- a/src/main/java/com/fasterxml/jackson/core/util/JsonParserSequence.java +++ b/src/main/java/com/fasterxml/jackson/core/util/JsonParserSequence.java @@ -93,17 +93,9 @@ public static JsonParserSequence createFlattened(boolean checkForExistingToken, return new JsonParserSequence(checkForExistingToken, new JsonParser[] { first, second }); } - ArrayList p = new ArrayList<>(); - if (first instanceof JsonParserSequence) { - ((JsonParserSequence) first).addFlattenedActiveParsers(p); - } else { - p.add(first); - } - if (second instanceof JsonParserSequence) { - ((JsonParserSequence) second).addFlattenedActiveParsers(p); - } else { - p.add(second); - } + ArrayList p = new ArrayList<>(8); + flattenParsers(first, p); + flattenParsers(second, p); return new JsonParserSequence(checkForExistingToken, p.toArray(new JsonParser[p.size()])); } @@ -116,13 +108,26 @@ public static JsonParserSequence createFlattened(JsonParser first, JsonParser se @SuppressWarnings("resource") protected void addFlattenedActiveParsers(List listToAddIn) { - for (int i = _nextParserIndex-1, len = _parsers.length; i < len; ++i) { - JsonParser p = _parsers[i]; - if (p instanceof JsonParserSequence) { - ((JsonParserSequence) p).addFlattenedActiveParsers(listToAddIn); - } else { - listToAddIn.add(p); - } + int i = _nextParserIndex-1; + int len = _parsers.length; + expandToAdd(listToAddIn, len - i); + for (; i < len; ++i) { + flattenParsers(_parsers[i], listToAddIn); + } + } + + private static void flattenParsers(JsonParser parser, List p) { + if (parser instanceof JsonParserSequence) { + ((JsonParserSequence) parser).addFlattenedActiveParsers(p); + } else { + p.add(parser); + } + } + + private static void expandToAdd(List list, int additionalCapacity) { + if (additionalCapacity > 0 && list instanceof ArrayList) { + int newCapacity = list.size() + additionalCapacity; + ((ArrayList) list).ensureCapacity(newCapacity); } }