You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by kr...@apache.org on 2023/03/23 21:37:25 UTC

[solr] branch main updated: SOLR-16715: Replace new HashMap(int) and new HashSet(int) with CollectionUtil.newHashMap / CollectionUtil.newHashSet (#1482)

This is an automated email from the ASF dual-hosted git repository.

krisden pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/main by this push:
     new 2375aa61679 SOLR-16715: Replace new HashMap(int) and new HashSet(int) with CollectionUtil.newHashMap / CollectionUtil.newHashSet (#1482)
2375aa61679 is described below

commit 2375aa61679ee4c8e3b715e4168e8fb473ebb733
Author: Kevin Risden <ri...@users.noreply.github.com>
AuthorDate: Thu Mar 23 17:37:18 2023 -0400

    SOLR-16715: Replace new HashMap(int) and new HashSet(int) with CollectionUtil.newHashMap / CollectionUtil.newHashSet (#1482)
---
 gradle/validation/forbidden-apis/java.solr.txt     |  9 +++++
 solr/CHANGES.txt                                   |  2 ++
 .../src/java/org/apache/solr/bench/Docs.java       |  5 +--
 .../apache/solr/api/ContainerPluginsRegistry.java  |  5 +--
 .../cloud/api/collections/OverseerRoleCmd.java     |  4 +--
 .../solr/cloud/api/collections/RestoreCmd.java     |  4 +--
 .../solr/cloud/overseer/ClusterStateMutator.java   |  3 +-
 .../apache/solr/cloud/overseer/ReplicaMutator.java |  3 +-
 .../placement/plugins/RandomPlacementFactory.java  |  4 +--
 .../placement/plugins/SimplePlacementFactory.java  |  4 +--
 .../solr/core/TransientSolrCoreCacheDefault.java   |  4 +--
 .../org/apache/solr/handler/ExportHandler.java     |  4 +--
 .../apache/solr/handler/MoreLikeThisHandler.java   |  4 +--
 .../apache/solr/handler/RequestHandlerUtils.java   |  4 +--
 .../apache/solr/handler/UpdateRequestHandler.java  |  3 +-
 .../solr/handler/admin/ZookeeperInfoHandler.java   |  5 +--
 .../solr/handler/component/FacetComponent.java     |  3 +-
 .../solr/handler/component/PivotFacetValue.java    |  3 +-
 .../handler/component/QueryElevationComponent.java |  6 ++--
 .../handler/component/RealTimeGetComponent.java    |  3 +-
 .../solr/handler/component/TermsComponent.java     |  5 +--
 .../org/apache/solr/handler/loader/XMLLoader.java  |  8 ++---
 .../org/apache/solr/handler/tagger/Tagger.java     |  4 +--
 .../solr/handler/tagger/TaggerRequestHandler.java  |  4 +--
 .../solr/highlight/DefaultSolrHighlighter.java     |  6 ++--
 .../packagemanager/DefaultPackageRepository.java   |  4 +--
 .../java/org/apache/solr/request/SimpleFacets.java |  4 +--
 .../apache/solr/request/macro/MacroExpander.java   |  4 +--
 .../java/org/apache/solr/schema/CurrencyField.java |  3 +-
 .../org/apache/solr/schema/ManagedIndexSchema.java |  3 +-
 .../java/org/apache/solr/search/CacheConfig.java   |  5 +--
 .../apache/solr/search/ExtendedDismaxQParser.java  |  6 ++--
 .../org/apache/solr/search/SolrIndexSearcher.java  |  4 +--
 .../org/apache/solr/search/facet/FacetBucket.java  |  7 ++--
 .../apache/solr/search/facet/FacetFieldMerger.java |  4 +--
 .../org/apache/solr/search/facet/FacetModule.java  |  4 +--
 .../apache/solr/search/facet/FacetRangeMerger.java |  4 +--
 .../search/facet/FacetRequestSortedMerger.java     |  4 +--
 .../org/apache/solr/search/facet/LegacyFacet.java  | 11 +++---
 .../org/apache/solr/search/facet/UniqueAgg.java    |  5 ++-
 .../SearchGroupsResultTransformer.java             |  5 +--
 .../apache/solr/search/join/ScoreModeParser.java   |  4 +--
 .../solr/search/mlt/MLTContentQParserPlugin.java   |  4 +--
 .../apache/solr/uninverting/FieldCacheImpl.java    | 13 ++++----
 .../org/apache/solr/update/TransactionLog.java     |  3 +-
 .../src/java/org/apache/solr/update/UpdateLog.java | 26 +++++++++++----
 .../processor/DistributedZkUpdateProcessor.java    |  5 +--
 .../java/org/apache/solr/util/DateMathParser.java  | 39 ++++++++++------------
 .../src/java/org/apache/solr/util/ExportTool.java  |  4 +--
 .../src/java/org/apache/solr/util/MapListener.java |  4 +--
 .../java/org/apache/solr/util/SolrPluginUtils.java |  5 +--
 .../stats/InstrumentedHttpListenerFactory.java     |  5 +--
 .../stats/InstrumentedHttpRequestExecutor.java     |  4 +--
 .../solr/hdfs/update/HdfsTransactionLog.java       |  4 +--
 .../org/apache/solr/client/solrj/io/Tuple.java     |  3 +-
 .../solr/client/solrj/io/stream/FacetStream.java   |  4 +--
 .../solr/client/solrj/io/stream/StatsStream.java   |  4 +--
 .../solr/client/solrj/impl/CloudSolrClient.java    |  4 ++-
 .../solrj/request/JavaBinUpdateRequestCodec.java   |  4 +--
 .../solr/client/solrj/request/UpdateRequest.java   |  6 ++--
 .../apache/solr/common/LinkedHashMapWriter.java    |  2 ++
 .../org/apache/solr/common/cloud/ClusterState.java | 10 +++---
 .../apache/solr/common/cloud/DocCollection.java    |  3 +-
 .../java/org/apache/solr/common/cloud/Slice.java   |  9 ++---
 .../common/util/ByteArrayUtf8CharSequence.java     |  3 +-
 .../apache/solr/common/util/CollectionUtil.java    | 15 +++++++--
 .../apache/solr/common/util/CommandOperation.java  |  2 +-
 .../solr/common/util/FastJavaBinDecoder.java       |  3 +-
 .../org/apache/solr/common/util/JavaBinCodec.java  |  6 ++--
 .../solr/common/util/JsonSchemaValidator.java      |  2 +-
 .../apache/solr/common/util/JsonTextWriter.java    |  3 +-
 .../java/org/apache/solr/common/util/Utils.java    |  4 +--
 .../apache/solr/common/util/ValidatingJsonMap.java |  2 +-
 .../apache/solr/BaseDistributedSearchTestCase.java |  8 ++---
 74 files changed, 222 insertions(+), 181 deletions(-)

diff --git a/gradle/validation/forbidden-apis/java.solr.txt b/gradle/validation/forbidden-apis/java.solr.txt
index 2ea1125fdbe..de195d51d93 100644
--- a/gradle/validation/forbidden-apis/java.solr.txt
+++ b/gradle/validation/forbidden-apis/java.solr.txt
@@ -18,3 +18,12 @@ java.lang.Thread#<init>()
 java.lang.Thread#<init>(java.lang.Runnable)
 java.lang.Thread#<init>(java.lang.ThreadGroup,java.lang.Runnable)
 
+@defaultMessage Use CollectionUtil.newHashMap(int)
+java.util.HashMap#<init>(int)
+
+@defaultMessage Use CollectionUtil.newLinkedHashMap(int)
+java.util.LinkedHashMap#<init>(int)
+
+@defaultMessage Use CollectionUtil.newHashSet(int)
+java.util.HashSet#<init>(int)
+
diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index c5b4edf224e..9ae2a93a339 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -91,6 +91,8 @@ Other Changes
 
 * SOLR-16716: Replace commons-io usages with pure Java (Kevin Risden)
 
+* SOLR-16715: Replace new HashMap(int) and new HashSet(int) with CollectionUtil.newHashMap / CollectionUtil.newHashSet (Kevin Risden)
+
 ==================  9.2.0 ==================
 
 New Features
diff --git a/solr/benchmark/src/java/org/apache/solr/bench/Docs.java b/solr/benchmark/src/java/org/apache/solr/bench/Docs.java
index 39efea9ec2f..cfaca270571 100644
--- a/solr/benchmark/src/java/org/apache/solr/bench/Docs.java
+++ b/solr/benchmark/src/java/org/apache/solr/bench/Docs.java
@@ -21,7 +21,6 @@ import static org.apache.solr.bench.BaseBenchState.log;
 import java.lang.invoke.MethodHandles;
 import java.util.Collections;
 import java.util.Date;
-import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Queue;
@@ -34,6 +33,7 @@ import org.apache.solr.bench.generators.MultiString;
 import org.apache.solr.bench.generators.SolrGen;
 import org.apache.solr.common.SolrDocument;
 import org.apache.solr.common.SolrInputDocument;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.SolrNamedThreadFactory;
 import org.apache.solr.common.util.SuppressForbidden;
 import org.quicktheories.core.Gen;
@@ -55,7 +55,8 @@ public class Docs {
   private final ThreadLocal<SolrRandomnessSource> random;
   private final Queue<SolrInputDocument> docs = new ConcurrentLinkedQueue<>();
 
-  private final Map<String, Gen<?>> fields = Collections.synchronizedMap(new HashMap<>(16));
+  private final Map<String, Gen<?>> fields =
+      Collections.synchronizedMap(CollectionUtil.newHashMap(16));
 
   private ExecutorService executorService;
   private int stringFields;
diff --git a/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java b/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java
index 2dd56ecc702..3bb7b97f73b 100644
--- a/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java
+++ b/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java
@@ -47,6 +47,7 @@ import org.apache.solr.common.MapWriter;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.annotation.JsonProperty;
 import org.apache.solr.common.cloud.ClusterPropertiesListener;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.IOUtils;
 import org.apache.solr.common.util.PathTrie;
 import org.apache.solr.common.util.ReflectMapWriter;
@@ -175,7 +176,7 @@ public class ContainerPluginsRegistry implements ClusterPropertiesListener, MapW
       log.error("Could not read plugins data", e);
       return;
     }
-    Map<String, PluginMetaHolder> newState = new HashMap<>(pluginInfos.size());
+    Map<String, PluginMetaHolder> newState = CollectionUtil.newHashMap(pluginInfos.size());
     for (Map.Entry<String, Object> e : pluginInfos.entrySet()) {
       try {
         newState.put(e.getKey(), new PluginMetaHolder((Map<String, Object>) e.getValue()));
@@ -482,7 +483,7 @@ public class ContainerPluginsRegistry implements ClusterPropertiesListener, MapW
 
   public static Map<String, Diff> compareMaps(Map<String, ?> a, Map<String, ?> b) {
     if (a.isEmpty() && b.isEmpty()) return null;
-    Map<String, Diff> result = new HashMap<>(Math.max(a.size(), b.size()));
+    Map<String, Diff> result = CollectionUtil.newHashMap(Math.max(a.size(), b.size()));
     a.forEach(
         (k, v) -> {
           Object newVal = b.get(k);
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/OverseerRoleCmd.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/OverseerRoleCmd.java
index 0d8d1be61e6..d8e7a3dea64 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/OverseerRoleCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/OverseerRoleCmd.java
@@ -22,7 +22,6 @@ import static org.apache.solr.common.params.CollectionParams.CollectionAction.RE
 
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
-import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import org.apache.solr.cloud.OverseerNodePrioritizer;
@@ -31,6 +30,7 @@ import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkNodeProps;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.params.CollectionParams.CollectionAction;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.Utils;
 import org.apache.zookeeper.CreateMode;
@@ -83,7 +83,7 @@ public class OverseerRoleCmd implements CollApiCmds.CollectionApiCommand {
               Utils.fromJSON(zkClient.getData(ZkStateReader.ROLES, null, new Stat(), true));
       roles = tmp;
     } else {
-      roles = new LinkedHashMap<>(1);
+      roles = CollectionUtil.newLinkedHashMap(1);
     }
 
     List<String> nodeList = roles.computeIfAbsent(roleName, k -> new ArrayList<>());
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/RestoreCmd.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/RestoreCmd.java
index 584a260e00d..11bff6e23d5 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/RestoreCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/RestoreCmd.java
@@ -38,7 +38,6 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -69,6 +68,7 @@ import org.apache.solr.common.params.CollectionAdminParams;
 import org.apache.solr.common.params.CollectionParams;
 import org.apache.solr.common.params.CoreAdminParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.common.util.StrUtils;
@@ -380,7 +380,7 @@ public class RestoreCmd implements CollApiCmds.CollectionApiCommand {
         // instead of a list of names, and if so uses this instead of building it. We clear the
         // replica list.
         Collection<Slice> backupSlices = backupCollectionState.getActiveSlices();
-        Map<String, Slice> newSlices = new LinkedHashMap<>(backupSlices.size());
+        Map<String, Slice> newSlices = CollectionUtil.newLinkedHashMap(backupSlices.size());
         for (Slice backupSlice : backupSlices) {
           newSlices.put(
               backupSlice.getName(),
diff --git a/solr/core/src/java/org/apache/solr/cloud/overseer/ClusterStateMutator.java b/solr/core/src/java/org/apache/solr/cloud/overseer/ClusterStateMutator.java
index f95959e33e5..a8faa27fbf8 100644
--- a/solr/core/src/java/org/apache/solr/cloud/overseer/ClusterStateMutator.java
+++ b/solr/core/src/java/org/apache/solr/cloud/overseer/ClusterStateMutator.java
@@ -40,6 +40,7 @@ import org.apache.solr.common.cloud.Slice.SliceStateProps;
 import org.apache.solr.common.cloud.ZkNodeProps;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.params.CollectionAdminParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -94,7 +95,7 @@ public class ClusterStateMutator {
       for (int i = 0; i < shardNames.size(); i++) {
         String sliceName = shardNames.get(i);
 
-        Map<String, Object> sliceProps = new LinkedHashMap<>(1);
+        Map<String, Object> sliceProps = CollectionUtil.newLinkedHashMap(1);
         sliceProps.put(SliceStateProps.RANGE, ranges == null ? null : ranges.get(i));
 
         slices.put(sliceName, new Slice(sliceName, null, sliceProps, cName));
diff --git a/solr/core/src/java/org/apache/solr/cloud/overseer/ReplicaMutator.java b/solr/core/src/java/org/apache/solr/cloud/overseer/ReplicaMutator.java
index 5254c9671f1..177bd81c81b 100644
--- a/solr/core/src/java/org/apache/solr/cloud/overseer/ReplicaMutator.java
+++ b/solr/core/src/java/org/apache/solr/cloud/overseer/ReplicaMutator.java
@@ -51,6 +51,7 @@ import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkNodeProps;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.params.CollectionAdminParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.util.TestInjection;
 import org.slf4j.Logger;
@@ -427,7 +428,7 @@ public class ReplicaMutator {
       sliceProps = slice.getProperties();
       replicas = slice.getReplicasCopy();
     } else {
-      replicas = new HashMap<>(1);
+      replicas = CollectionUtil.newHashMap(1);
       sliceProps = new HashMap<>();
       sliceProps.put(SliceStateProps.RANGE, shardRange);
       sliceProps.put(ZkStateReader.STATE_PROP, shardState);
diff --git a/solr/core/src/java/org/apache/solr/cluster/placement/plugins/RandomPlacementFactory.java b/solr/core/src/java/org/apache/solr/cluster/placement/plugins/RandomPlacementFactory.java
index 3c040f58e33..47f76a03a65 100644
--- a/solr/core/src/java/org/apache/solr/cluster/placement/plugins/RandomPlacementFactory.java
+++ b/solr/core/src/java/org/apache/solr/cluster/placement/plugins/RandomPlacementFactory.java
@@ -20,7 +20,6 @@ package org.apache.solr.cluster.placement.plugins;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Random;
 import java.util.Set;
@@ -35,6 +34,7 @@ import org.apache.solr.cluster.placement.PlacementPlugin;
 import org.apache.solr.cluster.placement.PlacementPluginFactory;
 import org.apache.solr.cluster.placement.PlacementRequest;
 import org.apache.solr.cluster.placement.ReplicaPlacement;
+import org.apache.solr.common.util.CollectionUtil;
 
 /**
  * Factory for creating {@link RandomPlacementPlugin}, a placement plugin implementing random
@@ -79,7 +79,7 @@ public class RandomPlacementFactory
         }
 
         Set<ReplicaPlacement> replicaPlacements =
-            new HashSet<>(totalReplicasPerShard * request.getShardNames().size());
+            CollectionUtil.newHashSet(totalReplicasPerShard * request.getShardNames().size());
 
         // Now place randomly all replicas of all shards on available nodes
         for (String shardName : request.getShardNames()) {
diff --git a/solr/core/src/java/org/apache/solr/cluster/placement/plugins/SimplePlacementFactory.java b/solr/core/src/java/org/apache/solr/cluster/placement/plugins/SimplePlacementFactory.java
index 9bb301795af..3242d25aa6c 100644
--- a/solr/core/src/java/org/apache/solr/cluster/placement/plugins/SimplePlacementFactory.java
+++ b/solr/core/src/java/org/apache/solr/cluster/placement/plugins/SimplePlacementFactory.java
@@ -21,7 +21,6 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Comparator;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -37,6 +36,7 @@ import org.apache.solr.cluster.placement.PlacementPlugin;
 import org.apache.solr.cluster.placement.PlacementPluginFactory;
 import org.apache.solr.cluster.placement.PlacementRequest;
 import org.apache.solr.cluster.placement.ReplicaPlacement;
+import org.apache.solr.common.util.CollectionUtil;
 
 /**
  * Factory for creating {@link SimplePlacementPlugin}, a placement plugin implementing the logic
@@ -67,7 +67,7 @@ public class SimplePlacementFactory
         }
 
         Set<ReplicaPlacement> replicaPlacements =
-            new HashSet<>(totalReplicasPerShard * request.getShardNames().size());
+            CollectionUtil.newHashSet(totalReplicasPerShard * request.getShardNames().size());
 
         Collection<ReplicaCount> replicaCounts = nodeVsShardCount.values();
 
diff --git a/solr/core/src/java/org/apache/solr/core/TransientSolrCoreCacheDefault.java b/solr/core/src/java/org/apache/solr/core/TransientSolrCoreCacheDefault.java
index 2c5ee34e9e7..c3c1ac0b620 100644
--- a/solr/core/src/java/org/apache/solr/core/TransientSolrCoreCacheDefault.java
+++ b/solr/core/src/java/org/apache/solr/core/TransientSolrCoreCacheDefault.java
@@ -22,9 +22,9 @@ import com.github.benmanes.caffeine.cache.Caffeine;
 import java.lang.invoke.MethodHandles;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Set;
+import org.apache.solr.common.util.CollectionUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -82,7 +82,7 @@ public class TransientSolrCoreCacheDefault extends TransientSolrCoreCache {
     }
     transientCores = transientCoresCacheBuilder.build();
 
-    transientDescriptors = new LinkedHashMap<>(initialCapacity);
+    transientDescriptors = CollectionUtil.newLinkedHashMap(initialCapacity);
   }
 
   private void onEvict(SolrCore core) {
diff --git a/solr/core/src/java/org/apache/solr/handler/ExportHandler.java b/solr/core/src/java/org/apache/solr/handler/ExportHandler.java
index b00ff31498a..85a99dfaea9 100644
--- a/solr/core/src/java/org/apache/solr/handler/ExportHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/ExportHandler.java
@@ -20,7 +20,6 @@ package org.apache.solr.handler;
 import static org.apache.solr.common.params.CommonParams.JSON;
 
 import java.lang.invoke.MethodHandles;
-import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
@@ -126,8 +125,7 @@ public class ExportHandler extends SearchHandler {
     }
     String wt = req.getParams().get(CommonParams.WT, JSON);
     if ("xsort".equals(wt)) wt = JSON;
-    Map<String, String> map = new HashMap<>(1);
-    map.put(CommonParams.WT, ReplicationHandler.FILE_STREAM);
+    Map<String, String> map = Map.of(CommonParams.WT, ReplicationHandler.FILE_STREAM);
     req.setParams(SolrParams.wrapDefaults(new MapSolrParams(map), req.getParams()));
     rsp.add(
         ReplicationHandler.FILE_STREAM,
diff --git a/solr/core/src/java/org/apache/solr/handler/MoreLikeThisHandler.java b/solr/core/src/java/org/apache/solr/handler/MoreLikeThisHandler.java
index 6df99e40c8d..18980da5e99 100644
--- a/solr/core/src/java/org/apache/solr/handler/MoreLikeThisHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/MoreLikeThisHandler.java
@@ -22,7 +22,6 @@ import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -47,6 +46,7 @@ import org.apache.solr.common.params.FacetParams;
 import org.apache.solr.common.params.MoreLikeThisParams;
 import org.apache.solr.common.params.MoreLikeThisParams.TermStyle;
 import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.ContentStream;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.handler.admin.api.MoreLikeThisAPI;
@@ -444,7 +444,7 @@ public class MoreLikeThisHandler extends RequestHandlerBase {
         }
 
         Collection<Object> streamValue = Collections.singleton(buffered.get().toString());
-        Map<String, Collection<Object>> multifieldDoc = new HashMap<>(fields.length);
+        Map<String, Collection<Object>> multifieldDoc = CollectionUtil.newHashMap(fields.length);
         for (String field : fields) {
           multifieldDoc.put(field, streamValue);
         }
diff --git a/solr/core/src/java/org/apache/solr/handler/RequestHandlerUtils.java b/solr/core/src/java/org/apache/solr/handler/RequestHandlerUtils.java
index fe873084b2b..96164a1121c 100644
--- a/solr/core/src/java/org/apache/solr/handler/RequestHandlerUtils.java
+++ b/solr/core/src/java/org/apache/solr/handler/RequestHandlerUtils.java
@@ -134,9 +134,7 @@ public class RequestHandlerUtils {
   public static void setWt(SolrQueryRequest req, String wt) {
     SolrParams params = req.getParams();
     if (params.get(CommonParams.WT) != null) return; // wt is set by user
-    Map<String, String> map = new HashMap<>(1);
-    map.put(CommonParams.WT, wt);
-    map.put("indent", "true");
+    Map<String, String> map = Map.of(CommonParams.WT, wt, "indent", "true");
     req.setParams(SolrParams.wrapDefaults(params, new MapSolrParams(map)));
   }
 }
diff --git a/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java b/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java
index 22f97952ef7..368b40cdb55 100644
--- a/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/UpdateRequestHandler.java
@@ -107,8 +107,7 @@ public class UpdateRequestHandler extends ContentStreamHandlerBase
             String wt = loader.getDefaultWT();
             // Make sure it is a valid writer
             if (req.getCore().getQueryResponseWriter(wt) != null) {
-              Map<String, String> map = new HashMap<>(1);
-              map.put(CommonParams.WT, wt);
+              Map<String, String> map = Map.of(CommonParams.WT, wt);
               req.setParams(SolrParams.wrapDefaults(params, new MapSolrParams(map)));
             }
           }
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperInfoHandler.java b/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperInfoHandler.java
index 7389fcd22c9..b130563099f 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperInfoHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperInfoHandler.java
@@ -31,7 +31,6 @@ import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.Date;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -359,9 +358,7 @@ public final class ZookeeperInfoHandler extends RequestHandlerBase {
   @SuppressWarnings({"unchecked"})
   public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws Exception {
     final SolrParams params = req.getParams();
-    Map<String, String> map = new HashMap<>(1);
-    map.put(WT, "raw");
-    map.put(OMIT_HEADER, "true");
+    Map<String, String> map = Map.of(WT, "raw", OMIT_HEADER, "true");
     req.setParams(SolrParams.wrapDefaults(new MapSolrParams(map), params));
     synchronized (this) {
       if (pagingSupport == null) {
diff --git a/solr/core/src/java/org/apache/solr/handler/component/FacetComponent.java b/solr/core/src/java/org/apache/solr/handler/component/FacetComponent.java
index 9d46b773ec9..f78c8658ccc 100644
--- a/solr/core/src/java/org/apache/solr/handler/component/FacetComponent.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/FacetComponent.java
@@ -41,6 +41,7 @@ import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.FacetParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.common.util.StrUtils;
@@ -1435,7 +1436,7 @@ public class FacetComponent extends SearchComponent {
     public long[] missingMax;
     // a bitset for each shard, keeping track of which terms seen
     public FixedBitSet[] counted;
-    public HashMap<String, ShardFacetCount> counts = new HashMap<>(128);
+    public HashMap<String, ShardFacetCount> counts = CollectionUtil.newHashMap(128);
     public int termNum;
 
     public int initialLimit; // how many terms requested in first phase
diff --git a/solr/core/src/java/org/apache/solr/handler/component/PivotFacetValue.java b/solr/core/src/java/org/apache/solr/handler/component/PivotFacetValue.java
index 134364be3ce..6ff681a3dce 100644
--- a/solr/core/src/java/org/apache/solr/handler/component/PivotFacetValue.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/PivotFacetValue.java
@@ -23,6 +23,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import org.apache.solr.common.params.FacetParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.util.PivotListEntry;
@@ -247,7 +248,7 @@ public class PivotFacetValue {
       SimpleOrderedMap<SimpleOrderedMap<Object>> shardRanges = PivotFacetHelper.getRanges(value);
       if (shardRanges != null) {
         if (rangeCounts == null) {
-          rangeCounts = new LinkedHashMap<>(shardRanges.size() / 2);
+          rangeCounts = CollectionUtil.newLinkedHashMap(shardRanges.size() / 2);
         }
         RangeFacetRequest.DistribRangeFacet.mergeFacetRangesFromShardResponse(
             rangeCounts, shardRanges);
diff --git a/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java b/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java
index 587f270f5c0..4023ffea839 100644
--- a/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java
@@ -29,8 +29,6 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
@@ -1158,7 +1156,7 @@ public class QueryElevationComponent extends SearchComponent implements SolrCore
 
     public ElevationBuilder addExcludedIds(Collection<String> ids) {
       if (excludedIds == null) {
-        excludedIds = new HashSet<>(Math.max(10, ids.size()));
+        excludedIds = CollectionUtil.newHashSet(Math.max(10, ids.size()));
       }
       for (String id : ids) {
         excludedIds.add(toBytesRef(id));
@@ -1609,7 +1607,7 @@ public class QueryElevationComponent extends SearchComponent implements SolrCore
       /** Gets the child node for the provided element, or creates it if it does not exist. */
       Node<E, M> getOrCreateChild(E e) {
         if (children == null) {
-          children = new HashMap<>(4);
+          children = CollectionUtil.newHashMap(4);
         }
         Node<E, M> child = children.get(e);
         if (child == null) {
diff --git a/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java b/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java
index b06116123e6..1a679f3b471 100644
--- a/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/RealTimeGetComponent.java
@@ -69,6 +69,7 @@ import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.ShardParams;
 import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.core.SolrCore;
@@ -1377,7 +1378,7 @@ public class RealTimeGetComponent extends SearchComponent {
 
     // This can be done with single pass over both ranges and versionsAvailable, that would require
     // merging ranges. We currently use Set to ensure there are no duplicates.
-    Set<Long> versionsToRet = new HashSet<>(ulog.getNumRecordsToKeep());
+    Set<Long> versionsToRet = CollectionUtil.newHashSet(ulog.getNumRecordsToKeep());
     for (String range : ranges) {
       String[] rangeBounds = range.split("\\.{3}");
       int indexStart =
diff --git a/solr/core/src/java/org/apache/solr/handler/component/TermsComponent.java b/solr/core/src/java/org/apache/solr/handler/component/TermsComponent.java
index 7d45a885855..cbc0760f12d 100644
--- a/solr/core/src/java/org/apache/solr/handler/component/TermsComponent.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/TermsComponent.java
@@ -42,6 +42,7 @@ import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.params.TermsParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.common.util.StrUtils;
@@ -455,7 +456,7 @@ public class TermsComponent extends SearchComponent {
     public boolean stats;
 
     public TermsHelper() {
-      fieldmap = new HashMap<>(5);
+      fieldmap = CollectionUtil.newHashMap(5);
     }
 
     public void init(SolrParams params) {
@@ -465,7 +466,7 @@ public class TermsComponent extends SearchComponent {
         for (String field : fields) {
           // TODO: not sure 128 is the best starting size
           // It use it because that is what is used for facets
-          fieldmap.put(field, new HashMap<String, TermsResponse.Term>(128));
+          fieldmap.put(field, CollectionUtil.newHashMap(128));
         }
       }
     }
diff --git a/solr/core/src/java/org/apache/solr/handler/loader/XMLLoader.java b/solr/core/src/java/org/apache/solr/handler/loader/XMLLoader.java
index 5bc13f2a3ea..869d4790db9 100644
--- a/solr/core/src/java/org/apache/solr/handler/loader/XMLLoader.java
+++ b/solr/core/src/java/org/apache/solr/handler/loader/XMLLoader.java
@@ -42,6 +42,7 @@ import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.ShardParams;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.params.UpdateParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.ContentStream;
 import org.apache.solr.common.util.ContentStreamBase;
 import org.apache.solr.common.util.StrUtils;
@@ -375,11 +376,8 @@ public class XMLLoader extends ContentStreamLoader {
             Object v = isNull ? null : text.toString();
             if (update != null) {
               if (updateMap == null) updateMap = new HashMap<>();
-              Map<String, Object> extendedValues = updateMap.get(currentFieldName);
-              if (extendedValues == null) {
-                extendedValues = new HashMap<>(1);
-                updateMap.put(currentFieldName, extendedValues);
-              }
+              Map<String, Object> extendedValues =
+                  updateMap.computeIfAbsent(currentFieldName, k -> CollectionUtil.newHashMap(1));
               Object val = extendedValues.get(update);
               if (val == null) {
                 extendedValues.put(update, v);
diff --git a/solr/core/src/java/org/apache/solr/handler/tagger/Tagger.java b/solr/core/src/java/org/apache/solr/handler/tagger/Tagger.java
index 376a09c37dc..aef96e08831 100644
--- a/solr/core/src/java/org/apache/solr/handler/tagger/Tagger.java
+++ b/solr/core/src/java/org/apache/solr/handler/tagger/Tagger.java
@@ -24,7 +24,6 @@ package org.apache.solr.handler.tagger;
 
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
-import java.util.HashMap;
 import java.util.Map;
 import org.apache.lucene.analysis.TokenStream;
 import org.apache.lucene.analysis.tokenattributes.OffsetAttribute;
@@ -34,6 +33,7 @@ import org.apache.lucene.index.Terms;
 import org.apache.lucene.util.Bits;
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.IntsRef;
+import org.apache.solr.common.util.CollectionUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -86,7 +86,7 @@ public abstract class Tagger {
   }
 
   public void enableDocIdsCache(int initSize) {
-    if (initSize > 0) docIdsCache = new HashMap<>(initSize);
+    if (initSize > 0) docIdsCache = CollectionUtil.newHashMap(initSize);
   }
 
   public void process() throws IOException {
diff --git a/solr/core/src/java/org/apache/solr/handler/tagger/TaggerRequestHandler.java b/solr/core/src/java/org/apache/solr/handler/tagger/TaggerRequestHandler.java
index 510be22e385..f759badab74 100644
--- a/solr/core/src/java/org/apache/solr/handler/tagger/TaggerRequestHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/tagger/TaggerRequestHandler.java
@@ -28,7 +28,6 @@ import java.io.Reader;
 import java.io.StringReader;
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -55,6 +54,7 @@ import org.apache.solr.analysis.TokenizerChain;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.ContentStream;
 import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.handler.RequestHandlerBase;
@@ -203,7 +203,7 @@ public class TaggerRequestHandler extends RequestHandlerBase {
                   tags.add(tag);
                 }
 
-                Map<Object, List<Object>> docIdsListCache = new HashMap<>(2000);
+                Map<Object, List<Object>> docIdsListCache = CollectionUtil.newHashMap(2000);
 
                 ValueSourceAccessor uniqueKeyCache =
                     new ValueSourceAccessor(
diff --git a/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java b/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java
index a73ed06238f..b4c31bcf825 100644
--- a/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java
+++ b/solr/core/src/java/org/apache/solr/highlight/DefaultSolrHighlighter.java
@@ -22,7 +22,6 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.ListIterator;
@@ -66,6 +65,7 @@ import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.HighlightParams;
 import org.apache.solr.common.params.MapSolrParams;
 import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.core.PluginInfo;
@@ -581,8 +581,8 @@ public class DefaultSolrHighlighter extends SolrHighlighter implements PluginInf
    * isn't null.
    */
   protected Set<String> getDocPrefetchFieldNames(String[] hlFieldNames, SolrQueryRequest req) {
-    Set<String> preFetchFieldNames =
-        new HashSet<>(hlFieldNames.length + 1); // +1 for uniqueyKey added after
+    // +1 for uniqueKey added after
+    Set<String> preFetchFieldNames = CollectionUtil.newHashSet(hlFieldNames.length + 1);
     Collections.addAll(preFetchFieldNames, hlFieldNames);
     for (String hlFieldName : hlFieldNames) {
       String alternateField =
diff --git a/solr/core/src/java/org/apache/solr/packagemanager/DefaultPackageRepository.java b/solr/core/src/java/org/apache/solr/packagemanager/DefaultPackageRepository.java
index 7c942a8aadb..0eb9cfc8216 100644
--- a/solr/core/src/java/org/apache/solr/packagemanager/DefaultPackageRepository.java
+++ b/solr/core/src/java/org/apache/solr/packagemanager/DefaultPackageRepository.java
@@ -23,7 +23,6 @@ import java.lang.invoke.MethodHandles;
 import java.net.URL;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.util.HashMap;
 import java.util.Map;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.FilenameUtils;
@@ -31,6 +30,7 @@ import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClientBuilder;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
+import org.apache.solr.common.util.CollectionUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -105,7 +105,7 @@ public class DefaultPackageRepository extends PackageRepository {
       SolrPackage[] items =
           PackageUtils.getJson(client, repositoryURL + "/repository.json", SolrPackage[].class);
 
-      packages = new HashMap<>(items.length);
+      packages = CollectionUtil.newHashMap(items.length);
       for (SolrPackage pkg : items) {
         pkg.setRepository(name);
         packages.put(pkg.name, pkg);
diff --git a/solr/core/src/java/org/apache/solr/request/SimpleFacets.java b/solr/core/src/java/org/apache/solr/request/SimpleFacets.java
index 7a1ce68a872..8d390717b25 100644
--- a/solr/core/src/java/org/apache/solr/request/SimpleFacets.java
+++ b/solr/core/src/java/org/apache/solr/request/SimpleFacets.java
@@ -24,7 +24,6 @@ import java.util.AbstractMap.SimpleImmutableEntry;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.IdentityHashMap;
 import java.util.List;
@@ -69,6 +68,7 @@ import org.apache.solr.common.params.FacetParams;
 import org.apache.solr.common.params.GroupParams;
 import org.apache.solr.common.params.RequiredSolrParams;
 import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.common.util.StrUtils;
@@ -595,7 +595,7 @@ public class SimpleFacets {
           break;
         case UIF:
           // Emulate the JSON Faceting structure so we can use the same parsing classes
-          Map<String, Object> jsonFacet = new HashMap<>(13);
+          Map<String, Object> jsonFacet = CollectionUtil.newHashMap(13);
           jsonFacet.put("type", "terms");
           jsonFacet.put("field", field);
           jsonFacet.put("offset", offset);
diff --git a/solr/core/src/java/org/apache/solr/request/macro/MacroExpander.java b/solr/core/src/java/org/apache/solr/request/macro/MacroExpander.java
index f334c234e3f..d89326f2d80 100644
--- a/solr/core/src/java/org/apache/solr/request/macro/MacroExpander.java
+++ b/solr/core/src/java/org/apache/solr/request/macro/MacroExpander.java
@@ -17,11 +17,11 @@
 package org.apache.solr.request.macro;
 
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import org.apache.solr.common.SolrException;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.search.StrParser;
 import org.apache.solr.search.SyntaxError;
 
@@ -52,7 +52,7 @@ public class MacroExpander {
   }
 
   public boolean expand() {
-    this.expanded = new HashMap<>(orig.size());
+    this.expanded = CollectionUtil.newHashMap(orig.size());
 
     boolean changed = false;
     for (Map.Entry<String, String[]> entry : orig.entrySet()) {
diff --git a/solr/core/src/java/org/apache/solr/schema/CurrencyField.java b/solr/core/src/java/org/apache/solr/schema/CurrencyField.java
index 7dc737bba81..cee593b5708 100644
--- a/solr/core/src/java/org/apache/solr/schema/CurrencyField.java
+++ b/solr/core/src/java/org/apache/solr/schema/CurrencyField.java
@@ -25,6 +25,7 @@ import java.util.Map;
 import org.apache.lucene.util.ResourceLoaderAware;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
+import org.apache.solr.common.util.CollectionUtil;
 
 /**
  * Field type for support of monetary values.
@@ -78,7 +79,7 @@ public class CurrencyField extends CurrencyFieldType implements SchemaAware, Res
     // Initialize field type for amount
     fieldTypeAmountRaw = new TrieLongField();
     fieldTypeAmountRaw.setTypeName(FIELD_TYPE_AMOUNT_RAW);
-    Map<String, String> map = new HashMap<>(1);
+    Map<String, String> map = CollectionUtil.newHashMap(1);
     map.put("precisionStep", precisionStepString);
     fieldTypeAmountRaw.init(schema, map);
     fieldSuffixAmountRaw = FIELD_SUFFIX_AMOUNT_RAW;
diff --git a/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchema.java b/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchema.java
index 6c7b014b0fa..0bcfda95823 100644
--- a/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchema.java
+++ b/solr/core/src/java/org/apache/solr/schema/ManagedIndexSchema.java
@@ -65,6 +65,7 @@ import org.apache.solr.common.cloud.ZkCoreNodeProps;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.ExecutorUtil;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SolrNamedThreadFactory;
@@ -1149,7 +1150,7 @@ public final class ManagedIndexSchema extends IndexSchema {
   }
 
   private Map<String, List<CopyField>> cloneCopyFieldsMap(Map<String, List<CopyField>> original) {
-    Map<String, List<CopyField>> clone = new HashMap<>(original.size());
+    Map<String, List<CopyField>> clone = CollectionUtil.newHashMap(original.size());
     Iterator<Map.Entry<String, List<CopyField>>> iterator = original.entrySet().iterator();
     while (iterator.hasNext()) {
       Map.Entry<String, List<CopyField>> entry = iterator.next();
diff --git a/solr/core/src/java/org/apache/solr/search/CacheConfig.java b/solr/core/src/java/org/apache/solr/search/CacheConfig.java
index ecab7ead311..7dc154bed9e 100644
--- a/solr/core/src/java/org/apache/solr/search/CacheConfig.java
+++ b/solr/core/src/java/org/apache/solr/search/CacheConfig.java
@@ -28,6 +28,7 @@ import java.util.function.Supplier;
 import org.apache.solr.common.ConfigNode;
 import org.apache.solr.common.MapSerializable;
 import org.apache.solr.common.SolrException;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.core.PluginInfo;
 import org.apache.solr.core.SolrConfig;
@@ -82,7 +83,7 @@ public class CacheConfig implements MapSerializable {
   public static Map<String, CacheConfig> getMultipleConfigs(
       SolrConfig solrConfig, String configPath, List<ConfigNode> nodes) {
     if (nodes == null || nodes.size() == 0) return new LinkedHashMap<>();
-    Map<String, CacheConfig> result = new HashMap<>(nodes.size());
+    Map<String, CacheConfig> result = CollectionUtil.newHashMap(nodes.size());
     for (ConfigNode node : nodes) {
       if (node.boolAttr("enabled", true)) {
         CacheConfig config =
@@ -107,7 +108,7 @@ public class CacheConfig implements MapSerializable {
       SolrConfig solrConfig, String nodeName, Map<String, String> attrs, String xpath) {
     CacheConfig config = new CacheConfig();
     config.nodeName = nodeName;
-    Map<String, String> attrsCopy = new LinkedHashMap<>(attrs.size());
+    Map<String, String> attrsCopy = CollectionUtil.newLinkedHashMap(attrs.size());
     for (Map.Entry<String, String> e : attrs.entrySet()) {
       attrsCopy.put(e.getKey(), String.valueOf(e.getValue()));
     }
diff --git a/solr/core/src/java/org/apache/solr/search/ExtendedDismaxQParser.java b/solr/core/src/java/org/apache/solr/search/ExtendedDismaxQParser.java
index 4dac76caeda..c7c59c54859 100644
--- a/solr/core/src/java/org/apache/solr/search/ExtendedDismaxQParser.java
+++ b/solr/core/src/java/org/apache/solr/search/ExtendedDismaxQParser.java
@@ -24,7 +24,6 @@ import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
-import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -52,6 +51,7 @@ import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.params.DisMaxParams;
 import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.parser.QueryParser;
 import org.apache.solr.parser.SolrQueryParserBase.MagicFieldName;
@@ -669,7 +669,7 @@ public class ExtendedDismaxQParser extends QParser {
    * @return a {fieldName, fieldBoost} map for the given fields.
    */
   private Map<String, Float> getFieldBoosts(Collection<FieldParams> fields) {
-    Map<String, Float> fieldBoostMap = new LinkedHashMap<>(fields.size());
+    Map<String, Float> fieldBoostMap = CollectionUtil.newLinkedHashMap(fields.size());
 
     for (FieldParams field : fields) {
       fieldBoostMap.put(field.getField(), field.getBoost());
@@ -977,7 +977,7 @@ public class ExtendedDismaxQParser extends QParser {
      * Where we store a map from field name we expect to see in our query string, to Alias object
      * containing the fields to use in our DisjunctionMaxQuery and the tiebreaker to use.
      */
-    protected Map<String, Alias> aliases = new HashMap<>(3);
+    protected Map<String, Alias> aliases = CollectionUtil.newHashMap(3);
 
     private QType type;
     private String field;
diff --git a/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java b/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
index b3994d2335a..421e79994f7 100644
--- a/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
+++ b/solr/core/src/java/org/apache/solr/search/SolrIndexSearcher.java
@@ -26,7 +26,6 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.Date;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -90,6 +89,7 @@ import org.apache.lucene.util.FixedBitSet;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.ObjectReleaseTracker;
 import org.apache.solr.core.DirectoryFactory;
 import org.apache.solr.core.DirectoryFactory.DirContext;
@@ -392,7 +392,7 @@ public class SolrIndexSearcher extends IndexSearcher implements Closeable, SolrI
       if (solrConfig.userCacheConfigs.isEmpty()) {
         cacheMap = NO_GENERIC_CACHES;
       } else {
-        cacheMap = new HashMap<>(solrConfig.userCacheConfigs.size());
+        cacheMap = CollectionUtil.newHashMap(solrConfig.userCacheConfigs.size());
         for (Map.Entry<String, CacheConfig> e : solrConfig.userCacheConfigs.entrySet()) {
           SolrCache<?, ?> cache = e.getValue().newInstance();
           if (cache != null) {
diff --git a/solr/core/src/java/org/apache/solr/search/facet/FacetBucket.java b/solr/core/src/java/org/apache/solr/search/facet/FacetBucket.java
index c11e6b28da9..7584cdba6bb 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/FacetBucket.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/FacetBucket.java
@@ -20,6 +20,7 @@ package org.apache.solr.search.facet;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.SimpleOrderedMap;
 
 public class FacetBucket {
@@ -132,7 +133,7 @@ public class FacetBucket {
         Map<String, Object> subRef = subMerger.getRefinement(mcontext);
         if (subRef != null) {
           if (refinement == null) {
-            refinement = new HashMap<>(refineTags.size());
+            refinement = CollectionUtil.newHashMap(refineTags.size());
           }
           refinement.put(tag, subRef);
         }
@@ -170,7 +171,7 @@ public class FacetBucket {
     } else {
       // for missing bucket, go over all sub-facts
       refineTags = null;
-      refinement = new HashMap<>(4);
+      refinement = CollectionUtil.newHashMap(4);
       if (bucketValue != null) {
         refinement.put("_v", bucketValue);
       }
@@ -187,7 +188,7 @@ public class FacetBucket {
       Map<String, Object> subRef = sub.getValue().getRefinement(mcontext);
       if (subRef != null) {
         if (refinement == null) {
-          refinement = new HashMap<>(4);
+          refinement = CollectionUtil.newHashMap(4);
         }
         refinement.put(sub.getKey(), subRef);
       }
diff --git a/solr/core/src/java/org/apache/solr/search/facet/FacetFieldMerger.java b/solr/core/src/java/org/apache/solr/search/facet/FacetFieldMerger.java
index e66a2d839b8..fbf5b18858e 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/FacetFieldMerger.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/FacetFieldMerger.java
@@ -19,9 +19,9 @@ package org.apache.solr.search.facet;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.SimpleOrderedMap;
 
 // TODO: refactor more out to base class
@@ -185,7 +185,7 @@ public class FacetFieldMerger extends FacetRequestSortedMerger<FacetField> {
     // same "missing" status as this facet, so no need to set it again
     Map<String, Object> bucketRefinement = bucket.getRefinement(mcontext, tagsWithPartial);
     if (bucketRefinement != null) {
-      refinement = refinement == null ? new HashMap<>(2) : refinement;
+      refinement = refinement == null ? CollectionUtil.newHashMap(2) : refinement;
       refinement.put(label, bucketRefinement);
     }
     return refinement;
diff --git a/solr/core/src/java/org/apache/solr/search/facet/FacetModule.java b/solr/core/src/java/org/apache/solr/search/facet/FacetModule.java
index 043230a324b..78f01106973 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/FacetModule.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/FacetModule.java
@@ -21,7 +21,6 @@ import static org.apache.solr.common.util.Utils.fromJSONString;
 import java.io.IOException;
 import java.util.Collection;
 import java.util.Date;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import org.apache.solr.client.solrj.SolrResponse;
@@ -31,6 +30,7 @@ import org.apache.solr.common.params.FacetParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.ShardParams;
 import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.handler.component.ResponseBuilder;
@@ -234,7 +234,7 @@ public class FacetModule extends SearchComponent {
 
       shardsRefineRequest.purpose |= PURPOSE_REFINE_JSON_FACETS;
 
-      Map<String, Object> finfo = new HashMap<>(1);
+      Map<String, Object> finfo = CollectionUtil.newHashMap(1);
       finfo.put(FACET_REFINE, refinement);
 
       // String finfoStr = JSONUtil.toJSON(finfo, -1);  // this doesn't handle formatting of Date
diff --git a/solr/core/src/java/org/apache/solr/search/facet/FacetRangeMerger.java b/solr/core/src/java/org/apache/solr/search/facet/FacetRangeMerger.java
index ea09ce06fe7..b0248d0e424 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/FacetRangeMerger.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/FacetRangeMerger.java
@@ -19,10 +19,10 @@ package org.apache.solr.search.facet;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import org.apache.solr.common.params.FacetParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.SimpleOrderedMap;
 
 public class FacetRangeMerger extends FacetRequestSortedMerger<FacetRange> {
@@ -107,7 +107,7 @@ public class FacetRangeMerger extends FacetRequestSortedMerger<FacetRange> {
     }
     Map<String, Object> bucketRefinement = bucket.getRefinement(mcontext, tagsWithPartial);
     if (bucketRefinement != null) {
-      refinement = refinement == null ? new HashMap<>(2) : refinement;
+      refinement = refinement == null ? CollectionUtil.newHashMap(2) : refinement;
       refinement.put(label, bucketRefinement);
     }
     return refinement;
diff --git a/solr/core/src/java/org/apache/solr/search/facet/FacetRequestSortedMerger.java b/solr/core/src/java/org/apache/solr/search/facet/FacetRequestSortedMerger.java
index 07b67bf21da..63a28aa0829 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/FacetRequestSortedMerger.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/FacetRequestSortedMerger.java
@@ -23,10 +23,10 @@ import java.util.BitSet;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
-import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.SimpleOrderedMap;
 
 // base class for facets that create a list of buckets that can be sorted
@@ -311,7 +311,7 @@ abstract class FacetRequestSortedMerger<FacetRequestT extends FacetRequestSorted
     // higher level (i.e. we'll be in someone's missing bucket?)
     // TODO: test with a sub-facet with a limit of 0 and something like a missing bucket
     if (leafBuckets != null || partialBuckets != null || skipBuckets != null) {
-      refinement = new HashMap<>(3);
+      refinement = CollectionUtil.newHashMap(3);
       if (leafBuckets != null) refinement.put("_l", leafBuckets);
       if (partialBuckets != null) refinement.put("_p", partialBuckets);
       if (skipBuckets != null) refinement.put("_s", skipBuckets);
diff --git a/solr/core/src/java/org/apache/solr/search/facet/LegacyFacet.java b/solr/core/src/java/org/apache/solr/search/facet/LegacyFacet.java
index dad1e04c3a3..239e6c95e50 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/LegacyFacet.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/LegacyFacet.java
@@ -31,6 +31,7 @@ import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.FacetParams;
 import org.apache.solr.common.params.RequiredSolrParams;
 import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.StrUtils;
 import org.apache.solr.search.QueryParsing;
 import org.apache.solr.search.SolrReturnFields;
@@ -122,8 +123,8 @@ public class LegacyFacet {
 
   protected void addQueryFacet(String q) {
     parseParams(FacetParams.FACET_QUERY, q);
-    Map<String, Object> cmd = new HashMap<>(2);
-    Map<String, Object> type = new HashMap<>(1);
+    Map<String, Object> cmd = CollectionUtil.newHashMap(2);
+    Map<String, Object> type = CollectionUtil.newHashMap(1);
     type.put("query", cmd);
     cmd.put("q", q);
     addSub(key, type);
@@ -132,8 +133,8 @@ public class LegacyFacet {
 
   protected void addRangeFacet(String field) {
     parseParams(FacetParams.FACET_RANGE, field);
-    Map<String, Object> cmd = new HashMap<>(5);
-    Map<String, Object> type = new HashMap<>(1);
+    Map<String, Object> cmd = CollectionUtil.newHashMap(5);
+    Map<String, Object> type = CollectionUtil.newHashMap(1);
     type.put("range", cmd);
 
     String f = key;
@@ -191,7 +192,7 @@ public class LegacyFacet {
       cmd.put(SORT, sort); // can be sort by one of our stats
     }
 
-    Map<String, Object> type = new HashMap<>(1);
+    Map<String, Object> type = CollectionUtil.newHashMap(1);
     type.put("terms", cmd);
 
     addSub(key, type);
diff --git a/solr/core/src/java/org/apache/solr/search/facet/UniqueAgg.java b/solr/core/src/java/org/apache/solr/search/facet/UniqueAgg.java
index 4d7db08781a..acf8596f1e5 100644
--- a/solr/core/src/java/org/apache/solr/search/facet/UniqueAgg.java
+++ b/solr/core/src/java/org/apache/solr/search/facet/UniqueAgg.java
@@ -18,13 +18,13 @@ package org.apache.solr.search.facet;
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import org.apache.lucene.index.DocValues;
 import org.apache.lucene.index.LeafReaderContext;
 import org.apache.lucene.index.NumericDocValues;
 import org.apache.lucene.index.SortedNumericDocValues;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.schema.SchemaField;
 import org.apache.solr.util.LongIterator;
@@ -81,11 +81,10 @@ public class UniqueAgg extends StrAggValueSource {
       sumUnique += unique;
 
       int valsListed = 0;
-      @SuppressWarnings("unchecked")
       List<?> vals = (List<?>) map.get(VALS);
       if (vals != null) {
         if (values == null) {
-          values = new HashSet<>(vals.size() * 4);
+          values = CollectionUtil.newHashSet(vals.size() * 4);
         }
         values.addAll(vals);
         valsListed = vals.size();
diff --git a/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/SearchGroupsResultTransformer.java b/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/SearchGroupsResultTransformer.java
index 4304a5dba99..8ca72d10878 100644
--- a/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/SearchGroupsResultTransformer.java
+++ b/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/SearchGroupsResultTransformer.java
@@ -19,7 +19,6 @@ package org.apache.solr.search.grouping.distributed.shardresultserializer;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import org.apache.lucene.search.Sort;
@@ -28,6 +27,7 @@ import org.apache.lucene.search.grouping.SearchGroup;
 import org.apache.lucene.util.BytesRef;
 import org.apache.lucene.util.BytesRefBuilder;
 import org.apache.lucene.util.CharsRefBuilder;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.schema.SchemaField;
 import org.apache.solr.search.SolrIndexSearcher;
@@ -109,7 +109,8 @@ public class SearchGroupsResultTransformer
   @Override
   public Map<String, SearchGroupsFieldCommandResult> transformToNative(
       NamedList<NamedList<?>> shardResponse, Sort groupSort, Sort withinGroupSort, String shard) {
-    final Map<String, SearchGroupsFieldCommandResult> result = new HashMap<>(shardResponse.size());
+    final Map<String, SearchGroupsFieldCommandResult> result =
+        CollectionUtil.newHashMap(shardResponse.size());
     for (Map.Entry<String, NamedList<?>> command : shardResponse) {
       List<SearchGroup<BytesRef>> searchGroups = new ArrayList<>();
       NamedList<?> topGroupsAndGroupCount = command.getValue();
diff --git a/solr/core/src/java/org/apache/solr/search/join/ScoreModeParser.java b/solr/core/src/java/org/apache/solr/search/join/ScoreModeParser.java
index 050ac7706af..ed3dec8e2ba 100644
--- a/solr/core/src/java/org/apache/solr/search/join/ScoreModeParser.java
+++ b/solr/core/src/java/org/apache/solr/search/join/ScoreModeParser.java
@@ -17,10 +17,10 @@
 package org.apache.solr.search.join;
 
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
 import org.apache.lucene.search.join.ScoreMode;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.search.SyntaxError;
 
 class ScoreModeParser {
@@ -29,7 +29,7 @@ class ScoreModeParser {
   private ScoreModeParser() {}
 
   private static Map<String, ScoreMode> getLowerAndCapitalCaseMap() {
-    Map<String, ScoreMode> map = new HashMap<>(ScoreMode.values().length * 2);
+    Map<String, ScoreMode> map = CollectionUtil.newHashMap(ScoreMode.values().length * 2);
     for (ScoreMode s : ScoreMode.values()) {
       map.put(s.name().toLowerCase(Locale.ROOT), s);
       map.put(s.name(), s);
diff --git a/solr/core/src/java/org/apache/solr/search/mlt/MLTContentQParserPlugin.java b/solr/core/src/java/org/apache/solr/search/mlt/MLTContentQParserPlugin.java
index 5c79f13d421..246497b1303 100644
--- a/solr/core/src/java/org/apache/solr/search/mlt/MLTContentQParserPlugin.java
+++ b/solr/core/src/java/org/apache/solr/search/mlt/MLTContentQParserPlugin.java
@@ -20,12 +20,12 @@ import java.io.IOException;
 import java.io.StringReader;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.Map;
 import org.apache.lucene.queries.mlt.MoreLikeThis;
 import org.apache.lucene.search.Query;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.search.QParser;
 import org.apache.solr.search.QParserPlugin;
@@ -58,7 +58,7 @@ public class MLTContentQParserPlugin extends QParserPlugin {
       return moreLikeThis.like(fieldNames[0], new StringReader(content));
     } else {
       Collection<Object> streamValue = Collections.singleton(content);
-      Map<String, Collection<Object>> multifieldDoc = new HashMap<>(fieldNames.length);
+      Map<String, Collection<Object>> multifieldDoc = CollectionUtil.newHashMap(fieldNames.length);
       for (String field : fieldNames) {
         multifieldDoc.put(field, streamValue);
       }
diff --git a/solr/core/src/java/org/apache/solr/uninverting/FieldCacheImpl.java b/solr/core/src/java/org/apache/solr/uninverting/FieldCacheImpl.java
index c4d193b79f5..840c3fba3ee 100644
--- a/solr/core/src/java/org/apache/solr/uninverting/FieldCacheImpl.java
+++ b/solr/core/src/java/org/apache/solr/uninverting/FieldCacheImpl.java
@@ -67,12 +67,13 @@ public class FieldCacheImpl implements FieldCache {
   }
 
   private synchronized void init() {
-    caches = new HashMap<>(6);
-    caches.put(Long.TYPE, new LongCache(this));
-    caches.put(BinaryDocValues.class, new BinaryDocValuesCache(this));
-    caches.put(SortedDocValues.class, new SortedDocValuesCache(this));
-    caches.put(DocTermOrds.class, new DocTermOrdsCache(this));
-    caches.put(DocsWithFieldCache.class, new DocsWithFieldCache(this));
+    caches =
+        Map.ofEntries(
+            Map.entry(Long.TYPE, new LongCache(this)),
+            Map.entry(BinaryDocValues.class, new BinaryDocValuesCache(this)),
+            Map.entry(SortedDocValues.class, new SortedDocValuesCache(this)),
+            Map.entry(DocTermOrds.class, new DocTermOrdsCache(this)),
+            Map.entry(DocsWithFieldCache.class, new DocsWithFieldCache(this)));
   }
 
   @Override
diff --git a/solr/core/src/java/org/apache/solr/update/TransactionLog.java b/solr/core/src/java/org/apache/solr/update/TransactionLog.java
index 56f694314ee..5c28297fa09 100644
--- a/solr/core/src/java/org/apache/solr/update/TransactionLog.java
+++ b/solr/core/src/java/org/apache/solr/update/TransactionLog.java
@@ -38,6 +38,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 import org.apache.lucene.util.BytesRef;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrInputDocument;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.DataInputInputStream;
 import org.apache.solr.common.util.FastInputStream;
 import org.apache.solr.common.util.FastOutputStream;
@@ -295,7 +296,7 @@ public class TransactionLog implements Closeable {
 
     synchronized (this) {
       globalStringList = (List<String>) header.get("strings");
-      globalStringMap = new HashMap<>(globalStringList.size());
+      globalStringMap = CollectionUtil.newHashMap(globalStringList.size());
       for (int i = 0; i < globalStringList.size(); i++) {
         globalStringMap.put(globalStringList.get(i), i + 1);
       }
diff --git a/solr/core/src/java/org/apache/solr/update/UpdateLog.java b/solr/core/src/java/org/apache/solr/update/UpdateLog.java
index d78af4fdb7f..ae12fe9a3b8 100644
--- a/solr/core/src/java/org/apache/solr/update/UpdateLog.java
+++ b/solr/core/src/java/org/apache/solr/update/UpdateLog.java
@@ -61,9 +61,11 @@ import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.ExecutorUtil;
 import org.apache.solr.common.util.IOUtils;
 import org.apache.solr.common.util.SolrNamedThreadFactory;
+import org.apache.solr.common.util.SuppressForbidden;
 import org.apache.solr.common.util.TimeSource;
 import org.apache.solr.core.PluginInfo;
 import org.apache.solr.core.SolrCore;
@@ -225,12 +227,7 @@ public class UpdateLog implements PluginInfoInitialized, SolrMetricProducer {
 
   // keep track of deletes only... this is not updated on an add
   protected LinkedHashMap<BytesRef, LogPtr> oldDeletes =
-      new LinkedHashMap<>(numDeletesToKeep) {
-        @Override
-        protected boolean removeEldestEntry(Map.Entry<BytesRef, LogPtr> eldest) {
-          return size() > numDeletesToKeep;
-        }
-      };
+      new OldDeletesLinkedHashMap(this.numDeletesToKeep);
 
   /** Holds the query and the version for a DeleteByQuery command */
   public static class DBQ {
@@ -1601,7 +1598,7 @@ public class UpdateLog implements PluginInfoInitialized, SolrMetricProducer {
       updateList = new ArrayList<>(logList.size());
       deleteByQueryList = new ArrayList<>();
       deleteList = new ArrayList<>();
-      updates = new HashMap<>(numRecordsToKeep);
+      updates = CollectionUtil.newHashMap(numRecordsToKeep);
 
       for (TransactionLog oldLog : logList) {
         List<Update> updatesForLog = new ArrayList<>();
@@ -2389,4 +2386,19 @@ public class UpdateLog implements PluginInfoInitialized, SolrMetricProducer {
       versionInfo.unblockUpdates();
     }
   }
+
+  @SuppressForbidden(reason = "extends linkedhashmap")
+  private static class OldDeletesLinkedHashMap extends LinkedHashMap<BytesRef, LogPtr> {
+    private final int numDeletesToKeepInternal;
+
+    public OldDeletesLinkedHashMap(int numDeletesToKeep) {
+      super(numDeletesToKeep);
+      this.numDeletesToKeepInternal = numDeletesToKeep;
+    }
+
+    @Override
+    protected boolean removeEldestEntry(Map.Entry<BytesRef, LogPtr> eldest) {
+      return size() > numDeletesToKeepInternal;
+    }
+  }
 }
diff --git a/solr/core/src/java/org/apache/solr/update/processor/DistributedZkUpdateProcessor.java b/solr/core/src/java/org/apache/solr/update/processor/DistributedZkUpdateProcessor.java
index c1eee8572c2..ab6ecab3d29 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/DistributedZkUpdateProcessor.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/DistributedZkUpdateProcessor.java
@@ -57,6 +57,7 @@ import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.ShardParams;
 import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.request.SolrQueryRequest;
@@ -806,7 +807,7 @@ public class DistributedZkUpdateProcessor extends DistributedUpdateProcessor {
         String[] skipList = req.getParams().getParams(TEST_DISTRIB_SKIP_SERVERS);
         Set<String> skipListSet = null;
         if (skipList != null) {
-          skipListSet = new HashSet<>(skipList.length);
+          skipListSet = CollectionUtil.newHashSet(skipList.length);
           skipListSet.addAll(Arrays.asList(skipList));
           log.info("test.distrib.skip.servers was found and contains:{}", skipListSet);
         }
@@ -980,7 +981,7 @@ public class DistributedZkUpdateProcessor extends DistributedUpdateProcessor {
     String[] skipList = req.getParams().getParams(TEST_DISTRIB_SKIP_SERVERS);
     Set<String> skipListSet = null;
     if (skipList != null) {
-      skipListSet = new HashSet<>(skipList.length);
+      skipListSet = CollectionUtil.newHashSet(skipList.length);
       skipListSet.addAll(Arrays.asList(skipList));
       log.info("test.distrib.skip.servers was found and contains:{}", skipListSet);
     }
diff --git a/solr/core/src/java/org/apache/solr/util/DateMathParser.java b/solr/core/src/java/org/apache/solr/util/DateMathParser.java
index 8246e696ace..89a1a1516b5 100644
--- a/solr/core/src/java/org/apache/solr/util/DateMathParser.java
+++ b/solr/core/src/java/org/apache/solr/util/DateMathParser.java
@@ -29,7 +29,6 @@ import java.time.format.DateTimeParseException;
 import java.time.temporal.ChronoUnit;
 import java.util.Calendar;
 import java.util.Date;
-import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
 import java.util.TimeZone;
@@ -133,28 +132,26 @@ public class DateMathParser {
     // we probably need to change "Locale loc" to default to something
     // from a param via SolrRequestInfo as well.
 
-    Map<String, ChronoUnit> units = new HashMap<>(13);
-    units.put("YEAR", ChronoUnit.YEARS);
-    units.put("YEARS", ChronoUnit.YEARS);
-    units.put("MONTH", ChronoUnit.MONTHS);
-    units.put("MONTHS", ChronoUnit.MONTHS);
-    units.put("DAY", ChronoUnit.DAYS);
-    units.put("DAYS", ChronoUnit.DAYS);
-    units.put("DATE", ChronoUnit.DAYS);
-    units.put("HOUR", ChronoUnit.HOURS);
-    units.put("HOURS", ChronoUnit.HOURS);
-    units.put("MINUTE", ChronoUnit.MINUTES);
-    units.put("MINUTES", ChronoUnit.MINUTES);
-    units.put("SECOND", ChronoUnit.SECONDS);
-    units.put("SECONDS", ChronoUnit.SECONDS);
-    units.put("MILLI", ChronoUnit.MILLIS);
-    units.put("MILLIS", ChronoUnit.MILLIS);
-    units.put("MILLISECOND", ChronoUnit.MILLIS);
-    units.put("MILLISECONDS", ChronoUnit.MILLIS);
-
     // NOTE: Maybe eventually support NANOS
 
-    return units;
+    return Map.ofEntries(
+        Map.entry("YEAR", ChronoUnit.YEARS),
+        Map.entry("YEARS", ChronoUnit.YEARS),
+        Map.entry("MONTH", ChronoUnit.MONTHS),
+        Map.entry("MONTHS", ChronoUnit.MONTHS),
+        Map.entry("DAY", ChronoUnit.DAYS),
+        Map.entry("DAYS", ChronoUnit.DAYS),
+        Map.entry("DATE", ChronoUnit.DAYS),
+        Map.entry("HOUR", ChronoUnit.HOURS),
+        Map.entry("HOURS", ChronoUnit.HOURS),
+        Map.entry("MINUTE", ChronoUnit.MINUTES),
+        Map.entry("MINUTES", ChronoUnit.MINUTES),
+        Map.entry("SECOND", ChronoUnit.SECONDS),
+        Map.entry("SECONDS", ChronoUnit.SECONDS),
+        Map.entry("MILLI", ChronoUnit.MILLIS),
+        Map.entry("MILLIS", ChronoUnit.MILLIS),
+        Map.entry("MILLISECOND", ChronoUnit.MILLIS),
+        Map.entry("MILLISECONDS", ChronoUnit.MILLIS));
   }
 
   /**
diff --git a/solr/core/src/java/org/apache/solr/util/ExportTool.java b/solr/core/src/java/org/apache/solr/util/ExportTool.java
index 1f611a8e03e..47137ab0258 100644
--- a/solr/core/src/java/org/apache/solr/util/ExportTool.java
+++ b/solr/core/src/java/org/apache/solr/util/ExportTool.java
@@ -39,7 +39,6 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
-import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -75,6 +74,7 @@ import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.CursorMarkParams;
 import org.apache.solr.common.params.MapSolrParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.ExecutorUtil;
 import org.apache.solr.common.util.JavaBinCodec;
 import org.apache.solr.common.util.NamedList;
@@ -269,7 +269,7 @@ public class ExportTool extends SolrCLI.ToolBase {
     @Override
     public synchronized void accept(SolrDocument doc) throws IOException {
       charArr.reset();
-      Map<String, Object> m = new LinkedHashMap<>(doc.size());
+      Map<String, Object> m = CollectionUtil.newLinkedHashMap(doc.size());
       doc.forEach(
           (s, field) -> {
             if (s.equals("_version_") || s.equals("_roor_")) return;
diff --git a/solr/core/src/java/org/apache/solr/util/MapListener.java b/solr/core/src/java/org/apache/solr/util/MapListener.java
index ce1186b6876..60d02b26031 100644
--- a/solr/core/src/java/org/apache/solr/util/MapListener.java
+++ b/solr/core/src/java/org/apache/solr/util/MapListener.java
@@ -17,9 +17,9 @@
 package org.apache.solr.util;
 
 import com.google.common.collect.ForwardingMap;
-import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
+import org.apache.solr.common.util.CollectionUtil;
 
 /**
  * Wraps another map, keeping track of each key that was seen via {@link #get(Object)} or {@link
@@ -32,7 +32,7 @@ public class MapListener<K, V> extends ForwardingMap<K, V> {
 
   public MapListener(Map<K, V> target) {
     this.target = target;
-    seenKeys = new HashSet<>(target.size());
+    seenKeys = CollectionUtil.newHashSet(target.size());
   }
 
   public Set<K> getSeenKeys() {
diff --git a/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java b/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java
index e70f8bd6871..0394ed78fbf 100644
--- a/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java
+++ b/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java
@@ -53,6 +53,7 @@ import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.MapSolrParams;
 import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.common.util.SimpleOrderedMap;
 import org.apache.solr.common.util.StrUtils;
@@ -477,7 +478,7 @@ public class SolrPluginUtils {
     if (null == fieldLists || 0 == fieldLists.length) {
       return new HashMap<>();
     }
-    Map<String, Float> out = new HashMap<>(7);
+    Map<String, Float> out = CollectionUtil.newHashMap(7);
     for (String in : fieldLists) {
       if (null == in) {
         continue;
@@ -823,7 +824,7 @@ public class SolrPluginUtils {
      * Where we store a map from field name we expect to see in our query string, to Alias object
      * containing the fields to use in our DisjunctionMaxQuery and the tiebreaker to use.
      */
-    protected Map<String, Alias> aliases = new HashMap<>(3);
+    protected Map<String, Alias> aliases = CollectionUtil.newHashMap(3);
 
     public DisjunctionMaxQueryParser(QParser qp, String defaultField) {
       super(qp, defaultField);
diff --git a/solr/core/src/java/org/apache/solr/util/stats/InstrumentedHttpListenerFactory.java b/solr/core/src/java/org/apache/solr/util/stats/InstrumentedHttpListenerFactory.java
index a6f079a1ed2..0e90657f7d2 100644
--- a/solr/core/src/java/org/apache/solr/util/stats/InstrumentedHttpListenerFactory.java
+++ b/solr/core/src/java/org/apache/solr/util/stats/InstrumentedHttpListenerFactory.java
@@ -20,10 +20,10 @@ package org.apache.solr.util.stats;
 import static org.apache.solr.metrics.SolrMetricManager.mkName;
 
 import com.codahale.metrics.Timer;
-import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
 import org.apache.solr.client.solrj.impl.HttpListenerFactory;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.metrics.SolrMetricProducer;
 import org.apache.solr.metrics.SolrMetricsContext;
 import org.eclipse.jetty.client.api.Request;
@@ -61,7 +61,8 @@ public class InstrumentedHttpListenerFactory implements SolrMetricProducer, Http
         return mkName(schemeHostPort + "." + methodNameString(request), scope);
       };
 
-  public static final Map<String, NameStrategy> KNOWN_METRIC_NAME_STRATEGIES = new HashMap<>(3);
+  public static final Map<String, NameStrategy> KNOWN_METRIC_NAME_STRATEGIES =
+      CollectionUtil.newHashMap(3);
 
   static {
     KNOWN_METRIC_NAME_STRATEGIES.put("queryLessURLAndMethod", QUERYLESS_URL_AND_METHOD);
diff --git a/solr/core/src/java/org/apache/solr/util/stats/InstrumentedHttpRequestExecutor.java b/solr/core/src/java/org/apache/solr/util/stats/InstrumentedHttpRequestExecutor.java
index a555d143e15..c796fe8f57c 100644
--- a/solr/core/src/java/org/apache/solr/util/stats/InstrumentedHttpRequestExecutor.java
+++ b/solr/core/src/java/org/apache/solr/util/stats/InstrumentedHttpRequestExecutor.java
@@ -22,7 +22,6 @@ import static org.apache.solr.metrics.SolrMetricManager.mkName;
 import com.codahale.metrics.Timer;
 import java.io.IOException;
 import java.net.URISyntaxException;
-import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
 import org.apache.http.HttpClientConnection;
@@ -34,6 +33,7 @@ import org.apache.http.client.methods.HttpRequestWrapper;
 import org.apache.http.client.utils.URIBuilder;
 import org.apache.http.protocol.HttpContext;
 import org.apache.http.protocol.HttpRequestExecutor;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.metrics.SolrMetricProducer;
 import org.apache.solr.metrics.SolrMetricsContext;
 
@@ -100,7 +100,7 @@ public class InstrumentedHttpRequestExecutor extends HttpRequestExecutor
       };
 
   public static final Map<String, HttpClientMetricNameStrategy> KNOWN_METRIC_NAME_STRATEGIES =
-      new HashMap<>(3);
+      CollectionUtil.newHashMap(3);
 
   static {
     KNOWN_METRIC_NAME_STRATEGIES.put("queryLessURLAndMethod", QUERYLESS_URL_AND_METHOD);
diff --git a/solr/modules/hdfs/src/java/org/apache/solr/hdfs/update/HdfsTransactionLog.java b/solr/modules/hdfs/src/java/org/apache/solr/hdfs/update/HdfsTransactionLog.java
index c7bca1b9aa6..a9dca90c98f 100644
--- a/solr/modules/hdfs/src/java/org/apache/solr/hdfs/update/HdfsTransactionLog.java
+++ b/solr/modules/hdfs/src/java/org/apache/solr/hdfs/update/HdfsTransactionLog.java
@@ -19,7 +19,6 @@ package org.apache.solr.hdfs.update;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -30,6 +29,7 @@ import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrInputDocument;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.DataInputInputStream;
 import org.apache.solr.common.util.FastInputStream;
 import org.apache.solr.common.util.FastOutputStream;
@@ -196,7 +196,7 @@ public class HdfsTransactionLog extends TransactionLog {
 
     synchronized (this) {
       globalStringList = (List<String>) header.get("strings");
-      globalStringMap = new HashMap<>(globalStringList.size());
+      globalStringMap = CollectionUtil.newHashMap(globalStringList.size());
       for (int i = 0; i < globalStringList.size(); i++) {
         globalStringMap.put(globalStringList.get(i), i + 1);
       }
diff --git a/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/Tuple.java b/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/Tuple.java
index 54da785fa3f..28d680e16b9 100644
--- a/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/Tuple.java
+++ b/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/Tuple.java
@@ -28,6 +28,7 @@ import java.util.Map;
 import java.util.stream.Collectors;
 import org.apache.solr.common.MapWriter;
 import org.apache.solr.common.params.StreamParams;
+import org.apache.solr.common.util.CollectionUtil;
 
 /**
  * A simple abstraction of a record containing key/value pairs. Convenience methods are provided for
@@ -52,7 +53,7 @@ public class Tuple implements Cloneable, MapWriter {
    *
    * @deprecated use {@link #getFields()} instead of this public field.
    */
-  @Deprecated public Map<String, Object> fields = new HashMap<>(2);
+  @Deprecated public Map<String, Object> fields = CollectionUtil.newHashMap(2);
   /**
    * External serializable field names.
    *
diff --git a/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/stream/FacetStream.java b/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/stream/FacetStream.java
index e359afb8367..4f39a9e668b 100644
--- a/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/stream/FacetStream.java
+++ b/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/stream/FacetStream.java
@@ -19,7 +19,6 @@ package org.apache.solr.client.solrj.io.stream;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -52,6 +51,7 @@ import org.apache.solr.client.solrj.io.stream.metrics.Metric;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.NamedList;
 
 /**
@@ -1061,7 +1061,7 @@ public class FacetStream extends TupleStream implements Expressible, ParallelMet
    * @return A mapping of fields produced by the rollup stream to their output name.
    */
   protected Map<String, String> getRollupSelectFields(Metric[] rollupMetrics) {
-    Map<String, String> map = new HashMap<>(rollupMetrics.length * 2);
+    Map<String, String> map = CollectionUtil.newHashMap(rollupMetrics.length * 2);
     for (Bucket b : buckets) {
       String key = b.toString();
       map.put(key, key);
diff --git a/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/stream/StatsStream.java b/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/stream/StatsStream.java
index 275482dda89..be3d6cdf953 100644
--- a/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/stream/StatsStream.java
+++ b/solr/solrj-streaming/src/java/org/apache/solr/client/solrj/io/stream/StatsStream.java
@@ -22,7 +22,6 @@ import static org.apache.solr.client.solrj.io.stream.FacetStream.defaultTieredEn
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -51,6 +50,7 @@ import org.apache.solr.client.solrj.io.stream.metrics.Metric;
 import org.apache.solr.client.solrj.request.QueryRequest;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.NamedList;
 
 /**
@@ -421,7 +421,7 @@ public class StatsStream extends TupleStream implements Expressible, ParallelMet
   // Map the rollup metric to the original metric name so that we can project out the correct field
   // names in the tuple
   protected Map<String, String> getRollupSelectFields(Metric[] rollupMetrics) {
-    Map<String, String> map = new HashMap<>(rollupMetrics.length * 2);
+    Map<String, String> map = CollectionUtil.newHashMap(rollupMetrics.length * 2);
     for (Metric m : rollupMetrics) {
       String[] cols = m.getColumns();
       map.put(m.getIdentifier(), cols != null && cols.length > 0 ? cols[0] : "*");
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java
index 10360292dc0..a9700ec9a20 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/CloudSolrClient.java
@@ -75,6 +75,7 @@ import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.ShardParams;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.params.UpdateParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.ExecutorUtil;
 import org.apache.solr.common.util.Hash;
 import org.apache.solr.common.util.NamedList;
@@ -474,7 +475,8 @@ public abstract class CloudSolrClient extends SolrClient {
     long start = System.nanoTime();
 
     if (parallelUpdates) {
-      final Map<String, Future<NamedList<?>>> responseFutures = new HashMap<>(routes.size());
+      final Map<String, Future<NamedList<?>>> responseFutures =
+          CollectionUtil.newHashMap(routes.size());
       for (final Map.Entry<String, ? extends LBSolrClient.Req> entry : routes.entrySet()) {
         final String url = entry.getKey();
         final LBSolrClient.Req lbRequest = entry.getValue();
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/JavaBinUpdateRequestCodec.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/JavaBinUpdateRequestCodec.java
index 26dcdebc97d..a2423a788c2 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/JavaBinUpdateRequestCodec.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/JavaBinUpdateRequestCodec.java
@@ -26,7 +26,6 @@ import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
-import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -36,6 +35,7 @@ import org.apache.solr.common.SolrInputField;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.ShardParams;
 import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.DataInputInputStream;
 import org.apache.solr.common.util.JavaBinCodec;
 import org.apache.solr.common.util.NamedList;
@@ -221,7 +221,7 @@ public class JavaBinUpdateRequestCodec {
 
     @Override
     protected SolrInputDocument createSolrInputDocument(int sz) {
-      return new MaskCharSequenceSolrInputDoc(new LinkedHashMap<>(sz));
+      return new MaskCharSequenceSolrInputDoc(CollectionUtil.newLinkedHashMap(sz));
     }
 
     @Override
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/UpdateRequest.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/UpdateRequest.java
index d41960c002b..3534558bba2 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/UpdateRequest.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/UpdateRequest.java
@@ -42,6 +42,7 @@ import org.apache.solr.common.cloud.DocRouter;
 import org.apache.solr.common.cloud.Slice;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.UpdateParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.ContentStream;
 import org.apache.solr.common.util.XML;
 
@@ -141,7 +142,7 @@ public class UpdateRequest extends AbstractUpdateRequest {
     if (documents == null) {
       documents = new LinkedHashMap<>();
     }
-    Map<String, Object> params = new HashMap<>(2);
+    Map<String, Object> params = CollectionUtil.newHashMap(2);
     if (commitWithin != null) params.put(COMMIT_WITHIN, commitWithin);
     if (overwrite != null) params.put(OVERWRITE, overwrite);
 
@@ -182,7 +183,8 @@ public class UpdateRequest extends AbstractUpdateRequest {
     if (deleteById == null) {
       deleteById = new LinkedHashMap<>();
     }
-    Map<String, Object> params = (route == null && version == null) ? null : new HashMap<>(1);
+    Map<String, Object> params =
+        (route == null && version == null) ? null : CollectionUtil.newHashMap(1);
     if (version != null) params.put(VER, version);
     if (route != null) params.put(_ROUTE_, route);
     deleteById.put(id, params);
diff --git a/solr/solrj/src/java/org/apache/solr/common/LinkedHashMapWriter.java b/solr/solrj/src/java/org/apache/solr/common/LinkedHashMapWriter.java
index 3d8adf2caae..613720f1142 100644
--- a/solr/solrj/src/java/org/apache/solr/common/LinkedHashMapWriter.java
+++ b/solr/solrj/src/java/org/apache/solr/common/LinkedHashMapWriter.java
@@ -21,9 +21,11 @@ import java.io.IOException;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import org.apache.solr.common.util.SuppressForbidden;
 
 public class LinkedHashMapWriter<V> extends LinkedHashMap<String, V> implements MapWriter {
 
+  @SuppressForbidden(reason = "extends LinkedHashMap")
   public LinkedHashMapWriter(int initialCapacity) {
     super(initialCapacity);
   }
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java b/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java
index cda0b66a9e6..843bc1343e7 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/ClusterState.java
@@ -22,7 +22,6 @@ import java.lang.invoke.MethodHandles;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -35,6 +34,7 @@ import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrException.ErrorCode;
 import org.apache.solr.common.cloud.DocCollection.CollectionStateProps;
 import org.apache.solr.common.cloud.Replica.ReplicaStateProps;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.Utils;
 import org.noggit.JSONParser;
 import org.noggit.JSONWriter;
@@ -65,7 +65,7 @@ public class ClusterState implements JSONWriter.Writable {
   }
 
   private static Map<String, CollectionRef> getRefMap(Map<String, DocCollection> collectionStates) {
-    Map<String, CollectionRef> collRefs = new LinkedHashMap<>(collectionStates.size());
+    Map<String, CollectionRef> collRefs = CollectionUtil.newLinkedHashMap(collectionStates.size());
     for (Entry<String, DocCollection> entry : collectionStates.entrySet()) {
       final DocCollection c = entry.getValue();
       collRefs.put(entry.getKey(), new CollectionRef(c));
@@ -78,7 +78,7 @@ public class ClusterState implements JSONWriter.Writable {
    * loaded (parameter order different from constructor above to have different erasures)
    */
   public ClusterState(Map<String, CollectionRef> collectionStates, Set<String> liveNodes) {
-    this.liveNodes = new HashSet<>(liveNodes.size());
+    this.liveNodes = CollectionUtil.newHashSet(liveNodes.size());
     this.liveNodes.addAll(liveNodes);
     this.collectionStates = new LinkedHashMap<>(collectionStates);
     this.immutableCollectionStates = Collections.unmodifiableMap(this.collectionStates);
@@ -158,7 +158,7 @@ public class ClusterState implements JSONWriter.Writable {
    * @return a map of collection name vs DocCollection object
    */
   public Map<String, DocCollection> getCollectionsMap() {
-    Map<String, DocCollection> result = new HashMap<>(collectionStates.size());
+    Map<String, DocCollection> result = CollectionUtil.newHashMap(collectionStates.size());
     for (Entry<String, CollectionRef> entry : collectionStates.entrySet()) {
       DocCollection collection = entry.getValue().get();
       if (collection != null) {
@@ -246,7 +246,7 @@ public class ClusterState implements JSONWriter.Writable {
       Map<String, Object> stateMap,
       Set<String> liveNodes,
       DocCollection.PrsSupplier prsSupplier) {
-    Map<String, CollectionRef> collections = new LinkedHashMap<>(stateMap.size());
+    Map<String, CollectionRef> collections = CollectionUtil.newLinkedHashMap(stateMap.size());
     for (Entry<String, Object> entry : stateMap.entrySet()) {
       String collectionName = entry.getKey();
       @SuppressWarnings({"unchecked"})
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/DocCollection.java b/solr/solrj/src/java/org/apache/solr/common/cloud/DocCollection.java
index ba0a82ba6b5..55068c70aac 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/DocCollection.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/DocCollection.java
@@ -33,6 +33,7 @@ import java.util.function.BiConsumer;
 import java.util.function.BiPredicate;
 import java.util.function.Supplier;
 import org.apache.solr.common.cloud.Replica.ReplicaStateProps;
+import org.apache.solr.common.util.CollectionUtil;
 import org.noggit.JSONWriter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -327,7 +328,7 @@ public class DocCollection extends ZkNodeProps implements Iterable<Slice> {
 
   @Override
   public void write(JSONWriter jsonWriter) {
-    LinkedHashMap<String, Object> all = new LinkedHashMap<>(slices.size() + 1);
+    LinkedHashMap<String, Object> all = CollectionUtil.newLinkedHashMap(slices.size() + 1);
     all.putAll(propMap);
     all.put(CollectionStateProps.SHARDS, slices);
     jsonWriter.write(all);
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/Slice.java b/solr/solrj/src/java/org/apache/solr/common/cloud/Slice.java
index 76539e70ead..197d10199cc 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/Slice.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/Slice.java
@@ -32,6 +32,7 @@ import java.util.Set;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import org.apache.solr.common.cloud.Replica.Type;
+import org.apache.solr.common.util.CollectionUtil;
 import org.noggit.JSONWriter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -64,7 +65,7 @@ public class Slice extends ZkNodeProps implements Iterable<Replica> {
   public static Map<String, Slice> loadAllFromMap(
       String collection, Map<String, Object> genericSlices) {
     if (genericSlices == null) return Collections.emptyMap();
-    Map<String, Slice> result = new LinkedHashMap<>(genericSlices.size());
+    Map<String, Slice> result = CollectionUtil.newLinkedHashMap(genericSlices.size());
     for (Map.Entry<String, Object> entry : genericSlices.entrySet()) {
       String name = entry.getKey();
       Object val = entry.getValue();
@@ -159,7 +160,7 @@ public class Slice extends ZkNodeProps implements Iterable<Replica> {
   @SuppressWarnings({"unchecked", "rawtypes"})
   public Slice(
       String name, Map<String, Replica> replicas, Map<String, Object> props, String collection) {
-    super(props == null ? new LinkedHashMap<>(2) : new LinkedHashMap<>(props));
+    super(props == null ? CollectionUtil.newLinkedHashMap(2) : new LinkedHashMap<>(props));
     this.name = name;
     this.collection = collection;
 
@@ -221,8 +222,8 @@ public class Slice extends ZkNodeProps implements Iterable<Replica> {
   @SuppressWarnings({"unchecked"})
   private Map<String, Replica> makeReplicas(
       String collection, String slice, Map<String, Object> genericReplicas) {
-    if (genericReplicas == null) return new HashMap<>(1);
-    Map<String, Replica> result = new LinkedHashMap<>(genericReplicas.size());
+    if (genericReplicas == null) return CollectionUtil.newHashMap(1);
+    Map<String, Replica> result = CollectionUtil.newLinkedHashMap(genericReplicas.size());
     for (Map.Entry<String, Object> entry : genericReplicas.entrySet()) {
       String name = entry.getKey();
       Object val = entry.getValue();
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/ByteArrayUtf8CharSequence.java b/solr/solrj/src/java/org/apache/solr/common/util/ByteArrayUtf8CharSequence.java
index 531fb9c8105..8379b5051c1 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/ByteArrayUtf8CharSequence.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/ByteArrayUtf8CharSequence.java
@@ -20,7 +20,6 @@ package org.apache.solr.common.util;
 import java.util.AbstractMap;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 import java.util.function.Function;
@@ -207,7 +206,7 @@ public class ByteArrayUtf8CharSequence implements Utf8CharSequence {
     if (needsCopy) {
       Collection<Object> copy = null;
       if (vals instanceof Set) {
-        copy = new HashSet<>(vals.size());
+        copy = CollectionUtil.newHashSet(vals.size());
       } else {
         copy = new ArrayList<>(vals.size());
       }
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/CollectionUtil.java b/solr/solrj/src/java/org/apache/solr/common/util/CollectionUtil.java
index 06df651ebb7..8d9a96c2574 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/CollectionUtil.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/CollectionUtil.java
@@ -18,12 +18,14 @@ package org.apache.solr.common.util;
 
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashMap;
 
 /**
  * Methods for creating collections with exact sizes.
  *
  * @lucene.internal
  */
+@SuppressForbidden(reason = "This class properly sizes the collections")
 public final class CollectionUtil {
 
   private CollectionUtil() {} // no instance
@@ -35,10 +37,19 @@ public final class CollectionUtil {
   public static <K, V> HashMap<K, V> newHashMap(int size) {
     // With Lucene 9.5 - we should replace this with
     // org.apache.lucene.util.CollectionUtil.newHashMap(int size)
-    // This should be replaced with HashMap.newHashMap when Solr moves to jdk19 minimum version
+    // Replace with HashMap.newHashMap when Solr moves to minimum jdk19
     return new HashMap<>((int) (size / 0.75f) + 1);
   }
 
+  /**
+   * Returns a new {@link LinkedHashMap} sized to contain {@code size} items without resizing the
+   * internal array.
+   */
+  public static <K, V> LinkedHashMap<K, V> newLinkedHashMap(int size) {
+    // Replace with LinkedHashMap.newLinkedHashMap when Solr moves to minimum jdk19
+    return new LinkedHashMap<>((int) (size / 0.75f) + 1);
+  }
+
   /**
    * Returns a new {@link HashSet} sized to contain {@code size} items without resizing the internal
    * array.
@@ -46,7 +57,7 @@ public final class CollectionUtil {
   public static <E> HashSet<E> newHashSet(int size) {
     // With Lucene 9.5 - we should replace this with
     // org.apache.lucene.util.CollectionUtil.newHashSet(int size)
-    // This should be replaced with HashSet.newHashSet when Solr moves to jdk19 minimum version
+    // Replace with HashSet.newHashSet when Solr moves to minimum jdk19
     return new HashSet<>((int) (size / 0.75f) + 1);
   }
 }
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/CommandOperation.java b/solr/solrj/src/java/org/apache/solr/common/util/CommandOperation.java
index 15397556889..66386d21e52 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/CommandOperation.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/CommandOperation.java
@@ -223,7 +223,7 @@ public class CommandOperation {
     List<CommandOperation> operations = new ArrayList<>();
 
     final HashMap<Object, Object> map =
-        new HashMap<>(0) {
+        new HashMap<>() {
           @Override
           public Object put(Object key, Object value) {
             List<?> vals = null;
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/FastJavaBinDecoder.java b/solr/solrj/src/java/org/apache/solr/common/util/FastJavaBinDecoder.java
index 5429c9b936b..06be49fc8de 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/FastJavaBinDecoder.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/FastJavaBinDecoder.java
@@ -54,7 +54,6 @@ import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Date;
-import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import org.apache.solr.common.SolrDocument;
@@ -783,7 +782,7 @@ public class FastJavaBinDecoder implements DataEntry.FastDecoder {
     if (e.type().isContainer) {
       Object ctx =
           e.type() == DataEntry.Type.KEYVAL_ITER
-              ? new LinkedHashMap(getSize(e))
+              ? CollectionUtil.newLinkedHashMap(getSize(e))
               : new ArrayList(getSize(e));
       if (e.ctx() != null) {
         if (e.isKeyValEntry()) {
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java b/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java
index abe9c9d8619..aaf955b0aac 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/JavaBinCodec.java
@@ -571,7 +571,7 @@ public class JavaBinCodec implements PushWriter {
   public SolrDocument readSolrDocument(DataInputInputStream dis) throws IOException {
     tagByte = dis.readByte();
     int size = readSize(dis);
-    SolrDocument doc = new SolrDocument(new LinkedHashMap<>(size));
+    SolrDocument doc = new SolrDocument(CollectionUtil.newLinkedHashMap(size));
     for (int i = 0; i < size; i++) {
       String fieldName;
       Object obj = readVal(dis); // could be a field name, or a child document
@@ -658,7 +658,7 @@ public class JavaBinCodec implements PushWriter {
   }
 
   protected SolrInputDocument createSolrInputDocument(int sz) {
-    return new SolrInputDocument(new LinkedHashMap<>(sz));
+    return new SolrInputDocument(CollectionUtil.newLinkedHashMap(sz));
   }
 
   static final Predicate<CharSequence> IGNORECHILDDOCS =
@@ -694,7 +694,7 @@ public class JavaBinCodec implements PushWriter {
    * @param size expected size, -1 means unknown size
    */
   protected Map<Object, Object> newMap(int size) {
-    return size < 0 ? new LinkedHashMap<>() : new LinkedHashMap<>(size);
+    return size < 0 ? new LinkedHashMap<>() : CollectionUtil.newLinkedHashMap(size);
   }
 
   public Map<Object, Object> readMap(DataInputInputStream dis) throws IOException {
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/JsonSchemaValidator.java b/solr/solrj/src/java/org/apache/solr/common/util/JsonSchemaValidator.java
index 4837736f103..1023689b3bc 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/JsonSchemaValidator.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/JsonSchemaValidator.java
@@ -167,7 +167,7 @@ class TypeValidator extends Validator<Object> {
 
   TypeValidator(Map<?, ?> schema, Object type) {
     super(schema, type);
-    types = new HashSet<>(1);
+    types = CollectionUtil.newHashSet(1);
     if (type instanceof List) {
       for (Object t : (List) type) {
         types.add(getType(t.toString()));
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/JsonTextWriter.java b/solr/solrj/src/java/org/apache/solr/common/util/JsonTextWriter.java
index f506cb56b81..6abff958f77 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/JsonTextWriter.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/JsonTextWriter.java
@@ -18,7 +18,6 @@
 package org.apache.solr.common.util;
 
 import java.io.IOException;
-import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -343,7 +342,7 @@ public interface JsonTextWriter extends TextWriter {
     // Disad: this is ambiguous with a real single value that happens to be an array
     //
     // Both of these mappings have ambiguities.
-    HashMap<String, Integer> repeats = new HashMap<>(4);
+    Map<String, Integer> repeats = CollectionUtil.newHashMap(4);
 
     boolean first = true;
     for (int i = 0; i < sz; i++) {
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/Utils.java b/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
index 1a3a737fd2a..46c8da7d9b4 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/Utils.java
@@ -110,8 +110,8 @@ public class Utils {
     } else {
       copy =
           map instanceof LinkedHashMap
-              ? new LinkedHashMap<>(map.size())
-              : new HashMap<>(map.size());
+              ? CollectionUtil.newLinkedHashMap(map.size())
+              : CollectionUtil.newHashMap(map.size());
     }
     for (Object o : map.entrySet()) {
       Map.Entry<?, ?> e = (Map.Entry<?, ?>) o;
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/ValidatingJsonMap.java b/solr/solrj/src/java/org/apache/solr/common/util/ValidatingJsonMap.java
index 769524bbcf2..bd678bf5161 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/ValidatingJsonMap.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/ValidatingJsonMap.java
@@ -78,7 +78,7 @@ public class ValidatingJsonMap implements Map<String, Object>, NavigableObject {
   }
 
   public ValidatingJsonMap(int i) {
-    delegate = new LinkedHashMap<>(i);
+    delegate = CollectionUtil.newLinkedHashMap(i);
   }
 
   public ValidatingJsonMap() {
diff --git a/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java b/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java
index acc0a27c5eb..1b498255e08 100644
--- a/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java
+++ b/solr/test-framework/src/java/org/apache/solr/BaseDistributedSearchTestCase.java
@@ -30,7 +30,6 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Date;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -60,6 +59,7 @@ import org.apache.solr.common.SolrDocumentList;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.SolrParams;
+import org.apache.solr.common.util.CollectionUtil;
 import org.apache.solr.common.util.ExecutorUtil;
 import org.apache.solr.common.util.IOUtils;
 import org.apache.solr.common.util.NamedList;
@@ -809,14 +809,12 @@ public abstract class BaseDistributedSearchTestCase extends SolrTestCaseJ4 {
     boolean ordered = (flags & UNORDERED) == 0;
 
     if (!ordered) {
-      @SuppressWarnings({"rawtypes"})
-      Map mapA = new HashMap(a.size());
+      Map<String, Object> mapA = CollectionUtil.newHashMap(a.size());
       for (int i = 0; i < a.size(); i++) {
         Object prev = mapA.put(a.getName(i), a.getVal(i));
       }
 
-      @SuppressWarnings({"rawtypes"})
-      Map mapB = new HashMap(b.size());
+      Map<String, Object> mapB = CollectionUtil.newHashMap(b.size());
       for (int i = 0; i < b.size(); i++) {
         Object prev = mapB.put(b.getName(i), b.getVal(i));
       }