diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/CountQuery.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/CountQuery.java index debfb78e5..339155f57 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/CountQuery.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/CountQuery.java @@ -176,16 +176,20 @@ class CountQuery { Document $geoWithinMin = new Document("$geoWithin", new Document(spheric ? "$centerSphere" : "$center", $centerMin)); - List criteria = new ArrayList<>(); + List criteria; if ($and != null) { if ($and instanceof Collection) { - criteria.addAll((Collection) $and); + Collection andElements = (Collection) $and; + criteria = new ArrayList<>(andElements.size() + 2); + criteria.addAll(andElements); } else { throw new IllegalArgumentException( "Cannot rewrite query as it contains an '$and' element that is not a Collection!: Offending element: " + $and); } + } else { + criteria = new ArrayList<>(2); } criteria.add(new Document("$nor", Collections.singletonList(new Document(key, $geoWithinMin)))); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/DefaultIndexOperations.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/DefaultIndexOperations.java index 958d838cd..1b006a10d 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/DefaultIndexOperations.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/DefaultIndexOperations.java @@ -188,7 +188,8 @@ public class DefaultIndexOperations implements IndexOperations { private List getIndexData(MongoCursor cursor) { - List indexInfoList = new ArrayList<>(); + int available = cursor.available(); + List indexInfoList = available > 0 ? new ArrayList<>(available) : new ArrayList<>(); while (cursor.hasNext()) { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java index 30b4bbcd7..b8cf40a5b 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java @@ -987,7 +987,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware, DocumentCallback> callback = new GeoNearResultDocumentCallback<>(distanceField, new ProjectingReadCallback<>(mongoConverter, domainType, returnType, collection), near.getMetric()); - List> result = new ArrayList<>(); + List> result = new ArrayList<>(results.getMappedResults().size()); BigDecimal aggregate = BigDecimal.ZERO; for (Document element : results) { @@ -1345,7 +1345,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware, Assert.notNull(writer, "MongoWriter must not be null!"); - List documentList = new ArrayList<>(); + List documentList = new ArrayList<>(batchToSave.size()); List initializedBatchToSave = new ArrayList<>(batchToSave.size()); for (T uninitialized : batchToSave) { @@ -2852,7 +2852,8 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware, .initiateFind(getAndPrepareCollection(doGetDatabase(), collectionName), collectionCallback::doInCollection) .iterator()) { - List result = new ArrayList<>(); + int available = cursor.available(); + List result = available > 0 ? new ArrayList<>(available) : new ArrayList<>(); while (cursor.hasNext()) { Document object = cursor.next(); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java index a9b60450d..f45bd016e 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/ReactiveMongoTemplate.java @@ -1632,7 +1632,7 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati LOGGER.debug("Inserting list of Documents containing " + dbDocList.size() + " items"); } - List documents = new ArrayList<>(); + List documents = new ArrayList<>(dbDocList.size()); return execute(collectionName, collection -> { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ConditionalOperators.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ConditionalOperators.java index c4af12d3e..937277cee 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ConditionalOperators.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ConditionalOperators.java @@ -675,10 +675,7 @@ public class ConditionalOperators { if (value instanceof CriteriaDefinition) { Document mappedObject = context.getMappedObject(((CriteriaDefinition) value).getCriteriaObject()); - List clauses = new ArrayList(); - - clauses.addAll(getClauses(context, mappedObject)); - + List clauses = getClauses(context, mappedObject); return clauses.size() == 1 ? clauses.get(0) : clauses; } @@ -705,7 +702,9 @@ public class ConditionalOperators { if (predicate instanceof List) { - List args = new ArrayList(); + List predicates = (List) predicate; + List args = new ArrayList(predicates.size()); + for (Object clause : (List) predicate) { if (clause instanceof Document) { args.addAll(getClauses(context, (Document) clause)); @@ -723,14 +722,14 @@ public class ConditionalOperators { continue; } - List args = new ArrayList(); + List args = new ArrayList(2); args.add("$" + key); args.add(nested.get(s)); clauses.add(new Document(s, args)); } } else if (!isKeyword(key)) { - List args = new ArrayList(); + List args = new ArrayList(2); args.add("$" + key); args.add(predicate); clauses.add(new Document("$eq", args)); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFields.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFields.java index daba25f42..ead0547bb 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFields.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/ExposedFields.java @@ -110,7 +110,7 @@ public final class ExposedFields implements Iterable { private static ExposedFields createFields(Fields fields, boolean synthetic) { Assert.notNull(fields, "Fields must not be null!"); - List result = new ArrayList(); + List result = new ArrayList(fields.size()); for (Field field : fields) { result.add(new ExposedField(field, synthetic)); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Fields.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Fields.java index 3151ccbd0..43cf7c948 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Fields.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/Fields.java @@ -167,6 +167,10 @@ public final class Fields implements Iterable { return result; } + public int size() { + return fields.size(); + } + @Nullable public Field getField(String name) { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/GeoNearOperation.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/GeoNearOperation.java index da5eae8e9..949f4533b 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/GeoNearOperation.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/aggregation/GeoNearOperation.java @@ -126,7 +126,7 @@ public class GeoNearOperation implements AggregationOperation { Document command = toDocument(context); Number limit = (Number) command.get("$geoNear", Document.class).remove("num"); - List stages = new ArrayList<>(); + List stages = new ArrayList<>(3); stages.add(command); if (nearQuery.getSkip() != null && nearQuery.getSkip() > 0) { diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/DefaultDbRefResolver.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/DefaultDbRefResolver.java index 1706919a4..e5c4bd0e7 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/DefaultDbRefResolver.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/DefaultDbRefResolver.java @@ -138,7 +138,7 @@ public class DefaultDbRefResolver extends DefaultReferenceResolver implements Db List result = mongoCollection // .find(new Document(BasicMongoPersistentProperty.ID_FIELD_NAME, new Document("$in", ids))) // - .into(new ArrayList<>()); + .into(new ArrayList<>(ids.size())); return ids.stream() // .flatMap(id -> documentWithId(id, result)) // diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/GeoConverters.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/GeoConverters.java index a9126af14..ac3a883c3 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/GeoConverters.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/GeoConverters.java @@ -462,7 +462,7 @@ abstract class GeoConverters { return null; } - List argument = new ArrayList<>(); + List argument = new ArrayList<>(2); Shape shape = source.getShape(); @@ -482,7 +482,9 @@ abstract class GeoConverters { } else if (shape instanceof Polygon) { - for (Point point : ((Polygon) shape).getPoints()) { + List points = ((Polygon) shape).getPoints(); + argument = new ArrayList(points.size()); + for (Point point : points) { argument.add(toList(point)); } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java index 67f367c03..74a2d662c 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java @@ -886,14 +886,14 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App }).collect(Collectors.toList()); return writeCollectionInternal(targetCollection, ClassTypeInformation.from(DocumentPointer.class), - new ArrayList<>()); + new ArrayList<>(targetCollection.size())); } if (property.hasExplicitWriteTarget()) { - return writeCollectionInternal(collection, new FieldTypeInformation<>(property), new ArrayList<>()); + return writeCollectionInternal(collection, new FieldTypeInformation<>(property), new ArrayList<>(collection.size())); } - return writeCollectionInternal(collection, property.getTypeInformation(), new ArrayList<>()); + return writeCollectionInternal(collection, property.getTypeInformation(), new ArrayList<>(collection.size())); } List dbList = new ArrayList<>(collection.size()); @@ -978,7 +978,9 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App collection.add(getPotentiallyConvertedSimpleWrite(element, componentType != null ? componentType.getType() : Object.class)); } else if (element instanceof Collection || elementType.isArray()) { - collection.add(writeCollectionInternal(BsonUtils.asCollection(element), componentType, new ArrayList<>())); + + Collection objects = BsonUtils.asCollection(element); + collection.add(writeCollectionInternal(objects, componentType, new ArrayList<>(objects.size()))); } else { Document document = new Document(); writeInternal(element, document, componentType); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java index d8245a7c5..c1706614f 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java @@ -363,7 +363,7 @@ public class QueryMapper { if (keyword.isOrOrNor() || (keyword.hasIterableValue() && !keyword.isGeometry())) { Iterable conditions = keyword.getValue(); - List newConditions = new ArrayList<>(); + List newConditions = conditions instanceof Collection ? new ArrayList<>(((Collection) conditions).size()) : new ArrayList<>(); for (Object condition : conditions) { newConditions.add(isDocument(condition) ? getMappedObject((Document) condition, entity) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java index d1ea834d9..a08c5f6e2 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/query/Criteria.java @@ -337,7 +337,7 @@ public class Criteria implements CriteriaDefinition { * @see MongoDB Query operator: $mod */ public Criteria mod(Number value, Number remainder) { - List l = new ArrayList(); + List l = new ArrayList(2); l.add(value); l.add(remainder); criteria.put("$mod", l); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessor.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessor.java index 064b98a69..8760cd52a 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessor.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ConvertingParameterAccessor.java @@ -223,8 +223,10 @@ public class ConvertingParameterAccessor implements MongoParameterAccessor { if (property.isAssociation()) { if (next.getClass().isArray() || next instanceof Iterable) { - List dbRefs = new ArrayList(); - for (Object element : asCollection(next)) { + Collection values = asCollection(next); + + List dbRefs = new ArrayList(values.size()); + for (Object element : values) { dbRefs.add(writer.toDBRef(element, property)); } @@ -258,11 +260,14 @@ public class ConvertingParameterAccessor implements MongoParameterAccessor { if (source instanceof Iterable) { - List result = new ArrayList(); + if(source instanceof Collection) { + return new ArrayList<>((Collection) source); + } + + List result = new ArrayList<>(); for (Object element : (Iterable) source) { result.add(element); } - return result; }