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 6a1851693..553ecc94b 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 63b30aae9..30578b2db 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 @@ -172,7 +172,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 7fa2d0f1a..138fb661f 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 @@ -945,7 +945,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware, DocumentCallback> callback = new GeoNearResultDocumentCallback<>(distanceField, new ProjectingReadCallback<>(mongoConverter, projection, collection), near.getMetric()); - List> result = new ArrayList<>(); + List> result = new ArrayList<>(results.getMappedResults().size()); BigDecimal aggregate = BigDecimal.ZERO; for (Document element : results) { @@ -1311,7 +1311,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) { @@ -2717,7 +2717,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 d867fb616..6489e6783 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 @@ -1474,7 +1474,7 @@ public class ReactiveMongoTemplate implements ReactiveMongoOperations, Applicati LOGGER.debug(String.format("Inserting list of Documents containing %d items", dbDocList.size())); } - 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 6b1f1044d..8c6a05ab4 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 @@ -649,10 +649,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; } @@ -679,7 +676,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)); @@ -697,14 +696,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 858fb67fa..8955b765e 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 00b8f2a90..6478e3ec8 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 208541761..df9ef4ff8 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 @@ -114,7 +114,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 a0f1b7c75..5843b27fc 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 @@ -126,7 +126,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 b8606d8d9..564fcba19 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 @@ -418,7 +418,7 @@ abstract class GeoConverters { return null; } - List argument = new ArrayList<>(); + List argument = new ArrayList<>(2); Shape shape = source.getShape(); @@ -438,7 +438,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 fa0175adf..0f323d8ab 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 @@ -1000,14 +1000,14 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App .getPointer(); }).collect(Collectors.toList()); - return writeCollectionInternal(targetCollection, TypeInformation.of(DocumentPointer.class), new ArrayList<>()); + return writeCollectionInternal(targetCollection, TypeInformation.of(DocumentPointer.class), 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()); @@ -1092,7 +1092,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 272670122..5af1f9fe9 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 @@ -373,7 +373,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 e9512a32d..82d0080d1 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 f246973ee..f77c07959 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 @@ -165,8 +165,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)); } @@ -196,11 +198,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; }