You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@solr.apache.org by ep...@apache.org on 2026/04/24 12:13:32 UTC

(solr) branch branch_10x updated: SOLR-18164: Remove use of .singleton (#4222)

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

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


The following commit(s) were added to refs/heads/branch_10x by this push:
     new 184846866d8 SOLR-18164: Remove use of .singleton (#4222)
184846866d8 is described below

commit 184846866d85fe86fac21085bb23fadc31d7f3b1
Author: Eric Pugh <ep...@opensourceconnections.com>
AuthorDate: Fri Apr 24 08:06:36 2026 -0400

    SOLR-18164: Remove use of .singleton (#4222)
    
    Co-authored-by: copilot-swe-agent[bot] <19...@users.noreply.github.com>
    Co-authored-by: Copilot <22...@users.noreply.github.com>
    Co-authored-by: epugh <22...@users.noreply.github.com>
    (cherry picked from commit 1af33ac6997adee643f8d24e3682b4dfe19e9c4c)
---
 gradle/validation/forbidden-apis/defaults.all.txt  |   9 ++
 .../org/apache/solr/bench/generators/Maps.java     |   3 +-
 .../org/apache/solr/bench/SolrBenchStateTest.java  |   6 +-
 .../src/java/org/apache/solr/api/AnnotatedApi.java |  13 +-
 solr/core/src/java/org/apache/solr/api/ApiBag.java |  12 +-
 .../src/java/org/apache/solr/cli/CLIUtils.java     |   3 +-
 .../src/java/org/apache/solr/cli/ExportTool.java   |   5 +-
 .../java/org/apache/solr/cli/RunExampleTool.java   |   4 +-
 .../solr/cloud/DistributedClusterStateUpdater.java |   9 +-
 .../src/java/org/apache/solr/cloud/Overseer.java   |  34 +++--
 .../solr/cloud/api/collections/AddReplicaCmd.java  |   4 +-
 .../apache/solr/cloud/api/collections/Assign.java  |   2 +-
 .../api/collections/CollectionHandlingUtils.java   |   2 +-
 .../solr/cloud/api/collections/CreateAliasCmd.java |   4 +-
 .../cloud/api/collections/CreateCollectionCmd.java |   7 +-
 .../cloud/api/collections/DeleteBackupCmd.java     |   2 +-
 .../cloud/api/collections/DeleteCollectionCmd.java |   3 +-
 .../cloud/api/collections/MigrateReplicasCmd.java  |   3 +-
 .../solr/cloud/api/collections/MoveReplicaCmd.java |   3 +-
 .../solr/cloud/api/collections/ReplaceNodeCmd.java |   3 +-
 .../api/collections/ReplicaMigrationUtils.java     |   3 +-
 .../cloud/api/collections/TimeRoutedAlias.java     |   3 +-
 .../apache/solr/cloud/overseer/ZkStateWriter.java  |   4 +-
 .../impl/CollectionsRepairEventListener.java       |   3 +-
 .../solr/cluster/placement/PlacementPlugin.java    |   3 +-
 .../java/org/apache/solr/core/MetricsConfig.java   |   4 +-
 .../src/java/org/apache/solr/core/PluginBag.java   |   6 +-
 .../java/org/apache/solr/core/RequestParams.java   |   5 +-
 .../src/java/org/apache/solr/core/SolrCore.java    |   6 +-
 .../src/java/org/apache/solr/core/SolrPaths.java   |   3 +-
 .../org/apache/solr/core/backup/BackupManager.java |   5 +-
 .../solr/core/backup/ShardBackupMetadata.java      |   3 +-
 .../snapshots/SolrSnapshotMetaDataManager.java     |   3 +-
 .../apache/solr/filestore/ClusterFileStore.java    |   4 +-
 .../java/org/apache/solr/handler/ClusterAPI.java   |   3 +-
 .../java/org/apache/solr/handler/IndexFetcher.java |   6 +-
 .../apache/solr/handler/MoreLikeThisHandler.java   |   4 +-
 .../apache/solr/handler/RequestHandlerBase.java    |   5 +-
 .../org/apache/solr/handler/SchemaHandler.java     |   5 +-
 .../org/apache/solr/handler/SolrConfigHandler.java |   3 +-
 .../solr/handler/admin/BaseHandlerApiSupport.java  |   5 +-
 .../org/apache/solr/handler/admin/ColStatus.java   |   3 +-
 .../handler/admin/SecurityConfHandlerLocal.java    |   4 +-
 .../solr/handler/admin/SecurityConfHandlerZk.java  |   4 +-
 .../handler/component/QueryElevationComponent.java |   4 +-
 .../handler/component/RealTimeGetComponent.java    |   5 +-
 .../handler/component/ResponseLogComponent.java    |   5 +-
 .../designer/DefaultSampleDocumentsLoader.java     |   3 +-
 .../solr/handler/designer/SchemaDesignerAPI.java   |   8 +-
 .../designer/SchemaDesignerConfigSetHelper.java    |   3 +-
 .../apache/solr/handler/export/ExportWriter.java   |   9 +-
 .../apache/solr/packagemanager/PackageManager.java |  10 +-
 .../apache/solr/parser/SolrQueryParserBase.java    |   3 +-
 .../src/java/org/apache/solr/pkg/PackageAPI.java   |   2 +-
 .../org/apache/solr/pkg/PackagePluginHolder.java   |   6 +-
 .../org/apache/solr/pkg/SolrPackageLoader.java     |   2 +-
 .../apache/solr/response/TextResponseWriter.java   |   5 +-
 .../transform/RawValueTransformerFactory.java      |   3 +-
 .../java/org/apache/solr/schema/BinaryField.java   |   3 +-
 .../src/java/org/apache/solr/schema/BoolField.java |   3 +-
 .../org/apache/solr/schema/CollationField.java     |   3 +-
 .../src/java/org/apache/solr/schema/FieldType.java |   2 +-
 .../java/org/apache/solr/schema/IndexSchema.java   |   7 +-
 .../java/org/apache/solr/schema/SchemaManager.java |  29 ++--
 .../org/apache/solr/schema/SortableTextField.java  |   5 +-
 .../src/java/org/apache/solr/schema/StrField.java  |   3 +-
 .../src/java/org/apache/solr/schema/TrieField.java |   3 +-
 .../java/org/apache/solr/search/CacheConfig.java   |   3 +-
 .../solr/search/CollapsingQParserPlugin.java       |   3 +-
 .../solr/search/NumericHidingLeafReader.java       |   3 +-
 .../org/apache/solr/search/ValueSourceParser.java  |   4 +-
 .../TopGroupsResultTransformer.java                |   4 +-
 .../solr/search/mlt/MLTContentQParserPlugin.java   |   4 +-
 .../java/org/apache/solr/security/AuditEvent.java  |   7 +-
 .../apache/solr/security/AuditLoggerPlugin.java    |   3 +-
 .../org/apache/solr/security/MultiAuthPlugin.java  |   3 +-
 .../MultiAuthRuleBasedAuthorizationPlugin.java     |   3 +-
 .../java/org/apache/solr/security/Permission.java  |  18 ++-
 .../solr/security/PermissionNameProvider.java      |   8 +-
 .../security/RuleBasedAuthorizationPluginBase.java |   2 +
 .../security/Sha256AuthenticationProvider.java     |   3 +-
 .../cert/PathBasedCertPrincipalResolver.java       |   5 +-
 .../java/org/apache/solr/servlet/HttpSolrCall.java |   4 +-
 .../org/apache/solr/update/AddUpdateCommand.java   |   4 +-
 .../src/java/org/apache/solr/update/UpdateLog.java |   4 +-
 .../processor/AtomicUpdateDocumentMerger.java      |   3 +-
 .../processor/AtomicUpdateProcessorFactory.java    |   3 +-
 .../CloneFieldUpdateProcessorFactory.java          |   3 +-
 .../processor/DistributedZkUpdateProcessor.java    |   3 +-
 .../FirstFieldValueUpdateProcessorFactory.java     |   2 +
 .../LastFieldValueUpdateProcessorFactory.java      |   2 +
 .../MaxFieldValueUpdateProcessorFactory.java       |   2 +
 .../MinFieldValueUpdateProcessorFactory.java       |   2 +
 .../ParseBooleanFieldUpdateProcessorFactory.java   |   5 +-
 .../processor/RoutedAliasUpdateProcessor.java      |   5 +-
 .../java/org/apache/solr/util/SolrPluginUtils.java |   5 +-
 .../solr/TestSimpleTrackingShardHandler.java       |   6 +-
 .../api/NodeConfigClusterPluginsSourceTest.java    |   6 +-
 .../org/apache/solr/cli/TestSolrCLIRunExample.java |   7 +-
 .../apache/solr/cloud/CollectionsAPISolrJTest.java |   6 +-
 .../solr/cloud/DistributedVersionInfoTest.java     |   3 +-
 .../org/apache/solr/cloud/ForceLeaderTest.java     |  11 +-
 .../cloud/LeaderFailoverAfterPartitionTest.java    |   3 +-
 .../cloud/LeaderFailureAfterFreshStartTest.java    |  12 +-
 .../org/apache/solr/cloud/MoveReplicaTest.java     |   4 +-
 .../solr/cloud/OverseerModifyCollectionTest.java   |   8 +-
 .../apache/solr/cloud/PeerSyncReplicationTest.java |   6 +-
 .../apache/solr/cloud/ReindexCollectionTest.java   |   3 +-
 .../test/org/apache/solr/cloud/ShardTermsTest.java |   7 +-
 .../org/apache/solr/cloud/TestHashPartitioner.java |   4 +-
 .../apache/solr/cloud/TestRandomFlRTGCloud.java    |  24 ++--
 .../cloud/TestStressCloudBlindAtomicUpdates.java   |   4 +-
 .../org/apache/solr/cloud/ZkControllerTest.java    |   3 +-
 .../org/apache/solr/cloud/ZkShardTermsTest.java    |  24 ++--
 .../solr/cloud/api/collections/ShardSplitTest.java |   4 +-
 .../TestCollectionsAPIViaSolrCloudCluster.java     |   2 +-
 .../cloud/overseer/TestClusterStateMutator.java    |   3 +-
 .../solr/cloud/overseer/ZkStateReaderTest.java     |  33 +++--
 .../solr/cloud/overseer/ZkStateWriterTest.java     |  66 ++++-----
 .../cluster/events/ClusterEventProducerTest.java   |  14 +-
 .../impl/CollectionsRepairEventListenerTest.java   |   4 +-
 .../maintenance/InactiveShardRemoverTest.java      |   5 +-
 .../impl/PlacementPluginIntegrationTest.java       |  15 +-
 .../plugins/SimplePlacementFactoryTest.java        |   2 +-
 .../test/org/apache/solr/core/CoreSorterTest.java  |   5 +-
 .../apache/solr/core/DirectoryFactoriesTest.java   |   4 +-
 .../org/apache/solr/core/ResourceLoaderTest.java   |   4 +-
 .../org/apache/solr/core/TestConfigSetService.java |   5 +-
 .../test/org/apache/solr/core/TestInitParams.java  |  12 +-
 .../solr/filestore/TestDistribFileStore.java       |   2 +
 .../DocumentAnalysisRequestHandlerTest.java        |   8 +-
 .../apache/solr/handler/TestContainerPlugin.java   |  23 ++-
 .../solr/handler/admin/AdminHandlersProxyTest.java |   9 +-
 .../handler/admin/SecurityConfHandlerTest.java     |  19 ++-
 .../solr/handler/admin/TestApiFramework.java       |   3 +-
 .../handler/admin/ZookeeperStatusHandlerTest.java  |   7 +-
 .../component/ParallelHttpShardHandlerTest.java    |   4 +-
 .../solr/handler/component/StatsComponentTest.java |  15 +-
 .../handler/designer/ManagedSchemaDiffTest.java    |   3 +-
 .../handler/designer/TestSchemaDesignerAPI.java    |  39 +++--
 .../TestSchemaDesignerConfigSetHelper.java         |  35 ++---
 .../designer/TestSchemaDesignerSettingsDAO.java    |   5 +-
 .../tagger/EmbeddedSolrNoSerializeTest.java        |   4 +-
 .../apache/solr/handler/tagger/TaggerTestCase.java |   4 +-
 .../solr/handler/tagger/XmlInterpolationTest.java  |   5 +-
 .../org/apache/solr/highlight/HighlighterTest.java |   6 +-
 .../solr/packagemanager/TestPackageManager.java    |  11 +-
 .../src/test/org/apache/solr/pkg/TestPackages.java |  21 ++-
 .../solr/request/macro/TestMacroExpander.java      |   3 +-
 .../org/apache/solr/response/TestPushWriter.java   |  14 +-
 .../solr/response/TestRetrieveFieldsOptimizer.java |   4 +-
 .../transform/TestSubQueryTransformerDistrib.java  |   8 +-
 .../solr/search/CurrencyRangeFacetCloudTest.java   |   5 +-
 .../org/apache/solr/search/LargeFieldTest.java     |   4 +-
 .../solr/search/TestMaxScoreQueryParser.java       |   6 +-
 .../search/TestRandomCollapseQParserPlugin.java    |   6 +-
 .../org/apache/solr/search/TestSolr4Spatial2.java  |   2 +-
 .../test/org/apache/solr/search/TestThinCache.java |   6 +-
 .../solr/search/facet/RangeFacetCloudTest.java     |   4 +-
 .../search/facet/TestCloudJSONFacetSKGEquiv.java   |   5 +-
 .../apache/solr/search/facet/TestJsonFacets.java   |  10 +-
 .../solr/search/join/ShardToShardJoinAbstract.java |   4 +-
 .../TestSweetSpotSimilarityFactory.java            |   4 +-
 .../solr/security/AuditLoggerIntegrationTest.java  |   4 +-
 .../solr/security/AuditLoggerPluginTest.java       |  12 +-
 .../BaseTestRuleBasedAuthorizationPlugin.java      |  57 ++++----
 .../solr/security/BasicAuthIntegrationTest.java    |  15 +-
 .../solr/security/BasicAuthStandaloneTest.java     |   9 +-
 .../security/PKIAuthenticationIntegrationTest.java |   6 +-
 ...stExternalRoleRuleBasedAuthorizationPlugin.java |   4 +-
 .../security/TestSha256AuthenticationProvider.java |  16 +--
 .../solr/spelling/DirectSolrSpellCheckerTest.java  |   4 +-
 .../solr/spelling/FileBasedSpellCheckerTest.java   |   4 +-
 .../solr/spelling/IndexBasedSpellCheckerTest.java  |   4 +-
 .../solr/uninverting/TestFieldCacheSort.java       | 160 ++++++---------------
 .../solr/uninverting/TestUninvertingReader.java    |  13 +-
 .../org/apache/solr/update/AddBlockUpdateTest.java |   3 +-
 .../solr/update/DeleteByIdWithRouterFieldTest.java |   5 +-
 .../test/org/apache/solr/update/PeerSyncTest.java  |   7 +-
 .../apache/solr/update/SolrCmdDistributorTest.java |   3 +-
 .../solr/update/TestInPlaceUpdatesDistrib.java     |   4 +-
 .../solr/update/TestInPlaceUpdatesStandalone.java  |   2 +-
 .../AddSchemaFieldsUpdateProcessorFactoryTest.java |  26 ++--
 .../update/processor/NestedAtomicUpdateTest.java   | 155 ++++++--------------
 .../SignatureUpdateProcessorFactoryTest.java       |   5 +-
 .../TimeRoutedAliasUpdateProcessorTest.java        |  17 ++-
 .../org/apache/solr/util/SolrPluginUtilsTest.java  |   6 +-
 .../src/test/org/apache/solr/util/TestUtils.java   |   5 +-
 .../manager/consumer/KafkaCrossDcConsumer.java     |   5 +-
 .../crossdc/manager/consumer/PartitionManager.java |   4 +-
 .../manager/consumer/KafkaCrossDcConsumerTest.java |  15 +-
 .../manager/consumer/PartitionManagerTest.java     |  11 +-
 .../org/apache/solr/schema/ICUCollationField.java  |   3 +-
 .../DocumentCategorizerUpdateProcessorFactory.java |   3 +-
 ...ExtractNamedEntitiesUpdateProcessorFactory.java |   3 +-
 .../handler/clustering/ClusteringComponent.java    |   3 +-
 .../apache/solr/security/jwt/JWTAuthPlugin.java    |   3 +-
 .../apache/solr/security/jwt/JWTIssuerConfig.java  |   6 +-
 .../solr/security/jwt/JWTAuthPluginTest.java       |   3 +-
 .../apache/solr/ltr/feature/FieldValueFeature.java |   3 +-
 .../apache/solr/ltr/model/TestWrapperModel.java    |   7 +-
 .../solr/common/cloud/PerReplicaStatesOps.java     |   4 +-
 .../apache/solr/common/cloud/ZkStateReader.java    |  10 +-
 .../client/solrj/impl/NodeValueFetcherTest.java    |   5 +-
 .../apache/solr/common/cloud/SolrZkClientTest.java |   6 +-
 .../solr/client/solrj/RemoteSolrException.java     |   4 +-
 .../org/apache/solr/client/solrj/SolrClient.java   |   3 +-
 .../client/solrj/beans/DocumentObjectBinder.java   |   3 +-
 .../solr/client/solrj/impl/CloudSolrClient.java    |   3 +-
 .../solrj/impl/DelegatingClusterStateProvider.java |   3 +-
 .../solrj/request/ConfigSetAdminRequest.java       |   3 +-
 .../routing/NodePreferenceRulesComparator.java     |   3 +-
 .../org/apache/solr/common/SolrInputField.java     |   3 +-
 .../java/org/apache/solr/common/cloud/Aliases.java |  11 +-
 .../solr/common/cloud/CompositeIdRouter.java       |   6 +-
 .../apache/solr/common/cloud/HashBasedRouter.java  |   3 +-
 .../solr/common/cloud/ImplicitDocRouter.java       |   4 +-
 .../org/apache/solr/common/cloud/ZkNodeProps.java  |   3 +-
 .../apache/solr/common/util/CommandOperation.java  |   9 +-
 .../solr/common/util/JsonSchemaValidator.java      |   3 +-
 .../org/apache/solr/common/util/RetryUtil.java     |   3 +-
 .../java/org/apache/solr/common/util/Utils.java    |   6 +-
 .../impl/CloudHttp2SolrClientBuilderTest.java      |  31 ++--
 .../solrj/impl/CloudHttp2SolrClientRetryTest.java  |   4 +-
 .../solrj/impl/CloudHttp2SolrClientTest.java       |  23 ++-
 .../solrj/impl/CloudSolrClientCacheTest.java       |   4 +-
 .../solrj/impl/CloudSolrClientRoutingTest.java     |   4 +-
 .../client/solrj/impl/HttpClusterStateSSLTest.java |   5 +-
 .../client/solrj/impl/HttpJdkSolrClientTest.java   |   4 +-
 .../client/solrj/impl/HttpSolrClientTestBase.java  |  17 +--
 .../client/solrj/impl/LBAsyncSolrClientTest.java   |   3 +-
 .../impl/SendUpdatesToLeadersOverrideTest.java     |  16 +--
 .../solr/client/solrj/request/SchemaTest.java      |   7 +-
 .../solrj/response/NestableJsonFacetTest.java      |   6 +-
 .../cloud/PerReplicaStatesIntegrationTest.java     |   8 +-
 .../solr/common/util/TestJsonRecordReader.java     |  19 ++-
 .../org/apache/solr/common/util/TestPathTrie.java  |   3 +-
 .../solr/client/solrj/apache/HttpSolrClient.java   |   3 +-
 .../solr/cloud/AbstractFullDistribZkTestBase.java  |   4 +-
 .../apache/solr/cloud/MiniSolrCloudCluster.java    |   5 +-
 .../apache/solr/cloud/SolrCloudAuthTestCase.java   |   3 +-
 .../component/DummyCustomParamSpellChecker.java    |   2 +-
 .../apache/solr/schema/SortableBinaryField.java    |   3 +-
 .../java/org/apache/solr/util/SecurityJson.java    |   9 +-
 244 files changed, 773 insertions(+), 1224 deletions(-)

diff --git a/gradle/validation/forbidden-apis/defaults.all.txt b/gradle/validation/forbidden-apis/defaults.all.txt
index eeab02a0dca..72ab6c8ded9 100644
--- a/gradle/validation/forbidden-apis/defaults.all.txt
+++ b/gradle/validation/forbidden-apis/defaults.all.txt
@@ -63,6 +63,15 @@ java.util.Collections#emptySet()
 @defaultMessage Use Map.of()
 java.util.Collections#emptyMap()
 
+@defaultMessage Use Set.of()
+java.util.Collections#singleton(**)
+
+@defaultMessage Use List.of()
+java.util.Collections#singletonList(**)
+
+@defaultMessage Use Map.of()
+java.util.Collections#singletonMap(**)
+
 java.util.Locale#forLanguageTag(java.lang.String) @ use new Locale.Builder().setLanguageTag(...).build() which has error handling
 java.util.Locale#toString() @ use Locale#toLanguageTag() for a standardized BCP47 locale name
 
diff --git a/solr/benchmark/src/java/org/apache/solr/bench/generators/Maps.java b/solr/benchmark/src/java/org/apache/solr/bench/generators/Maps.java
index 9ab4327b2c8..d6b4e9f90d0 100644
--- a/solr/benchmark/src/java/org/apache/solr/bench/generators/Maps.java
+++ b/solr/benchmark/src/java/org/apache/solr/bench/generators/Maps.java
@@ -16,7 +16,6 @@
  */
 package org.apache.solr.bench.generators;
 
-import java.util.Collections;
 import java.util.Map;
 import java.util.function.Function;
 import java.util.stream.Collector;
@@ -105,6 +104,6 @@ public class Maps {
    * @return the map . entry
    */
   static <K, V> Map.Entry<K, V> mapEntry(K k, V v) {
-    return Collections.singletonMap(k, v).entrySet().iterator().next();
+    return Map.of(k, v).entrySet().iterator().next();
   }
 }
diff --git a/solr/benchmark/src/test/org/apache/solr/bench/SolrBenchStateTest.java b/solr/benchmark/src/test/org/apache/solr/bench/SolrBenchStateTest.java
index 6aabc965720..8c5e302012d 100644
--- a/solr/benchmark/src/test/org/apache/solr/bench/SolrBenchStateTest.java
+++ b/solr/benchmark/src/test/org/apache/solr/bench/SolrBenchStateTest.java
@@ -26,7 +26,7 @@ import static org.apache.solr.bench.generators.SourceDSL.longs;
 import static org.apache.solr.bench.generators.SourceDSL.strings;
 
 import com.carrotsearch.randomizedtesting.annotations.ThreadLeakLingering;
-import java.util.Collections;
+import java.util.List;
 import java.util.concurrent.TimeUnit;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.request.QueryRequest;
@@ -61,7 +61,7 @@ public class SolrBenchStateTest extends SolrTestCaseJ4 {
             true,
             1,
             new int[] {1},
-            Collections.singletonList("label"),
+            List.of("label"),
             0,
             0,
             new IterationParams(IterationType.WARMUP, 1, TimeValue.milliseconds(10), 1),
@@ -71,7 +71,7 @@ public class SolrBenchStateTest extends SolrTestCaseJ4 {
             TimeUnit.SECONDS,
             1,
             "jvm",
-            Collections.singletonList("jvmArg"),
+            List.of("jvmArg"),
             "jdkVersion",
             "vmName",
             "vmVersion",
diff --git a/solr/core/src/java/org/apache/solr/api/AnnotatedApi.java b/solr/core/src/java/org/apache/solr/api/AnnotatedApi.java
index 76df23de362..68cd3cc4660 100644
--- a/solr/core/src/java/org/apache/solr/api/AnnotatedApi.java
+++ b/solr/core/src/java/org/apache/solr/api/AnnotatedApi.java
@@ -29,7 +29,6 @@ import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -130,15 +129,15 @@ public class AnnotatedApi extends Api implements PermissionNameProvider, Closeab
         throw new RuntimeException("No method with @Command in class: " + klas.getName());
       }
       SpecProvider specProvider = readSpec(endPoint, methods);
-      return Collections.singletonList(new AnnotatedApi(specProvider, endPoint, commands, null));
+      return List.of(new AnnotatedApi(specProvider, endPoint, commands, null));
     } else {
       List<Api> apis = new ArrayList<>();
       for (Method m : klas.getMethods()) {
         EndPoint endPoint = m.getAnnotation(EndPoint.class);
         if (endPoint == null) continue;
         Cmd cmd = new Cmd("", obj, m);
-        SpecProvider specProvider = readSpec(endPoint, Collections.singletonList(m));
-        apis.add(new AnnotatedApi(specProvider, endPoint, Collections.singletonMap("", cmd), null));
+        SpecProvider specProvider = readSpec(endPoint, List.of(m));
+        apis.add(new AnnotatedApi(specProvider, endPoint, Map.of("", cmd), null));
       }
       if (!allowEmpty && apis.isEmpty()) {
         throw new RuntimeException("Invalid Class : " + klas.getName() + " No @EndPoints");
@@ -170,9 +169,7 @@ public class AnnotatedApi extends Api implements PermissionNameProvider, Closeab
         methods.add(method.name());
       }
       map.put("methods", methods);
-      map.put(
-          "url",
-          new ValidatingJsonMap(Collections.singletonMap("paths", Arrays.asList(endPoint.path()))));
+      map.put("url", new ValidatingJsonMap(Map.of("paths", Arrays.asList(endPoint.path()))));
       Map<String, Object> cmds = new HashMap<>();
 
       for (Method method : m) {
@@ -359,7 +356,7 @@ public class AnnotatedApi extends Api implements PermissionNameProvider, Closeab
         throw new SolrErrorWrappingException(
             SolrException.ErrorCode.BAD_REQUEST,
             "Error executing command",
-            CommandOperation.captureErrors(Collections.singletonList(cmd)));
+            CommandOperation.captureErrors(List.of(cmd)));
       }
     }
   }
diff --git a/solr/core/src/java/org/apache/solr/api/ApiBag.java b/solr/core/src/java/org/apache/solr/api/ApiBag.java
index 89cf2796084..935881369d2 100644
--- a/solr/core/src/java/org/apache/solr/api/ApiBag.java
+++ b/solr/core/src/java/org/apache/solr/api/ApiBag.java
@@ -28,7 +28,6 @@ import java.lang.invoke.MethodHandles;
 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.List;
@@ -276,9 +275,9 @@ public class ApiBag {
         if (commands != null) {
           ValidatingJsonMap m = commands.getMap(cmd, null);
           if (m == null) {
-            specCopy.put("commands", Collections.singletonMap(cmd, "Command not found!"));
+            specCopy.put("commands", Map.of(cmd, "Command not found!"));
           } else {
-            specCopy.put("commands", Collections.singletonMap(cmd, m));
+            specCopy.put("commands", Map.of(cmd, m));
           }
         }
         result = specCopy;
@@ -386,7 +385,7 @@ public class ApiBag {
         final ValidatingJsonMap spec = new ValidatingJsonMap();
         spec.put("methods", List.of("GET", "POST"));
         final ValidatingJsonMap urlMap = new ValidatingJsonMap();
-        urlMap.put("paths", Collections.singletonList("$" + HANDLER_NAME));
+        urlMap.put("paths", List.of("$" + HANDLER_NAME));
         spec.put("url", urlMap);
         return spec;
       };
@@ -398,7 +397,7 @@ public class ApiBag {
   public void registerLazy(PluginBag.PluginHolder<SolrRequestHandler> holder, PluginInfo info) {
     register(
         new LazyLoadedApi(HANDLER_NAME_SPEC_PROVIDER, holder),
-        Collections.singletonMap(HANDLER_NAME, info.attributes.get(NAME)));
+        Map.of(HANDLER_NAME, info.attributes.get(NAME)));
   }
 
   public static SpecProvider constructSpec(PluginInfo info) {
@@ -417,8 +416,7 @@ public class ApiBag {
       ContentStream stream, Map<String, JsonSchemaValidator> validators, boolean validate) {
     List<CommandOperation> parsedCommands = null;
     try {
-      parsedCommands =
-          CommandOperation.readCommands(Collections.singleton(stream), new NamedList<>());
+      parsedCommands = CommandOperation.readCommands(Set.of(stream), new NamedList<>());
     } catch (IOException e) {
       throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "Unable to parse commands", e);
     }
diff --git a/solr/core/src/java/org/apache/solr/cli/CLIUtils.java b/solr/core/src/java/org/apache/solr/cli/CLIUtils.java
index 1c05377e889..34c91e11919 100644
--- a/solr/core/src/java/org/apache/solr/cli/CLIUtils.java
+++ b/solr/core/src/java/org/apache/solr/cli/CLIUtils.java
@@ -26,7 +26,6 @@ import java.net.URI;
 import java.net.URISyntaxException;
 import java.nio.file.Path;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -280,7 +279,7 @@ public final class CLIUtils {
 
   public static CloudSolrClient getCloudSolrClient(
       String zkHost, HttpJettySolrClient.Builder builder) {
-    return new CloudSolrClient.Builder(Collections.singletonList(zkHost), Optional.empty())
+    return new CloudSolrClient.Builder(List.of(zkHost), Optional.empty())
         .withHttpClientBuilder(builder)
         .build();
   }
diff --git a/solr/core/src/java/org/apache/solr/cli/ExportTool.java b/solr/core/src/java/org/apache/solr/cli/ExportTool.java
index 6fd43b52a1c..20314c6ee1c 100644
--- a/solr/core/src/java/org/apache/solr/cli/ExportTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/ExportTool.java
@@ -36,7 +36,6 @@ import java.nio.file.Path;
 import java.time.Instant;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -247,9 +246,7 @@ public class ExportTool extends ToolBase {
       var builder = new HttpJettySolrClient.Builder().withOptionalBasicAuthCredentials(credentials);
 
       solrClient =
-          new CloudSolrClient.Builder(Collections.singletonList(baseurl))
-              .withHttpClientBuilder(builder)
-              .build();
+          new CloudSolrClient.Builder(List.of(baseurl)).withHttpClientBuilder(builder).build();
       NamedList<Object> response =
           solrClient.request(
               new GenericSolrRequest(
diff --git a/solr/core/src/java/org/apache/solr/cli/RunExampleTool.java b/solr/core/src/java/org/apache/solr/cli/RunExampleTool.java
index e1d002cf21e..8db32fc0b66 100644
--- a/solr/core/src/java/org/apache/solr/cli/RunExampleTool.java
+++ b/solr/core/src/java/org/apache/solr/cli/RunExampleTool.java
@@ -28,8 +28,8 @@ import java.nio.file.Path;
 import java.nio.file.StandardCopyOption;
 import java.time.Duration;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Optional;
@@ -674,7 +674,7 @@ public class RunExampleTool extends ToolBase {
   /** wait until the number of live nodes == numNodes. */
   protected void waitToSeeLiveNodes(String zkHost, int numNodes) {
     try (CloudSolrClient cloudClient =
-        new CloudSolrClient.Builder(Collections.singletonList(zkHost), Optional.empty()).build()) {
+        new CloudSolrClient.Builder(List.of(zkHost), Optional.empty()).build()) {
       Set<String> liveNodes = cloudClient.getClusterState().getLiveNodes();
       int numLiveNodes = (liveNodes != null) ? liveNodes.size() : 0;
       long timeoutNanos = System.nanoTime() + TimeUnit.NANOSECONDS.convert(10, TimeUnit.SECONDS);
diff --git a/solr/core/src/java/org/apache/solr/cloud/DistributedClusterStateUpdater.java b/solr/core/src/java/org/apache/solr/cloud/DistributedClusterStateUpdater.java
index 018d396a80d..cac60d45ce1 100644
--- a/solr/core/src/java/org/apache/solr/cloud/DistributedClusterStateUpdater.java
+++ b/solr/core/src/java/org/apache/solr/cloud/DistributedClusterStateUpdater.java
@@ -17,14 +17,12 @@
 
 package org.apache.solr.cloud;
 
-import static java.util.Collections.singletonMap;
 import static org.apache.solr.cloud.overseer.ZkStateWriter.NO_OP;
 import static org.apache.solr.common.cloud.ZkStateReader.COLLECTIONS_ZKNODE;
 
 import java.lang.invoke.MethodHandles;
 import java.time.Instant;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -547,7 +545,7 @@ public class DistributedClusterStateUpdater {
       } else {
         // Collection update or creation
         DocCollection collection = updatedState.getCollection(updater.getCollectionName());
-        byte[] stateJson = Utils.toJSON(singletonMap(updater.getCollectionName(), collection));
+        byte[] stateJson = Utils.toJSON(Map.of(updater.getCollectionName(), collection));
 
         if (updater.isCollectionCreation()) {
           // The state.json file does not exist yet (more precisely it is assumed not to exist)
@@ -939,10 +937,7 @@ public class DistributedClusterStateUpdater {
             (zkcmd != ZkStateWriter.NO_OP)
                 ? clusterState.copyWith(zkcmd.name, zkcmd.collection)
                 : null;
-        replicaOpsList =
-            (zkcmd.ops != null && zkcmd.ops.get() != null)
-                ? Collections.singletonList(zkcmd.ops)
-                : null;
+        replicaOpsList = (zkcmd.ops != null && zkcmd.ops.get() != null) ? List.of(zkcmd.ops) : null;
       } else {
         computedState = null;
         replicaOpsList = null;
diff --git a/solr/core/src/java/org/apache/solr/cloud/Overseer.java b/solr/core/src/java/org/apache/solr/cloud/Overseer.java
index 4b29aba7f1b..c1f3eefcdb2 100644
--- a/solr/core/src/java/org/apache/solr/cloud/Overseer.java
+++ b/solr/core/src/java/org/apache/solr/cloud/Overseer.java
@@ -24,7 +24,6 @@ import java.io.Closeable;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayDeque;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -508,40 +507,39 @@ public class Overseer implements SolrCloseable {
       if (collectionAction != null) {
         switch (collectionAction) {
           case CREATE:
-            return Collections.singletonList(
+            return List.of(
                 new ClusterStateMutator(getSolrCloudManager())
                     .createCollection(clusterState, message));
           case DELETE:
-            return Collections.singletonList(
+            return List.of(
                 new ClusterStateMutator(getSolrCloudManager())
                     .deleteCollection(clusterState, message));
           case CREATESHARD:
-            return Collections.singletonList(
+            return List.of(
                 new CollectionMutator(getSolrCloudManager()).createShard(clusterState, message));
           case DELETESHARD:
-            return Collections.singletonList(
+            return List.of(
                 new CollectionMutator(getSolrCloudManager()).deleteShard(clusterState, message));
           case ADDREPLICA:
-            return Collections.singletonList(
+            return List.of(
                 new SliceMutator(getSolrCloudManager()).addReplica(clusterState, message));
           case ADDREPLICAPROP:
-            return Collections.singletonList(
+            return List.of(
                 new ReplicaMutator(getSolrCloudManager())
                     .addReplicaProperty(clusterState, message));
           case DELETEREPLICAPROP:
-            return Collections.singletonList(
+            return List.of(
                 new ReplicaMutator(getSolrCloudManager())
                     .deleteReplicaProperty(clusterState, message));
           case BALANCESHARDUNIQUE:
             ExclusiveSliceProperty dProp = new ExclusiveSliceProperty(clusterState, message);
             if (dProp.balanceProperty()) {
               String collName = message.getStr(ZkStateReader.COLLECTION_PROP);
-              return Collections.singletonList(
-                  new ZkWriteCommand(collName, dProp.getDocCollection()));
+              return List.of(new ZkWriteCommand(collName, dProp.getDocCollection()));
             }
             break;
           case MODIFYCOLLECTION:
-            return Collections.singletonList(
+            return List.of(
                 new CollectionMutator(getSolrCloudManager())
                     .modifyCollection(clusterState, message));
           default:
@@ -556,22 +554,22 @@ public class Overseer implements SolrCloseable {
         }
         switch (overseerAction) {
           case STATE:
-            return Collections.singletonList(
+            return List.of(
                 new ReplicaMutator(getSolrCloudManager()).setState(clusterState, message));
           case LEADER:
-            return Collections.singletonList(
+            return List.of(
                 new SliceMutator(getSolrCloudManager()).setShardLeader(clusterState, message));
           case DELETECORE:
-            return Collections.singletonList(
+            return List.of(
                 new SliceMutator(getSolrCloudManager()).removeReplica(clusterState, message));
           case ADDROUTINGRULE:
-            return Collections.singletonList(
+            return List.of(
                 new SliceMutator(getSolrCloudManager()).addRoutingRule(clusterState, message));
           case REMOVEROUTINGRULE:
-            return Collections.singletonList(
+            return List.of(
                 new SliceMutator(getSolrCloudManager()).removeRoutingRule(clusterState, message));
           case UPDATESHARDSTATE:
-            return Collections.singletonList(
+            return List.of(
                 new SliceMutator(getSolrCloudManager()).updateShardState(clusterState, message));
           case QUIT:
             if (myId.equals(message.get(ID))) {
@@ -592,7 +590,7 @@ public class Overseer implements SolrCloseable {
         }
       }
 
-      return Collections.singletonList(ZkStateWriter.NO_OP);
+      return List.of(ZkStateWriter.NO_OP);
     }
 
     private LeaderStatus amILeader() {
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/AddReplicaCmd.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/AddReplicaCmd.java
index 91392c11146..162dc555a8a 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/AddReplicaCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/AddReplicaCmd.java
@@ -32,9 +32,9 @@ import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 import org.apache.solr.client.solrj.cloud.SolrCloudManager;
@@ -287,7 +287,7 @@ public class AddReplicaCmd implements CollApiCmds.CollectionApiCommand {
                 ccc.getZkStateReader(),
                 ccc.getSolrCloudManager().getTimeSource(),
                 collectionName,
-                Collections.singleton(createReplica.coreName))
+                Set.of(createReplica.coreName))
             .get(createReplica.coreName)
             .getName());
 
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/Assign.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/Assign.java
index 4c260c9ab9e..b7f46c078a7 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/Assign.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/Assign.java
@@ -297,7 +297,7 @@ public class Assign {
     AssignRequest assignRequest =
         new AssignRequestBuilder()
             .forCollection(collectionName)
-            .forShard(Collections.singletonList(shard))
+            .forShard(List.of(shard))
             .assignReplicas(numReplicas)
             .onNodes(createNodeList)
             .build();
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/CollectionHandlingUtils.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/CollectionHandlingUtils.java
index 6ba0bc39a6f..02320e1e854 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/CollectionHandlingUtils.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/CollectionHandlingUtils.java
@@ -377,7 +377,7 @@ public class CollectionHandlingUtils {
       BackupRepository repository, URI backupUri, BackupId backupId, CollectionCommandContext ccc)
       throws Exception {
     new DeleteBackupCmd(ccc)
-        .deleteBackupIds(backupUri, repository, Collections.singleton(backupId), new NamedList<>());
+        .deleteBackupIds(backupUri, repository, Set.of(backupId), new NamedList<>());
   }
 
   static void deleteBackup(
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateAliasCmd.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateAliasCmd.java
index 53de754285f..5bba5e4affc 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateAliasCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateAliasCmd.java
@@ -19,7 +19,6 @@ package org.apache.solr.cloud.api.collections;
 import static org.apache.solr.common.SolrException.ErrorCode.BAD_REQUEST;
 import static org.apache.solr.common.SolrException.ErrorCode.SERVER_ERROR;
 
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -179,8 +178,7 @@ public class CreateAliasCmd extends AliasCmd {
     // Create the collection
     createCollectionAndWait(
         adminCmdContext, aliasName, aliasProperties, initialCollectionName, ccc);
-    validateAllCollectionsExistAndNoDuplicates(
-        Collections.singletonList(initialCollectionName), zkStateReader);
+    validateAllCollectionsExistAndNoDuplicates(List.of(initialCollectionName), zkStateReader);
   }
 
   private void validateAllCollectionsExistAndNoDuplicates(
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateCollectionCmd.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateCollectionCmd.java
index bc70f3bc955..dd6fdf2da63 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateCollectionCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateCollectionCmd.java
@@ -32,7 +32,6 @@ import static org.apache.solr.handler.admin.ConfigSetsHandler.getSuffixedNameFor
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -200,7 +199,7 @@ public class CreateCollectionCmd implements CollApiCmds.CollectionApiCommand {
         // TODO: Consider doing this for all collections, not just the PRS collections.
         ZkWriteCommand command =
             new ClusterStateMutator(ccc.getSolrCloudManager()).createCollection(clusterState, m);
-        byte[] data = Utils.toJSON(Collections.singletonMap(collectionName, command.collection));
+        byte[] data = Utils.toJSON(Map.of(collectionName, command.collection));
         ccc.getZkStateReader().getZkClient().create(collectionPath, data, CreateMode.PERSISTENT);
         clusterState = clusterState.copyWith(collectionName, command.collection);
         newColl = command.collection;
@@ -374,9 +373,7 @@ public class CreateCollectionCmd implements CollApiCmds.CollectionApiCommand {
       // Update the state.json for PRS collection in a single operation
       if (isPRS) {
         byte[] data =
-            Utils.toJSON(
-                Collections.singletonMap(
-                    collectionName, clusterState.getCollection(collectionName)));
+            Utils.toJSON(Map.of(collectionName, clusterState.getCollection(collectionName)));
         zkStateReader.getZkClient().setData(collectionPath, data);
       }
 
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/DeleteBackupCmd.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/DeleteBackupCmd.java
index dfec0e3bb0e..6b81d28cf0c 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/DeleteBackupCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/DeleteBackupCmd.java
@@ -270,7 +270,7 @@ public class DeleteBackupCmd implements CollApiCmds.CollectionApiCommand {
           "Backup ID [" + bid + "] not found; cannot be deleted");
     }
 
-    deleteBackupIds(backupPath, repository, Collections.singleton(backupId), results);
+    deleteBackupIds(backupPath, repository, Set.of(backupId), results);
   }
 
   static final class PurgeGraph {
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/DeleteCollectionCmd.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/DeleteCollectionCmd.java
index 9c292863ece..7e6d9ff3f1f 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/DeleteCollectionCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/DeleteCollectionCmd.java
@@ -23,7 +23,6 @@ import static org.apache.solr.common.params.CommonParams.NAME;
 
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -53,7 +52,7 @@ public class DeleteCollectionCmd implements CollApiCmds.CollectionApiCommand {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   private static final Set<String> okayExceptions =
-      Collections.singleton(NonExistentCoreException.class.getName());
+      Set.of(NonExistentCoreException.class.getName());
 
   private final CollectionCommandContext ccc;
 
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/MigrateReplicasCmd.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/MigrateReplicasCmd.java
index a45a64f4697..779ab999197 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/MigrateReplicasCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/MigrateReplicasCmd.java
@@ -19,7 +19,6 @@ package org.apache.solr.cloud.api.collections;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -96,7 +95,7 @@ public class MigrateReplicasCmd implements CollApiCmds.CollectionApiCommand {
         Assign.AssignRequest assignRequest =
             new Assign.AssignRequestBuilder()
                 .forCollection(sourceReplica.getCollection())
-                .forShard(Collections.singletonList(sourceReplica.getShard()))
+                .forShard(List.of(sourceReplica.getShard()))
                 .assignReplicas(ReplicaCount.of(sourceReplica.getType(), 1))
                 .onNodes(targetNodeList)
                 .build();
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/MoveReplicaCmd.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/MoveReplicaCmd.java
index 89a5f32c930..634b2374633 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/MoveReplicaCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/MoveReplicaCmd.java
@@ -389,8 +389,7 @@ public class MoveReplicaCmd implements CollApiCmds.CollectionApiCommand {
     log.debug("props {}", props);
     if (replica.equals(slice.getLeader()) || waitForFinalState) {
       watcher =
-          new ActiveReplicaWatcher(
-              coll.getName(), null, Collections.singletonList(newCoreName), countDownLatch);
+          new ActiveReplicaWatcher(coll.getName(), null, List.of(newCoreName), countDownLatch);
       log.debug("-- registered watcher {}", watcher);
       ccc.getZkStateReader().registerCollectionStateWatcher(coll.getName(), watcher);
     }
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/ReplaceNodeCmd.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/ReplaceNodeCmd.java
index 382f7dd9e2e..26a3730ca10 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/ReplaceNodeCmd.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/ReplaceNodeCmd.java
@@ -18,7 +18,6 @@
 package org.apache.solr.cloud.api.collections;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -80,7 +79,7 @@ public class ReplaceNodeCmd implements CollApiCmds.CollectionApiCommand {
         Assign.AssignRequest assignRequest =
             new Assign.AssignRequestBuilder()
                 .forCollection(sourceReplica.getCollection())
-                .forShard(Collections.singletonList(sourceReplica.getShard()))
+                .forShard(List.of(sourceReplica.getShard()))
                 .assignReplicas(ReplicaCount.of(sourceReplica.getType(), 1))
                 .onNodes(
                     ccc.getSolrCloudManager().getClusterStateProvider().getLiveNodes().stream()
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/ReplicaMigrationUtils.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/ReplicaMigrationUtils.java
index 498695f4f9f..be08e6fc573 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/ReplicaMigrationUtils.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/ReplicaMigrationUtils.java
@@ -21,7 +21,6 @@ import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
@@ -159,7 +158,7 @@ public class ReplicaMigrationUtils {
                 new ActiveReplicaWatcher(
                     sourceCollection,
                     null,
-                    Collections.singletonList(addedReplica.getStr(ZkStateReader.CORE_NAME_PROP)),
+                    List.of(addedReplica.getStr(ZkStateReader.CORE_NAME_PROP)),
                     replicasToRecover);
           } else {
             watcher =
diff --git a/solr/core/src/java/org/apache/solr/cloud/api/collections/TimeRoutedAlias.java b/solr/core/src/java/org/apache/solr/cloud/api/collections/TimeRoutedAlias.java
index fd8b1cab552..8139956116e 100644
--- a/solr/core/src/java/org/apache/solr/cloud/api/collections/TimeRoutedAlias.java
+++ b/solr/core/src/java/org/apache/solr/cloud/api/collections/TimeRoutedAlias.java
@@ -36,7 +36,6 @@ import java.time.temporal.ChronoField;
 import java.time.temporal.ChronoUnit;
 import java.util.AbstractMap;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
@@ -673,7 +672,7 @@ public class TimeRoutedAlias extends RoutedAlias {
       String mostRecentTime = mostRecentCol.substring(getAliasName().length() + sepLen);
       Instant parsed = DATE_TIME_FORMATTER.parse(mostRecentTime, Instant::from);
       String nextCol = calcNextCollection(parsed);
-      return Collections.singletonList(new Action(this, ActionType.ENSURE_EXISTS, nextCol));
+      return List.of(new Action(this, ActionType.ENSURE_EXISTS, nextCol));
     } else {
       return List.of();
     }
diff --git a/solr/core/src/java/org/apache/solr/cloud/overseer/ZkStateWriter.java b/solr/core/src/java/org/apache/solr/cloud/overseer/ZkStateWriter.java
index 9660887b659..5ee0fd03fa3 100644
--- a/solr/core/src/java/org/apache/solr/cloud/overseer/ZkStateWriter.java
+++ b/solr/core/src/java/org/apache/solr/cloud/overseer/ZkStateWriter.java
@@ -16,8 +16,6 @@
  */
 package org.apache.solr.cloud.overseer;
 
-import static java.util.Collections.singletonMap;
-
 import com.codahale.metrics.Timer;
 import java.lang.invoke.MethodHandles;
 import java.time.Instant;
@@ -287,7 +285,7 @@ public class ZkStateWriter {
             log.debug("going to delete state.json {}", path);
             reader.getZkClient().clean(path);
           } else {
-            byte[] data = Utils.toJSON(singletonMap(c.getName(), c));
+            byte[] data = Utils.toJSON(Map.of(c.getName(), c));
             if (minStateByteLenForCompression > -1 && data.length > minStateByteLenForCompression) {
               // When compressing state.json, we expect at least a 10:1 compression ratio.
               data = compressor.compressBytes(data, data.length / 10);
diff --git a/solr/core/src/java/org/apache/solr/cluster/events/impl/CollectionsRepairEventListener.java b/solr/core/src/java/org/apache/solr/cluster/events/impl/CollectionsRepairEventListener.java
index e52e33d5ff9..0d8c26d6c06 100644
--- a/solr/core/src/java/org/apache/solr/cluster/events/impl/CollectionsRepairEventListener.java
+++ b/solr/core/src/java/org/apache/solr/cluster/events/impl/CollectionsRepairEventListener.java
@@ -21,7 +21,6 @@ import java.io.Closeable;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -187,7 +186,7 @@ public class CollectionsRepairEventListener
                       Assign.AssignRequest assignRequest =
                           new Assign.AssignRequestBuilder()
                               .forCollection(coll.getName())
-                              .forShard(Collections.singletonList(shard))
+                              .forShard(List.of(shard))
                               .assignReplicas(types)
                               .build();
                       try {
diff --git a/solr/core/src/java/org/apache/solr/cluster/placement/PlacementPlugin.java b/solr/core/src/java/org/apache/solr/cluster/placement/PlacementPlugin.java
index 0739996e118..d2924d344b8 100644
--- a/solr/core/src/java/org/apache/solr/cluster/placement/PlacementPlugin.java
+++ b/solr/core/src/java/org/apache/solr/cluster/placement/PlacementPlugin.java
@@ -18,7 +18,6 @@
 package org.apache.solr.cluster.placement;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 
 /**
@@ -47,7 +46,7 @@ public interface PlacementPlugin {
       PlacementRequest placementRequest, PlacementContext placementContext)
       throws PlacementException, InterruptedException {
     List<PlacementPlan> placementPlans =
-        computePlacements(Collections.singletonList(placementRequest), placementContext);
+        computePlacements(List.of(placementRequest), placementContext);
     if (placementPlans == null || placementPlans.isEmpty()) {
       return null;
     } else {
diff --git a/solr/core/src/java/org/apache/solr/core/MetricsConfig.java b/solr/core/src/java/org/apache/solr/core/MetricsConfig.java
index 75c98707f77..3320713eb47 100644
--- a/solr/core/src/java/org/apache/solr/core/MetricsConfig.java
+++ b/solr/core/src/java/org/apache/solr/core/MetricsConfig.java
@@ -16,7 +16,7 @@
  */
 package org.apache.solr.core;
 
-import java.util.Collections;
+import java.util.Map;
 
 /** */
 public class MetricsConfig {
@@ -96,7 +96,7 @@ public class MetricsConfig {
   public static final String NOOP_IMPL_CLASS = "__noop__";
 
   private static final PluginInfo NO_OP_PLUGIN =
-      new PluginInfo("typeUnused", Collections.singletonMap("class", NOOP_IMPL_CLASS), null, null);
+      new PluginInfo("typeUnused", Map.of("class", NOOP_IMPL_CLASS), null, null);
 
   public PluginInfo getCounterSupplier() {
     if (enabled) {
diff --git a/solr/core/src/java/org/apache/solr/core/PluginBag.java b/solr/core/src/java/org/apache/solr/core/PluginBag.java
index 600b9a0b351..30bb8435214 100644
--- a/solr/core/src/java/org/apache/solr/core/PluginBag.java
+++ b/solr/core/src/java/org/apache/solr/core/PluginBag.java
@@ -16,7 +16,6 @@
  */
 package org.apache.solr.core;
 
-import static java.util.Collections.singletonMap;
 import static org.apache.solr.api.ApiBag.HANDLER_NAME;
 
 import java.io.IOException;
@@ -253,7 +252,7 @@ public class PluginBag<T> implements AutoCloseable {
           if (registerApi) {
             Collection<Api> apis = apiSupport.getApis();
             if (apis != null) {
-              Map<String, String> nameSubstitutes = singletonMap(HANDLER_NAME, name);
+              Map<String, String> nameSubstitutes = Map.of(HANDLER_NAME, name);
               for (Api api : apis) {
                 apiBag.register(api, nameSubstitutes);
               }
@@ -414,8 +413,7 @@ public class PluginBag<T> implements AutoCloseable {
 
     public PluginHolder(T inst, SolrConfig.SolrPluginInfo info) {
       this.inst = inst;
-      pluginInfo =
-          new PluginInfo(info.tag, Collections.singletonMap("class", inst.getClass().getName()));
+      pluginInfo = new PluginInfo(info.tag, Map.of("class", inst.getClass().getName()));
     }
 
     public PluginHolder(PluginInfo info) {
diff --git a/solr/core/src/java/org/apache/solr/core/RequestParams.java b/solr/core/src/java/org/apache/solr/core/RequestParams.java
index f0b491c84a0..469b107e9af 100644
--- a/solr/core/src/java/org/apache/solr/core/RequestParams.java
+++ b/solr/core/src/java/org/apache/solr/core/RequestParams.java
@@ -19,7 +19,6 @@ package org.apache.solr.core;
 import java.io.IOException;
 import java.io.InputStream;
 import java.lang.invoke.MethodHandles;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -66,7 +65,7 @@ public class RequestParams implements MapSerializable {
     @SuppressWarnings("unchecked")
     Map<String, Long> meta = (Map<String, Long>) copy.remove("");
     if (meta == null && version != null) {
-      meta = Collections.singletonMap("v", version);
+      meta = Map.of("v", version);
     }
     Map invariants = (Map) copy.remove(INVARIANTS);
     Map appends = (Map) copy.remove(APPENDS);
@@ -250,7 +249,7 @@ public class RequestParams implements MapSerializable {
           mergeMaps(Utils.getDeepCopy(defaults, 2), p.defaults),
           mergeMaps(Utils.getDeepCopy(invariants, 2), p.invariants),
           mergeMaps(Utils.getDeepCopy(appends, 2), p.appends),
-          mergeMaps(Utils.getDeepCopy(meta, 2), Collections.singletonMap("v", getVersion() + 1)));
+          mergeMaps(Utils.getDeepCopy(meta, 2), Map.of("v", getVersion() + 1)));
     }
 
     private static <K, V> Map<K, V> mergeMaps(Map<K, V> m1, Map<K, V> m2) {
diff --git a/solr/core/src/java/org/apache/solr/core/SolrCore.java b/solr/core/src/java/org/apache/solr/core/SolrCore.java
index 88ccd9c2562..2d57377b5a2 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrCore.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrCore.java
@@ -1559,7 +1559,7 @@ public class SolrCore implements SolrInfoBean, Closeable {
       IndexOutput out = dir.createOutput(tmpFileName, DirectoryFactory.IOCONTEXT_NO_CACHE);
       os = new OutputStreamWriter(new IndexOutputOutputStream(out), StandardCharsets.UTF_8);
       p.store(os, IndexFetcher.INDEX_PROPERTIES);
-      dir.sync(Collections.singleton(tmpFileName));
+      dir.sync(Set.of(tmpFileName));
     } catch (Exception e) {
       throw new SolrException(
           ErrorCode.SERVER_ERROR, "Unable to write " + IndexFetcher.INDEX_PROPERTIES, e);
@@ -1683,9 +1683,7 @@ public class SolrCore implements SolrInfoBean, Closeable {
 
     map.computeIfAbsent(
         RunUpdateProcessorFactory.PRE_RUN_CHAIN_NAME,
-        k ->
-            new UpdateRequestProcessorChain(
-                Collections.singletonList(new NestedUpdateProcessorFactory()), this));
+        k -> new UpdateRequestProcessorChain(List.of(new NestedUpdateProcessorFactory()), this));
 
     return map;
   }
diff --git a/solr/core/src/java/org/apache/solr/core/SolrPaths.java b/solr/core/src/java/org/apache/solr/core/SolrPaths.java
index 8918a321d06..dc2c245eada 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrPaths.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrPaths.java
@@ -20,7 +20,6 @@ package org.apache.solr.core;
 import java.lang.invoke.MethodHandles;
 import java.nio.file.FileSystems;
 import java.nio.file.Path;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
 import org.apache.commons.exec.OS;
@@ -36,7 +35,7 @@ public final class SolrPaths {
   public static final Path ALL_PATH = Path.of("_ALL_");
 
   /** Special singleton path set containing only {@link #ALL_PATH}. */
-  private static final Set<Path> ALL_PATHS = Collections.singleton(ALL_PATH);
+  private static final Set<Path> ALL_PATHS = Set.of(ALL_PATH);
 
   private SolrPaths() {} // don't create this
 
diff --git a/solr/core/src/java/org/apache/solr/core/backup/BackupManager.java b/solr/core/src/java/org/apache/solr/core/backup/BackupManager.java
index f47df829f74..3d4ae4d2f0e 100644
--- a/solr/core/src/java/org/apache/solr/core/backup/BackupManager.java
+++ b/solr/core/src/java/org/apache/solr/core/backup/BackupManager.java
@@ -25,8 +25,8 @@ import java.net.URI;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.FileSystems;
 import java.time.Instant;
-import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
@@ -240,8 +240,7 @@ public class BackupManager {
       throws IOException {
     URI dest = repository.resolve(getZkStateDir(), COLLECTION_PROPS_FILE);
     try (OutputStream collectionStateOs = repository.createOutput(dest)) {
-      collectionStateOs.write(
-          Utils.toJSON(Collections.singletonMap(collectionName, collectionState)));
+      collectionStateOs.write(Utils.toJSON(Map.of(collectionName, collectionState)));
     }
   }
 
diff --git a/solr/core/src/java/org/apache/solr/core/backup/ShardBackupMetadata.java b/solr/core/src/java/org/apache/solr/core/backup/ShardBackupMetadata.java
index 7561e167fda..73e1a13637a 100644
--- a/solr/core/src/java/org/apache/solr/core/backup/ShardBackupMetadata.java
+++ b/solr/core/src/java/org/apache/solr/core/backup/ShardBackupMetadata.java
@@ -28,6 +28,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.Set;
 import org.apache.lucene.store.IOContext;
 import org.apache.lucene.store.IndexInput;
 import org.apache.solr.common.util.Utils;
@@ -111,7 +112,7 @@ public class ShardBackupMetadata {
     final String filename = shardBackupId.getBackupMetadataFilename();
     URI fileURI = repository.resolve(folderURI, filename);
     if (repository.exists(fileURI)) {
-      repository.delete(folderURI, Collections.singleton(filename));
+      repository.delete(folderURI, Set.of(filename));
     }
 
     try (OutputStream os = repository.createOutput(repository.resolve(folderURI, filename))) {
diff --git a/solr/core/src/java/org/apache/solr/core/snapshots/SolrSnapshotMetaDataManager.java b/solr/core/src/java/org/apache/solr/core/snapshots/SolrSnapshotMetaDataManager.java
index 0608be5b41e..d74cbabfc2f 100644
--- a/solr/core/src/java/org/apache/solr/core/snapshots/SolrSnapshotMetaDataManager.java
+++ b/solr/core/src/java/org/apache/solr/core/snapshots/SolrSnapshotMetaDataManager.java
@@ -20,7 +20,6 @@ import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -347,7 +346,7 @@ public class SolrSnapshotMetaDataManager {
       }
     }
 
-    dir.sync(Collections.singletonList(fileName));
+    dir.sync(List.of(fileName));
 
     if (nextWriteGen > 0) {
       String lastSaveFile = SNAPSHOTS_PREFIX + (nextWriteGen - 1);
diff --git a/solr/core/src/java/org/apache/solr/filestore/ClusterFileStore.java b/solr/core/src/java/org/apache/solr/filestore/ClusterFileStore.java
index c3b76dca4bb..c405fcbcfe9 100644
--- a/solr/core/src/java/org/apache/solr/filestore/ClusterFileStore.java
+++ b/solr/core/src/java/org/apache/solr/filestore/ClusterFileStore.java
@@ -44,6 +44,7 @@ import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.StrUtils;
+import org.apache.solr.common.util.SuppressForbidden;
 import org.apache.solr.core.CoreContainer;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.jersey.PermissionName;
@@ -208,6 +209,7 @@ public class ClusterFileStore extends JerseyResource implements ClusterFileStore
   }
 
   @SuppressWarnings("fallthrough")
+  @SuppressForbidden(reason = "singletonMap with null value is intentional")
   public static FileStoreDirectoryListingResponse getMetadata(
       FileStore.FileType type, String path, FileStore fileStore) {
     final var dirListingResponse = new FileStoreDirectoryListingResponse();
@@ -234,7 +236,7 @@ public class ClusterFileStore extends JerseyResource implements ClusterFileStore
             fileStore.list(path, null).stream()
                 .map(details -> convertToResponse(details))
                 .collect(Collectors.toList());
-        dirListingResponse.files = Collections.singletonMap(path, directoryContents);
+        dirListingResponse.files = Map.of(path, directoryContents);
         break;
     }
 
diff --git a/solr/core/src/java/org/apache/solr/handler/ClusterAPI.java b/solr/core/src/java/org/apache/solr/handler/ClusterAPI.java
index dd7a3a6e383..7bc49e85f2a 100644
--- a/solr/core/src/java/org/apache/solr/handler/ClusterAPI.java
+++ b/solr/core/src/java/org/apache/solr/handler/ClusterAPI.java
@@ -32,7 +32,6 @@ import static org.apache.solr.security.PermissionNameProvider.Name.COLL_EDIT_PER
 import static org.apache.solr.security.PermissionNameProvider.Name.COLL_READ_PERM;
 
 import java.io.IOException;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -181,7 +180,7 @@ public class ClusterAPI {
             .getSolrCloudManager()
             .getDistribStateManager()
             .listData(ZkStateReader.NODE_ROLES + "/" + roleStr + "/" + modeStr);
-    rsp.add("node-roles", Map.of(roleStr, Collections.singletonMap(modeStr, nodes)));
+    rsp.add("node-roles", Map.of(roleStr, Map.of(modeStr, nodes)));
   }
 
   public static List<String> getNodesByRole(
diff --git a/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java b/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java
index 27d7f018748..5fffe0099e1 100644
--- a/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java
+++ b/solr/core/src/java/org/apache/solr/handler/IndexFetcher.java
@@ -301,7 +301,7 @@ public class IndexFetcher {
         solrCore
             .getCoreContainer()
             .getAllowListUrlChecker()
-            .checkAllowList(Collections.singletonList(leaderCoreUrl), clusterState);
+            .checkAllowList(List.of(leaderCoreUrl), clusterState);
       } catch (MalformedURLException e) {
         throw new SolrException(
             SolrException.ErrorCode.SERVER_ERROR, "Malformed 'leaderUrl' " + leaderCoreUrl, e);
@@ -944,7 +944,7 @@ public class IndexFetcher {
       try (Writer outFile =
           new OutputStreamWriter(new IndexOutputOutputStream(out), StandardCharsets.UTF_8)) {
         props.store(outFile, "Replication details");
-        dir.sync(Collections.singleton(tmpFileName));
+        dir.sync(Set.of(tmpFileName));
       }
 
       solrCore.getDirectoryFactory().renameWithOverwrite(dir, tmpFileName, REPLICATION_PROPERTIES);
@@ -1843,7 +1843,7 @@ public class IndexFetcher {
 
     @Override
     public void sync() throws IOException {
-      copy2Dir.sync(Collections.singleton(saveAs));
+      copy2Dir.sync(Set.of(saveAs));
     }
 
     @Override
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 684250e35d5..f1a87df3e0b 100644
--- a/solr/core/src/java/org/apache/solr/handler/MoreLikeThisHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/MoreLikeThisHandler.java
@@ -21,10 +21,10 @@ import java.io.Reader;
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.regex.Pattern;
 import net.jcip.annotations.NotThreadSafe;
 import org.apache.lucene.document.Document;
@@ -447,7 +447,7 @@ public class MoreLikeThisHandler extends RequestHandlerBase {
           buffered.append(chunk, 0, len);
         }
 
-        Collection<Object> streamValue = Collections.singleton(buffered.get().toString());
+        Collection<Object> streamValue = Set.of(buffered.get().toString());
         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/RequestHandlerBase.java b/solr/core/src/java/org/apache/solr/handler/RequestHandlerBase.java
index 4946bbcaa35..e7322360ea5 100644
--- a/solr/core/src/java/org/apache/solr/handler/RequestHandlerBase.java
+++ b/solr/core/src/java/org/apache/solr/handler/RequestHandlerBase.java
@@ -24,8 +24,8 @@ import io.opentelemetry.api.common.Attributes;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Optional;
+import java.util.Set;
 import org.apache.solr.api.Api;
 import org.apache.solr.api.ApiBag;
 import org.apache.solr.api.ApiSupport;
@@ -412,8 +412,7 @@ public abstract class RequestHandlerBase
 
   @Override
   public Collection<Api> getApis() {
-    return Collections.singleton(
-        new ApiBag.ReqHandlerToApi(this, ApiBag.constructSpec(pluginInfo)));
+    return Set.of(new ApiBag.ReqHandlerToApi(this, ApiBag.constructSpec(pluginInfo)));
   }
 
   /**
diff --git a/solr/core/src/java/org/apache/solr/handler/SchemaHandler.java b/solr/core/src/java/org/apache/solr/handler/SchemaHandler.java
index 38060104bc9..bf2ef121c31 100644
--- a/solr/core/src/java/org/apache/solr/handler/SchemaHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/SchemaHandler.java
@@ -16,7 +16,6 @@
  */
 package org.apache.solr.handler;
 
-import static java.util.Collections.singletonMap;
 import static org.apache.solr.common.params.CommonParams.JSON;
 import static org.apache.solr.schema.IndexSchema.SchemaProps.Handler.COPY_FIELDS;
 import static org.apache.solr.schema.IndexSchema.SchemaProps.Handler.DYNAMIC_FIELDS;
@@ -198,10 +197,10 @@ public class SchemaHandler extends RequestHandlerBase
               String realName = parts.get(1);
 
               String pathParam = level2.get(realName); // Might be null
-              if (parts.size() > 2) {
+              if (parts.size() > 2 && pathParam != null) {
                 req.setParams(
                     SolrParams.wrapDefaults(
-                        new MapSolrParams(singletonMap(pathParam, parts.get(2))), req.getParams()));
+                        new MapSolrParams(Map.of(pathParam, parts.get(2))), req.getParams()));
               }
               switch (realName) {
                 case "fields":
diff --git a/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java b/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
index cba47bad98d..e27bfc0e317 100644
--- a/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
@@ -16,7 +16,6 @@
  */
 package org.apache.solr.handler;
 
-import static java.util.Collections.singletonList;
 import static org.apache.solr.common.params.CoreAdminParams.NAME;
 import static org.apache.solr.common.util.StrUtils.formatString;
 import static org.apache.solr.core.ConfigOverlay.NOT_EDITABLE;
@@ -423,7 +422,7 @@ public class SolrConfigHandler extends RequestHandlerBase
         }
       } catch (Exception e) {
         resp.setException(e);
-        resp.add(CommandOperation.ERR_MSGS, singletonList(SchemaManager.getErrorStr(e)));
+        resp.add(CommandOperation.ERR_MSGS, List.of(SchemaManager.getErrorStr(e)));
       }
     }
 
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/BaseHandlerApiSupport.java b/solr/core/src/java/org/apache/solr/handler/admin/BaseHandlerApiSupport.java
index ed1fdbebfeb..0244726235b 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/BaseHandlerApiSupport.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/BaseHandlerApiSupport.java
@@ -38,6 +38,7 @@ import org.apache.solr.client.solrj.request.ApiMapping.V2EndPoint;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.CommandOperation;
+import org.apache.solr.common.util.SuppressForbidden;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.SolrQueryResponse;
@@ -103,7 +104,7 @@ public abstract class BaseHandlerApiSupport implements ApiSupport {
             if (commands.size() > 1) {
               for (ApiCommand command : commands) {
                 if (command.meta().getName().equals(req.getPath())) {
-                  commands = Collections.singletonList(command);
+                  commands = List.of(command);
                   break;
                 }
               }
@@ -126,6 +127,8 @@ public abstract class BaseHandlerApiSupport implements ApiSupport {
   }
 
   /** Wrapper for SolrParams that wraps V2 params and exposes them as V1 params. */
+  @SuppressForbidden(
+      reason = "CommandOperation.getCommandData can return null when there is no payload")
   private static void wrapParams(
       final SolrQueryRequest req,
       final CommandOperation co,
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/ColStatus.java b/solr/core/src/java/org/apache/solr/handler/admin/ColStatus.java
index ece36d05ad7..d0bfbe94ae2 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/ColStatus.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/ColStatus.java
@@ -20,7 +20,6 @@ package org.apache.solr.handler.admin;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
@@ -78,7 +77,7 @@ public class ColStatus {
     if (col == null) {
       collections = clusterState.getCollectionNames();
     } else {
-      collections = Collections.singleton(col);
+      collections = Set.of(col);
     }
     boolean withFieldInfo = props.getBool(FIELD_INFO_PROP, false);
     boolean withCoreInfo = props.getBool(CORE_INFO_PROP, false);
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/SecurityConfHandlerLocal.java b/solr/core/src/java/org/apache/solr/handler/admin/SecurityConfHandlerLocal.java
index 724c2c16da3..79d86c936f9 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/SecurityConfHandlerLocal.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/SecurityConfHandlerLocal.java
@@ -23,7 +23,7 @@ import java.io.OutputStream;
 import java.lang.invoke.MethodHandles;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.util.Collections;
+import java.util.List;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.util.CommandOperation;
 import org.apache.solr.common.util.Utils;
@@ -69,7 +69,7 @@ public class SecurityConfHandlerLocal extends SecurityConfHandler {
     SecurityConfig props = getSecurityConfig(false);
     Object o = props.getData().get(key);
     if (o == null) {
-      rsp.add(CommandOperation.ERR_MSGS, Collections.singletonList("No " + key + " configured"));
+      rsp.add(CommandOperation.ERR_MSGS, List.of("No " + key + " configured"));
     } else {
       rsp.add(key + ".enabled", getPlugin(key) != null);
       rsp.add(key, o);
diff --git a/solr/core/src/java/org/apache/solr/handler/admin/SecurityConfHandlerZk.java b/solr/core/src/java/org/apache/solr/handler/admin/SecurityConfHandlerZk.java
index 09d8cbcddf6..b9cd18ae3a3 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/SecurityConfHandlerZk.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/SecurityConfHandlerZk.java
@@ -22,7 +22,7 @@ import static org.apache.solr.common.cloud.ZkStateReader.SOLR_SECURITY_CONF_PATH
 
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
-import java.util.Collections;
+import java.util.List;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.cloud.ZkStateReader;
 import org.apache.solr.common.util.CommandOperation;
@@ -63,7 +63,7 @@ public class SecurityConfHandlerZk extends SecurityConfHandler {
         cores.getZkController().getZkStateReader().getSecurityProps(false);
     Object o = map == null ? null : map.data.get(key);
     if (o == null) {
-      rsp.add(CommandOperation.ERR_MSGS, Collections.singletonList("No " + key + " configured"));
+      rsp.add(CommandOperation.ERR_MSGS, List.of("No " + key + " configured"));
     } else {
       rsp.add(key + ".enabled", getPlugin(key) != null);
       rsp.add(key, o);
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 c23b3891639..2bc9ae3d0bb 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
@@ -444,11 +444,11 @@ public class QueryElevationComponent extends SearchComponent implements SolrCore
         String e = DOMUtil.getAttr(child, EXCLUDE, null);
         if (e != null) {
           if (Boolean.valueOf(e)) {
-            elevationBuilder.addExcludedIds(Collections.singleton(id));
+            elevationBuilder.addExcludedIds(Set.of(id));
             continue;
           }
         }
-        elevationBuilder.addElevatedIds(Collections.singletonList(id));
+        elevationBuilder.addElevatedIds(List.of(id));
       }
 
       // It is allowed to define multiple times different elevations for the same query. In this
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 d1dc15d9a49..e08fe5d3ee4 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
@@ -584,10 +584,7 @@ public class RealTimeGetComponent extends SearchComponent {
         searcher
             .getDocFetcher()
             .decorateDocValueFields(
-                doc,
-                docid,
-                Collections.singleton(VERSION_FIELD),
-                new DocValuesIteratorCache(searcher, false));
+                doc, docid, Set.of(VERSION_FIELD), new DocValuesIteratorCache(searcher, false));
       }
 
       long docVersion = (long) doc.getFirstValue(VERSION_FIELD);
diff --git a/solr/core/src/java/org/apache/solr/handler/component/ResponseLogComponent.java b/solr/core/src/java/org/apache/solr/handler/component/ResponseLogComponent.java
index 6d8ee1957fb..fa7377ed6f1 100644
--- a/solr/core/src/java/org/apache/solr/handler/component/ResponseLogComponent.java
+++ b/solr/core/src/java/org/apache/solr/handler/component/ResponseLogComponent.java
@@ -17,7 +17,6 @@
 package org.apache.solr.handler.component;
 
 import java.io.IOException;
-import java.util.Collections;
 import java.util.Set;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.response.ResultContext;
@@ -90,7 +89,7 @@ public class ResponseLogComponent extends SearchComponent {
 
     StringBuilder sb = new StringBuilder();
 
-    Set<String> fields = Collections.singleton(schema.getUniqueKeyField().getName());
+    Set<String> fields = Set.of(schema.getUniqueKeyField().getName());
     SolrDocumentFetcher docFetcher = searcher.getDocFetcher();
     for (DocIterator iter = dl.iterator(); iter.hasNext(); ) {
 
@@ -106,7 +105,7 @@ public class ResponseLogComponent extends SearchComponent {
       throws IOException {
 
     StringBuilder sb = new StringBuilder();
-    Set<String> fields = Collections.singleton(schema.getUniqueKeyField().getName());
+    Set<String> fields = Set.of(schema.getUniqueKeyField().getName());
     SolrDocumentFetcher docFetcher = searcher.getDocFetcher();
     for (DocIterator iter = dl.iterator(); iter.hasNext(); ) {
       sb.append(schema.printableUniqueKey(docFetcher.doc(iter.nextDoc(), fields)))
diff --git a/solr/core/src/java/org/apache/solr/handler/designer/DefaultSampleDocumentsLoader.java b/solr/core/src/java/org/apache/solr/handler/designer/DefaultSampleDocumentsLoader.java
index 4dff58a7ba2..785be168ca9 100644
--- a/solr/core/src/java/org/apache/solr/handler/designer/DefaultSampleDocumentsLoader.java
+++ b/solr/core/src/java/org/apache/solr/handler/designer/DefaultSampleDocumentsLoader.java
@@ -28,7 +28,6 @@ import java.lang.invoke.MethodHandles;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.NoSuchElementException;
@@ -213,7 +212,7 @@ public class DefaultSampleDocumentsLoader implements SampleDocumentsLoader {
       if (isJsonLines) {
         docs = loadJsonLines(lines);
       } else {
-        docs = Collections.singletonList((Map<String, Object>) json);
+        docs = List.of((Map<String, Object>) json);
       }
     } else {
       throw new SolrException(
diff --git a/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerAPI.java b/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerAPI.java
index 91f8e7e57d2..bced3660ef7 100644
--- a/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerAPI.java
+++ b/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerAPI.java
@@ -222,7 +222,7 @@ public class SchemaDesignerAPI implements SchemaDesignerConstants {
     }
     String stringData =
         data != null && data.length > 0 ? new String(data, StandardCharsets.UTF_8) : "";
-    rsp.getValues().addAll(Collections.singletonMap(file, stringData));
+    rsp.getValues().addAll(Map.of(file, stringData));
   }
 
   @EndPoint(method = POST, path = "/schema-designer/file", permission = CONFIG_EDIT_PERM)
@@ -358,16 +358,14 @@ public class SchemaDesignerAPI implements SchemaDesignerConstants {
   public void listCollectionsForConfig(SolrQueryRequest req, SolrQueryResponse rsp) {
     final String configSet = getRequiredParam(CONFIG_SET_PARAM, req);
     rsp.getValues()
-        .addAll(
-            Collections.singletonMap(
-                "collections", configSetHelper.listCollectionsForConfig(configSet)));
+        .addAll(Map.of("collections", configSetHelper.listCollectionsForConfig(configSet)));
   }
 
   // CONFIG_EDIT_PERM is required here since this endpoint is used by the UI to determine if the
   // user has access to the Schema Designer UI
   @EndPoint(method = GET, path = "/schema-designer/configs", permission = CONFIG_EDIT_PERM)
   public void listConfigs(SolrQueryRequest req, SolrQueryResponse rsp) throws IOException {
-    rsp.getValues().addAll(Collections.singletonMap("configSets", listEnabledConfigs()));
+    rsp.getValues().addAll(Map.of("configSets", listEnabledConfigs()));
   }
 
   protected Map<String, Integer> listEnabledConfigs() throws IOException {
diff --git a/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerConfigSetHelper.java b/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerConfigSetHelper.java
index 23729eb21a1..907e0933acf 100644
--- a/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerConfigSetHelper.java
+++ b/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerConfigSetHelper.java
@@ -41,7 +41,6 @@ import java.nio.file.attribute.BasicFileAttributes;
 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.List;
@@ -179,7 +178,7 @@ class SchemaDesignerConfigSetHelper implements SchemaDesignerConstants {
       Object dest = map.get("dest");
       List<String> destFields = null;
       if (dest instanceof String) {
-        destFields = Collections.singletonList((String) dest);
+        destFields = List.of((String) dest);
       } else if (dest instanceof List) {
         destFields = (List<String>) dest;
       } else if (dest instanceof Collection) {
diff --git a/solr/core/src/java/org/apache/solr/handler/export/ExportWriter.java b/solr/core/src/java/org/apache/solr/handler/export/ExportWriter.java
index 142c6617632..2b9731152fe 100644
--- a/solr/core/src/java/org/apache/solr/handler/export/ExportWriter.java
+++ b/solr/core/src/java/org/apache/solr/handler/export/ExportWriter.java
@@ -17,9 +17,6 @@
 
 package org.apache.solr.handler.export;
 
-import static java.util.Collections.singletonList;
-import static java.util.Collections.singletonMap;
-
 import java.io.Closeable;
 import java.io.EOFException;
 import java.io.IOException;
@@ -180,14 +177,14 @@ public class ExportWriter implements SolrCore.RawWriter, Closeable {
       throws IOException {
     w.writeMap(
         mw -> {
-          mw.put("responseHeader", singletonMap("status", 400))
+          mw.put("responseHeader", Map.of("status", 400))
               .put(
                   "response",
                   Map.of(
                       "numFound",
                       0,
                       "docs",
-                      singletonList(singletonMap("EXCEPTION", e.getMessage()))));
+                      List.of(Map.of("EXCEPTION", String.valueOf(e.getMessage())))));
         });
     if (logException) {
       log.error("Exception", e);
@@ -339,7 +336,7 @@ public class ExportWriter implements SolrCore.RawWriter, Closeable {
     try {
       writer.writeMap(
           m -> {
-            m.put("responseHeader", singletonMap("status", 0));
+            m.put("responseHeader", Map.of("status", 0));
             m.put(
                 "response",
                 (MapWriter)
diff --git a/solr/core/src/java/org/apache/solr/packagemanager/PackageManager.java b/solr/core/src/java/org/apache/solr/packagemanager/PackageManager.java
index 0d16ec02b0d..3f061375d66 100644
--- a/solr/core/src/java/org/apache/solr/packagemanager/PackageManager.java
+++ b/solr/core/src/java/org/apache/solr/packagemanager/PackageManager.java
@@ -30,7 +30,6 @@ import java.lang.invoke.MethodHandles;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -160,7 +159,7 @@ public class PackageManager implements Closeable {
         new V2Request.Builder(PackageUtils.PACKAGE_PATH)
             .forceV2(true)
             .withMethod(SolrRequest.METHOD.POST)
-            .withPayload(Collections.singletonMap("delete", del))
+            .withPayload(Map.of("delete", del))
             .build();
 
     try {
@@ -438,12 +437,11 @@ public class PackageManager implements Closeable {
             PackageUtils.getCollectionParamsPath(collection),
             getMapper()
                 .writeValueAsString(
-                    Collections.singletonMap(
+                    Map.of(
                         packageParamsExist ? "update" : "set",
-                        Collections.singletonMap(
+                        Map.of(
                             "packages",
-                            Collections.singletonMap(
-                                packageInstance.name, collectionParameterOverrides)))));
+                            Map.of(packageInstance.name, collectionParameterOverrides)))));
       } catch (Exception e) {
         throw new SolrException(ErrorCode.SERVER_ERROR, e);
       }
diff --git a/solr/core/src/java/org/apache/solr/parser/SolrQueryParserBase.java b/solr/core/src/java/org/apache/solr/parser/SolrQueryParserBase.java
index 044f56211d0..42cedf82979 100644
--- a/solr/core/src/java/org/apache/solr/parser/SolrQueryParserBase.java
+++ b/solr/core/src/java/org/apache/solr/parser/SolrQueryParserBase.java
@@ -20,7 +20,6 @@ import static org.apache.solr.parser.SolrQueryParserBase.SynonymQueryStyle.AS_SA
 
 import java.io.StringReader;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -187,7 +186,7 @@ public abstract class SolrQueryParserBase extends QueryBuilder {
     private final List<String> externalVals;
 
     public RawQuery(SchemaField sfield, String externalVal) {
-      this(sfield, Collections.singletonList(externalVal));
+      this(sfield, List.of(externalVal));
     }
 
     public RawQuery(SchemaField sfield, List<String> externalVals) {
diff --git a/solr/core/src/java/org/apache/solr/pkg/PackageAPI.java b/solr/core/src/java/org/apache/solr/pkg/PackageAPI.java
index 24ea22cd387..c2d6e0cbeea 100644
--- a/solr/core/src/java/org/apache/solr/pkg/PackageAPI.java
+++ b/solr/core/src/java/org/apache/solr/pkg/PackageAPI.java
@@ -402,7 +402,7 @@ public class PackageAPI {
       if (name == null) {
         rsp.add("result", pkgs);
       } else {
-        rsp.add("result", Collections.singletonMap(name, pkgs.packages.get(name)));
+        rsp.add("result", Map.of(name, pkgs.packages.get(name)));
       }
     }
 
diff --git a/solr/core/src/java/org/apache/solr/pkg/PackagePluginHolder.java b/solr/core/src/java/org/apache/solr/pkg/PackagePluginHolder.java
index b0731d05095..419cb033835 100644
--- a/solr/core/src/java/org/apache/solr/pkg/PackagePluginHolder.java
+++ b/solr/core/src/java/org/apache/solr/pkg/PackagePluginHolder.java
@@ -19,7 +19,6 @@ package org.apache.solr.pkg;
 
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
-import java.util.Collections;
 import java.util.Map;
 import org.apache.lucene.util.ResourceLoaderAware;
 import org.apache.solr.common.MapWriter;
@@ -60,7 +59,7 @@ public class PackagePluginHolder<T> extends PluginBag.PluginHolder<T> {
 
               @Override
               public Map<String, PackageAPI.PkgVersion> packageDetails() {
-                return Collections.singletonMap(info.cName.original, pkgVersion.getPkgVersion());
+                return Map.of(info.cName.original, pkgVersion.getPkgVersion());
               }
 
               @Override
@@ -77,8 +76,7 @@ public class PackagePluginHolder<T> extends PluginBag.PluginHolder<T> {
 
   public static <T> PluginBag.PluginHolder<T> createHolder(T inst, Class<T> type) {
     SolrConfig.SolrPluginInfo plugin = SolrConfig.classVsSolrPluginInfo.get(type.getName());
-    PluginInfo info =
-        new PluginInfo(plugin.tag, Collections.singletonMap("class", inst.getClass().getName()));
+    PluginInfo info = new PluginInfo(plugin.tag, Map.of("class", inst.getClass().getName()));
     return new PluginBag.PluginHolder<>(info, inst);
   }
 
diff --git a/solr/core/src/java/org/apache/solr/pkg/SolrPackageLoader.java b/solr/core/src/java/org/apache/solr/pkg/SolrPackageLoader.java
index fdfb9881964..364bbb919bc 100644
--- a/solr/core/src/java/org/apache/solr/pkg/SolrPackageLoader.java
+++ b/solr/core/src/java/org/apache/solr/pkg/SolrPackageLoader.java
@@ -145,7 +145,7 @@ public class SolrPackageLoader implements Closeable {
   public void notifyListeners(String pkg) {
     SolrPackage p = packageClassLoaders.get(pkg);
     if (p != null) {
-      List<SolrPackage> l = Collections.singletonList(p);
+      List<SolrPackage> l = List.of(p);
       for (SolrCore core : coreContainer.getCores()) {
         core.getPackageListeners().packagesUpdated(l);
       }
diff --git a/solr/core/src/java/org/apache/solr/response/TextResponseWriter.java b/solr/core/src/java/org/apache/solr/response/TextResponseWriter.java
index a7017f5d4fb..6809e99e936 100644
--- a/solr/core/src/java/org/apache/solr/response/TextResponseWriter.java
+++ b/solr/core/src/java/org/apache/solr/response/TextResponseWriter.java
@@ -20,7 +20,6 @@ import java.io.IOException;
 import java.io.Writer;
 import java.util.Calendar;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
@@ -87,9 +86,7 @@ public abstract class TextResponseWriter implements TextWriter {
       this.rawReturnFields = NO_RAW_FIELDS;
     } else {
       this.rawFields =
-          rawFields.size() == 1
-              ? Collections.singleton(rawFields.iterator().next())
-              : new HashSet<>(rawFields);
+          rawFields.size() == 1 ? Set.of(rawFields.iterator().next()) : new HashSet<>(rawFields);
       this.rawShim = new RawShimTextResponseWriter(this);
       this.rawReturnFields = returnFields;
     }
diff --git a/solr/core/src/java/org/apache/solr/response/transform/RawValueTransformerFactory.java b/solr/core/src/java/org/apache/solr/response/transform/RawValueTransformerFactory.java
index 7f671ad3102..b165b81e923 100644
--- a/solr/core/src/java/org/apache/solr/response/transform/RawValueTransformerFactory.java
+++ b/solr/core/src/java/org/apache/solr/response/transform/RawValueTransformerFactory.java
@@ -17,7 +17,6 @@
 package org.apache.solr.response.transform;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Map;
 import java.util.Set;
 import org.apache.solr.common.SolrDocument;
@@ -123,7 +122,7 @@ public class RawValueTransformerFactory extends TransformerFactory
 
     @Override
     public Collection<String> getRawFields() {
-      return Collections.singleton(display);
+      return Set.of(display);
     }
 
     @Override
diff --git a/solr/core/src/java/org/apache/solr/schema/BinaryField.java b/solr/core/src/java/org/apache/solr/schema/BinaryField.java
index 6738f448086..d752d20916a 100644
--- a/solr/core/src/java/org/apache/solr/schema/BinaryField.java
+++ b/solr/core/src/java/org/apache/solr/schema/BinaryField.java
@@ -22,7 +22,6 @@ import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Base64;
-import java.util.Collections;
 import java.util.List;
 import org.apache.lucene.document.BinaryDocValuesField;
 import org.apache.lucene.document.StoredField;
@@ -150,7 +149,7 @@ public class BinaryField extends FieldType {
 
       fval = docval;
     }
-    return Collections.singletonList(fval);
+    return List.of(fval);
   }
 
   @Override
diff --git a/solr/core/src/java/org/apache/solr/schema/BoolField.java b/solr/core/src/java/org/apache/solr/schema/BoolField.java
index 65c86f919d6..cefd4a0bdbe 100644
--- a/solr/core/src/java/org/apache/solr/schema/BoolField.java
+++ b/solr/core/src/java/org/apache/solr/schema/BoolField.java
@@ -18,7 +18,6 @@ package org.apache.solr.schema;
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import org.apache.lucene.analysis.Analyzer;
@@ -205,7 +204,7 @@ public class BoolField extends PrimitiveFieldType {
 
       fval = docval;
     }
-    return Collections.singletonList(fval);
+    return List.of(fval);
   }
 
   @Override
diff --git a/solr/core/src/java/org/apache/solr/schema/CollationField.java b/solr/core/src/java/org/apache/solr/schema/CollationField.java
index e55474f8953..ce4a1828dc7 100644
--- a/solr/core/src/java/org/apache/solr/schema/CollationField.java
+++ b/solr/core/src/java/org/apache/solr/schema/CollationField.java
@@ -23,7 +23,6 @@ import java.text.Collator;
 import java.text.ParseException;
 import java.text.RuleBasedCollator;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -260,7 +259,7 @@ public class CollationField extends FieldType {
       }
       return fields;
     } else {
-      return Collections.singletonList(createField(field, value));
+      return List.of(createField(field, value));
     }
   }
 
diff --git a/solr/core/src/java/org/apache/solr/schema/FieldType.java b/solr/core/src/java/org/apache/solr/schema/FieldType.java
index 0f72e49747a..1452233beee 100644
--- a/solr/core/src/java/org/apache/solr/schema/FieldType.java
+++ b/solr/core/src/java/org/apache/solr/schema/FieldType.java
@@ -348,7 +348,7 @@ public abstract class FieldType extends FieldProperties {
       throw new UnsupportedOperationException(
           "This field type does not support doc values: " + this);
     }
-    return f == null ? List.of() : Collections.singletonList(f);
+    return f == null ? List.of() : List.of(f);
   }
 
   /**
diff --git a/solr/core/src/java/org/apache/solr/schema/IndexSchema.java b/solr/core/src/java/org/apache/solr/schema/IndexSchema.java
index 3571dd2a07d..ff81ecc84b3 100644
--- a/solr/core/src/java/org/apache/solr/schema/IndexSchema.java
+++ b/solr/core/src/java/org/apache/solr/schema/IndexSchema.java
@@ -17,8 +17,6 @@
 package org.apache.solr.schema;
 
 import static java.util.Arrays.asList;
-import static java.util.Collections.singletonList;
-import static java.util.Collections.singletonMap;
 
 import java.io.IOException;
 import java.io.Writer;
@@ -1801,7 +1799,7 @@ public class IndexSchema {
    * @see #newField(String, String, Map)
    */
   public IndexSchema addField(SchemaField newField, boolean persist) {
-    return addFields(Collections.singletonList(newField), Map.of(), persist);
+    return addFields(List.of(newField), Map.of(), persist);
   }
 
   public IndexSchema addField(SchemaField newField) {
@@ -1819,8 +1817,7 @@ public class IndexSchema {
    * @see #newField(String, String, Map)
    */
   public IndexSchema addField(SchemaField newField, Collection<String> copyFieldNames) {
-    return addFields(
-        singletonList(newField), singletonMap(newField.getName(), copyFieldNames), true);
+    return addFields(List.of(newField), Map.of(newField.getName(), copyFieldNames), true);
   }
 
   /**
diff --git a/solr/core/src/java/org/apache/solr/schema/SchemaManager.java b/solr/core/src/java/org/apache/solr/schema/SchemaManager.java
index fc2d4bcb49e..a65eb18df6a 100644
--- a/solr/core/src/java/org/apache/solr/schema/SchemaManager.java
+++ b/solr/core/src/java/org/apache/solr/schema/SchemaManager.java
@@ -16,9 +16,6 @@
  */
 package org.apache.solr.schema;
 
-import static java.util.Collections.singleton;
-import static java.util.Collections.singletonList;
-import static java.util.Collections.singletonMap;
 import static org.apache.solr.client.api.model.SchemaChange.OPERATION_TYPE_PROP;
 import static org.apache.solr.common.util.CommandOperation.ERR_MSGS;
 import static org.apache.solr.schema.IndexSchema.MAX_CHARS;
@@ -37,6 +34,7 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import org.apache.solr.client.api.model.AddCopyFieldOperation;
 import org.apache.solr.client.api.model.DeleteCopyFieldOperation;
@@ -102,7 +100,7 @@ public class SchemaManager {
     if (schema instanceof ManagedIndexSchema && schema.isMutable()) {
       return doOperations(ops);
     } else {
-      return singletonList(singletonMap(ERR_MSGS, "schema is not editable"));
+      return List.of(Map.of(ERR_MSGS, "schema is not editable"));
     }
   }
 
@@ -127,7 +125,7 @@ public class SchemaManager {
                     op.operationType,
                     SchemaManagerUtils.convertToMap(op),
                     ERR_MSGS,
-                    singletonList(soe.getMessage())));
+                    List.of(soe.getMessage())));
           }
         }
         if (!errors.isEmpty()) break;
@@ -175,8 +173,7 @@ public class SchemaManager {
             core.getCoreContainer().reload(core.getName(), core.uniqueId);
           } catch (SolrException e) {
             log.warn(errorMsg);
-            errors =
-                singletonList(singletonMap(CommandOperation.ERR_MSGS, errorMsg + e.getMessage()));
+            errors = List.of(Map.of(CommandOperation.ERR_MSGS, errorMsg + e.getMessage()));
           }
           break;
         }
@@ -190,7 +187,7 @@ public class SchemaManager {
     }
     if (errors.isEmpty() && timeOut.hasTimedOut()) {
       log.warn("{} Timed out", errorMsg);
-      errors = singletonList(singletonMap(CommandOperation.ERR_MSGS, errorMsg + "Timed out."));
+      errors = List.of(Map.of(CommandOperation.ERR_MSGS, errorMsg + "Timed out."));
     }
     return errors;
   }
@@ -247,8 +244,7 @@ public class SchemaManager {
         try {
           FieldType fieldType =
               mgr.managedIndexSchema.newFieldType(name, className, convertToMap(addFieldTypeOp));
-          mgr.managedIndexSchema =
-              mgr.managedIndexSchema.addFieldTypes(singletonList(fieldType), false);
+          mgr.managedIndexSchema = mgr.managedIndexSchema.addFieldTypes(List.of(fieldType), false);
           return true;
         } catch (Exception e) {
           log.error("Could not add field type.", e);
@@ -305,7 +301,7 @@ public class SchemaManager {
               mgr.managedIndexSchema.newField(
                   name, type, convertToMapExcluding(addFieldOp, propsToOmit));
           mgr.managedIndexSchema =
-              mgr.managedIndexSchema.addFields(singletonList(field), Map.of(), false);
+              mgr.managedIndexSchema.addFields(List.of(field), Map.of(), false);
           return true;
         } catch (Exception e) {
           log.error("Could not add field", e);
@@ -341,7 +337,7 @@ public class SchemaManager {
               mgr.managedIndexSchema.newDynamicField(
                   name, type, convertToMapExcluding(addDynFieldOp, propsToOmit));
           mgr.managedIndexSchema =
-              mgr.managedIndexSchema.addDynamicFields(singletonList(field), Map.of(), false);
+              mgr.managedIndexSchema.addDynamicFields(List.of(field), Map.of(), false);
           return true;
         } catch (Exception e) {
           log.error("Could not add dynamic field", e);
@@ -355,7 +351,7 @@ public class SchemaManager {
         final var deleteFieldTypeOp = (DeleteFieldTypeOperation) op;
         String name = ensureNotNull("name", deleteFieldTypeOp.name);
         try {
-          mgr.managedIndexSchema = mgr.managedIndexSchema.deleteFieldTypes(singleton(name));
+          mgr.managedIndexSchema = mgr.managedIndexSchema.deleteFieldTypes(Set.of(name));
           return true;
         } catch (Exception e) {
           log.error("Could not delete field type", e);
@@ -370,8 +366,7 @@ public class SchemaManager {
         String source = ensureNotNull("source", deleteCopyField.source);
         List<String> dests = ensureNotNull("dest", deleteCopyField.destinations);
         try {
-          mgr.managedIndexSchema =
-              mgr.managedIndexSchema.deleteCopyFields(singletonMap(source, dests));
+          mgr.managedIndexSchema = mgr.managedIndexSchema.deleteCopyFields(Map.of(source, dests));
           return true;
         } catch (Exception e) {
           log.error("Could not delete copy field", e);
@@ -385,7 +380,7 @@ public class SchemaManager {
         final var deleteFieldOp = (DeleteFieldOperation) op;
         String name = ensureNotNull("name", deleteFieldOp.name);
         try {
-          mgr.managedIndexSchema = mgr.managedIndexSchema.deleteFields(singleton(name));
+          mgr.managedIndexSchema = mgr.managedIndexSchema.deleteFields(Set.of(name));
           return true;
         } catch (Exception e) {
           log.error("Could not delete field", e);
@@ -399,7 +394,7 @@ public class SchemaManager {
         final var deleteDynFieldOp = (DeleteDynamicFieldOperation) op;
         String name = ensureNotNull("name", deleteDynFieldOp.name);
         try {
-          mgr.managedIndexSchema = mgr.managedIndexSchema.deleteDynamicFields(singleton(name));
+          mgr.managedIndexSchema = mgr.managedIndexSchema.deleteDynamicFields(Set.of(name));
           return true;
         } catch (Exception e) {
           log.error("Could not delete dynamic field", e);
diff --git a/solr/core/src/java/org/apache/solr/schema/SortableTextField.java b/solr/core/src/java/org/apache/solr/schema/SortableTextField.java
index 6e120dddb5c..02d74724f88 100644
--- a/solr/core/src/java/org/apache/solr/schema/SortableTextField.java
+++ b/solr/core/src/java/org/apache/solr/schema/SortableTextField.java
@@ -17,7 +17,6 @@
 package org.apache.solr.schema;
 
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import org.apache.lucene.document.SortedDocValuesField;
@@ -99,7 +98,7 @@ public class SortableTextField extends TextField {
   public List<IndexableField> createFields(SchemaField field, Object value) {
     IndexableField f = createField(field, value);
     if (!field.hasDocValues()) {
-      return Collections.singletonList(f);
+      return List.of(f);
     }
     if (value instanceof ByteArrayUtf8CharSequence utf8) {
       if (utf8.size() < maxCharsForDocValues) {
@@ -138,7 +137,7 @@ public class SortableTextField extends TextField {
             : new SortedDocValuesField(field.getName(), bytes);
 
     if (null == f) {
-      return Collections.singletonList(docval);
+      return List.of(docval);
     }
     return Arrays.asList(f, docval);
   }
diff --git a/solr/core/src/java/org/apache/solr/schema/StrField.java b/solr/core/src/java/org/apache/solr/schema/StrField.java
index a5f7b4643f9..bc437553fe4 100644
--- a/solr/core/src/java/org/apache/solr/schema/StrField.java
+++ b/solr/core/src/java/org/apache/solr/schema/StrField.java
@@ -18,7 +18,6 @@ package org.apache.solr.schema;
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import org.apache.lucene.document.SortedDocValuesField;
@@ -65,7 +64,7 @@ public class StrField extends PrimitiveFieldType {
 
       fval = docval;
     }
-    return Collections.singletonList(fval);
+    return List.of(fval);
   }
 
   public static BytesRef getBytesRef(Object value) {
diff --git a/solr/core/src/java/org/apache/solr/schema/TrieField.java b/solr/core/src/java/org/apache/solr/schema/TrieField.java
index 5b8980d0a12..9512176d33d 100644
--- a/solr/core/src/java/org/apache/solr/schema/TrieField.java
+++ b/solr/core/src/java/org/apache/solr/schema/TrieField.java
@@ -20,7 +20,6 @@ import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.time.Instant;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.Locale;
@@ -690,7 +689,7 @@ public class TrieField extends NumericFieldType {
 
       return fields;
     } else {
-      return Collections.singletonList(createField(sf, value));
+      return List.of(createField(sf, value));
     }
   }
 
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 da05152a86d..c253f48fa41 100644
--- a/solr/core/src/java/org/apache/solr/search/CacheConfig.java
+++ b/solr/core/src/java/org/apache/solr/search/CacheConfig.java
@@ -19,7 +19,6 @@ package org.apache.solr.search;
 import static org.apache.solr.common.params.CommonParams.NAME;
 
 import java.lang.invoke.MethodHandles;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -148,7 +147,7 @@ public class CacheConfig implements MapSerializable {
             if (loadedClass != null) return loadedClass;
             return loadedClass =
                 loader.findClass(
-                    new PluginInfo("cache", Collections.singletonMap("class", config.cacheImpl)),
+                    new PluginInfo("cache", Map.of("class", config.cacheImpl)),
                     SolrCache.class,
                     true);
           }
diff --git a/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java b/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java
index 9f127f7d460..ae3102e41ce 100644
--- a/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java
+++ b/solr/core/src/java/org/apache/solr/search/CollapsingQParserPlugin.java
@@ -29,7 +29,6 @@ import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.EnumSet;
 import java.util.Iterator;
 import java.util.List;
@@ -504,7 +503,7 @@ public class CollapsingQParserPlugin extends QParserPlugin {
 
     return UninvertingReader.wrap(
         new ReaderWrapper(searcher.getSlowAtomicReader(), collapseField),
-        Collections.singletonMap(collapseField, type)::get);
+        Map.of(collapseField, type)::get);
   }
 
   private static class ReaderWrapper extends FilterLeafReader {
diff --git a/solr/core/src/java/org/apache/solr/search/NumericHidingLeafReader.java b/solr/core/src/java/org/apache/solr/search/NumericHidingLeafReader.java
index 36a7e6177f4..8b80b87053d 100644
--- a/solr/core/src/java/org/apache/solr/search/NumericHidingLeafReader.java
+++ b/solr/core/src/java/org/apache/solr/search/NumericHidingLeafReader.java
@@ -18,7 +18,6 @@ package org.apache.solr.search;
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Map;
 import org.apache.lucene.index.BinaryDocValues;
 import org.apache.lucene.index.DocValuesSkipIndexType;
@@ -49,7 +48,7 @@ public class NumericHidingLeafReader extends FilterLeafReader {
   public static LeafReader wrap(LeafReader leafReader, String field) {
     return UninvertingReader.wrap(
         new NumericHidingLeafReader(leafReader, field),
-        Collections.singletonMap(field, UninvertingReader.Type.SORTED)::get);
+        Map.of(field, UninvertingReader.Type.SORTED)::get);
   }
 
   private final String field;
diff --git a/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java b/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java
index 04e17b78d8e..943a1239b21 100644
--- a/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java
+++ b/solr/core/src/java/org/apache/solr/search/ValueSourceParser.java
@@ -1452,8 +1452,8 @@ public abstract class ValueSourceParser implements NamedListInitializedPlugin {
             SolrException.ErrorCode.BAD_REQUEST,
             "Illegal number of sources.  There must be an even number of sources");
       } else {
-        mvr.mv1 = new VectorValueSource(Collections.singletonList(sources.get(0)));
-        mvr.mv2 = new VectorValueSource(Collections.singletonList(sources.get(1)));
+        mvr.mv1 = new VectorValueSource(List.of(sources.get(0)));
+        mvr.mv2 = new VectorValueSource(List.of(sources.get(1)));
       }
     } else {
       int dim = sources.size() / 2;
diff --git a/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/TopGroupsResultTransformer.java b/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/TopGroupsResultTransformer.java
index 060fc78ab8a..2da4835b18a 100644
--- a/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/TopGroupsResultTransformer.java
+++ b/solr/core/src/java/org/apache/solr/search/grouping/distributed/shardresultserializer/TopGroupsResultTransformer.java
@@ -22,11 +22,11 @@ import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.lang.reflect.Array;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Set;
 import org.apache.lucene.document.Document;
 import org.apache.lucene.search.FieldDoc;
 import org.apache.lucene.search.ScoreDoc;
@@ -331,6 +331,6 @@ public class TopGroupsResultTransformer
 
   private Document retrieveDocument(
       final SchemaField uniqueField, int doc, SolrDocumentFetcher docFetcher) throws IOException {
-    return docFetcher.doc(doc, Collections.singleton(uniqueField.getName()));
+    return docFetcher.doc(doc, Set.of(uniqueField.getName()));
   }
 }
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 246497b1303..4864b1cfb2d 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
@@ -19,8 +19,8 @@ package org.apache.solr.search.mlt;
 import java.io.IOException;
 import java.io.StringReader;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Map;
+import java.util.Set;
 import org.apache.lucene.queries.mlt.MoreLikeThis;
 import org.apache.lucene.search.Query;
 import org.apache.solr.common.SolrException;
@@ -57,7 +57,7 @@ public class MLTContentQParserPlugin extends QParserPlugin {
     if (fieldNames.length == 1) {
       return moreLikeThis.like(fieldNames[0], new StringReader(content));
     } else {
-      Collection<Object> streamValue = Collections.singleton(content);
+      Collection<Object> streamValue = Set.of(content);
       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/security/AuditEvent.java b/solr/core/src/java/org/apache/solr/security/AuditEvent.java
index e3367e8d8ea..7294926c724 100644
--- a/solr/core/src/java/org/apache/solr/security/AuditEvent.java
+++ b/solr/core/src/java/org/apache/solr/security/AuditEvent.java
@@ -23,7 +23,6 @@ import jakarta.servlet.http.HttpServletRequest;
 import java.lang.invoke.MethodHandles;
 import java.security.Principal;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.Date;
 import java.util.Enumeration;
 import java.util.HashMap;
@@ -558,10 +557,8 @@ public class AuditEvent {
           "^/api/node.*$",
           "^/api/cluster.*$");
 
-  private static final List<String> STREAMING_PATH_REGEXES =
-      Collections.singletonList(".*/stream.*");
-  private static final List<String> INDEXING_PATH_REGEXES =
-      Collections.singletonList(".*/update.*");
+  private static final List<String> STREAMING_PATH_REGEXES = List.of(".*/stream.*");
+  private static final List<String> INDEXING_PATH_REGEXES = List.of(".*/update.*");
   private static final List<String> SEARCH_PATH_REGEXES =
       Arrays.asList(".*/select.*", ".*/query.*");
 
diff --git a/solr/core/src/java/org/apache/solr/security/AuditLoggerPlugin.java b/solr/core/src/java/org/apache/solr/security/AuditLoggerPlugin.java
index fce04423f94..ec0ee1acd0d 100644
--- a/solr/core/src/java/org/apache/solr/security/AuditLoggerPlugin.java
+++ b/solr/core/src/java/org/apache/solr/security/AuditLoggerPlugin.java
@@ -26,7 +26,6 @@ import java.io.StringWriter;
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -429,7 +428,7 @@ public abstract class AuditLoggerPlugin implements Closeable, Runnable, SolrInfo
               .forEach(
                   l -> {
                     if (l instanceof String) {
-                      rules.add(Collections.singletonList(parseRule(l)));
+                      rules.add(List.of(parseRule(l)));
                     } else if (l instanceof List) {
                       List<MuteRule> rl = new ArrayList<>();
                       ((List<?>) l).forEach(r -> rl.add(parseRule(r)));
diff --git a/solr/core/src/java/org/apache/solr/security/MultiAuthPlugin.java b/solr/core/src/java/org/apache/solr/security/MultiAuthPlugin.java
index 30cc75f44ee..1e1d33ee6d1 100644
--- a/solr/core/src/java/org/apache/solr/security/MultiAuthPlugin.java
+++ b/solr/core/src/java/org/apache/solr/security/MultiAuthPlugin.java
@@ -22,7 +22,6 @@ import jakarta.servlet.http.HttpServletRequest;
 import jakarta.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -99,7 +98,7 @@ public class MultiAuthPlugin extends AuthenticationPlugin
           ErrorCode.BAD_REQUEST, "Config for scheme '" + scheme + "' not found!");
     }
 
-    Map<String, Object> updated = plugin.edit(latestPluginConf, Collections.singletonList(c));
+    Map<String, Object> updated = plugin.edit(latestPluginConf, List.of(c));
     if (updated != null) {
       madeChanges = true;
       schemes.set(updateAt, withScheme(scheme, updated));
diff --git a/solr/core/src/java/org/apache/solr/security/MultiAuthRuleBasedAuthorizationPlugin.java b/solr/core/src/java/org/apache/solr/security/MultiAuthRuleBasedAuthorizationPlugin.java
index 2506605e935..3711c6b96b8 100644
--- a/solr/core/src/java/org/apache/solr/security/MultiAuthRuleBasedAuthorizationPlugin.java
+++ b/solr/core/src/java/org/apache/solr/security/MultiAuthRuleBasedAuthorizationPlugin.java
@@ -19,7 +19,6 @@ package org.apache.solr.security;
 import static org.apache.solr.security.MultiAuthPlugin.applyEditCommandToSchemePlugin;
 
 import java.security.Principal;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
@@ -123,7 +122,7 @@ public class MultiAuthRuleBasedAuthorizationPlugin extends RuleBasedAuthorizatio
 
       // just let the base class handle permission commands
       if (c.name.endsWith("-permission")) {
-        Map<String, Object> updated = super.edit(latestConf, Collections.singletonList(c));
+        Map<String, Object> updated = super.edit(latestConf, List.of(c));
         if (updated != null) {
           madeChanges = true;
           latestConf = updated;
diff --git a/solr/core/src/java/org/apache/solr/security/Permission.java b/solr/core/src/java/org/apache/solr/security/Permission.java
index a344b3f2ce1..290b7912afb 100644
--- a/solr/core/src/java/org/apache/solr/security/Permission.java
+++ b/solr/core/src/java/org/apache/solr/security/Permission.java
@@ -18,7 +18,6 @@
 package org.apache.solr.security;
 
 import static java.util.Collections.singleton;
-import static java.util.Collections.singletonList;
 import static org.apache.solr.common.params.CommonParams.NAME;
 
 import java.util.Collection;
@@ -34,6 +33,7 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.params.CommonParams;
+import org.apache.solr.common.util.SuppressForbidden;
 import org.apache.solr.common.util.Utils;
 
 class Permission {
@@ -82,9 +82,7 @@ class Permission {
         } else {
           @SuppressWarnings("unchecked")
           List<String> patternStrs =
-              e.getValue() instanceof List
-                  ? (List) e.getValue()
-                  : singletonList(e.getValue().toString());
+              e.getValue() instanceof List ? (List) e.getValue() : List.of(e.getValue().toString());
           List<?> patterns =
               patternStrs.stream()
                   .map(
@@ -92,7 +90,7 @@ class Permission {
                           it.startsWith("REGEX:")
                               ? Pattern.compile(it.substring("REGEX:".length()))
                               : it)
-                  .collect(Collectors.toList());
+                  .toList();
           p.params.put(
               e.getKey(),
               val -> {
@@ -115,6 +113,9 @@ class Permission {
   }
 
   /** This checks for the defaults available other rules for the keys */
+  @SuppressForbidden(
+      reason =
+          "Collections.singleton(null) is intentional — null is a sentinel value meaning 'core admin / collection admin request' (no collection)")
   private static Set<String> readSetSmart(String permissionName, Map<?, ?> m, String key) {
     if (PermissionNameProvider.values.containsKey(permissionName)
         && !m.containsKey(key)
@@ -128,7 +129,7 @@ class Permission {
       }
       return set;
     }
-    return set == null ? singleton(null) : set;
+    return set == null ? Collections.singleton(null) : set;
   }
 
   /**
@@ -137,6 +138,9 @@ class Permission {
    * @param m the map from which to lookup
    * @param key the key with which to do lookup
    */
+  @SuppressForbidden(
+      reason =
+          "Collections.singleton(null) is intentional — null is a sentinel value meaning 'core admin / collection admin request' (no collection)")
   static Set<String> readValueAsSet(Map<?, ?> m, String key) {
     Set<String> result = new HashSet<>();
     Object val = m.get(key);
@@ -144,7 +148,7 @@ class Permission {
       if ("collection".equals(key)) {
         // for collection collection: null means a core admin/ collection admin request
         // otherwise it means a request where collection name is ignored
-        return m.containsKey(key) ? singleton(null) : singleton("*");
+        return m.containsKey(key) ? singleton(null) : Set.of("*");
       }
       return null;
     }
diff --git a/solr/core/src/java/org/apache/solr/security/PermissionNameProvider.java b/solr/core/src/java/org/apache/solr/security/PermissionNameProvider.java
index 3321c6ac248..fdd313069a6 100644
--- a/solr/core/src/java/org/apache/solr/security/PermissionNameProvider.java
+++ b/solr/core/src/java/org/apache/solr/security/PermissionNameProvider.java
@@ -24,9 +24,11 @@ import static java.util.Collections.unmodifiableSet;
 import static java.util.function.Function.identity;
 import static java.util.stream.Collectors.toMap;
 
+import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
+import org.apache.solr.common.util.SuppressForbidden;
 
 /**
  * A requestHandler should implement this interface to provide the well known permission at request
@@ -61,6 +63,7 @@ public interface PermissionNameProvider {
     final Set<String> collName;
 
     @SuppressWarnings({"unchecked"})
+    @SuppressForbidden(reason = "Set.of fails here")
     Name(String s, Object collName) {
       name = s;
       this.collName =
@@ -76,12 +79,9 @@ public interface PermissionNameProvider {
     }
   }
 
-  Set<String> NULL = singleton(null);
-  Set<String> ANY = singleton("*");
-
   Map<String, Name> values =
       unmodifiableMap(
-          asList(Name.values()).stream().collect(toMap(Name::getPermissionName, identity())));
+          Arrays.stream(Name.values()).collect(toMap(Name::getPermissionName, identity())));
 
   Name getPermissionName(AuthorizationContext request);
 }
diff --git a/solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPluginBase.java b/solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPluginBase.java
index 0b959100420..d481047f058 100644
--- a/solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPluginBase.java
+++ b/solr/core/src/java/org/apache/solr/security/RuleBasedAuthorizationPluginBase.java
@@ -40,6 +40,7 @@ import org.apache.solr.api.Api;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SpecProvider;
 import org.apache.solr.common.util.CommandOperation;
+import org.apache.solr.common.util.SuppressForbidden;
 import org.apache.solr.common.util.ValidatingJsonMap;
 import org.apache.solr.handler.admin.api.ModifyRuleBasedAuthConfigAPI;
 import org.slf4j.Logger;
@@ -358,6 +359,7 @@ public abstract class RuleBasedAuthorizationPluginBase
   }
 
   // this is to do optimized lookup of permissions for a given collection/path
+  @SuppressForbidden(reason = "singletonList(null) is intentional")
   private void add2Mapping(Permission permission) {
     for (String c : permission.collections) {
       WildCardSupportMap m = mapping.computeIfAbsent(c, k -> new WildCardSupportMap());
diff --git a/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java b/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
index 17c56aea0a3..31c38537f69 100644
--- a/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
+++ b/solr/core/src/java/org/apache/solr/security/Sha256AuthenticationProvider.java
@@ -73,8 +73,7 @@ public class Sha256AuthenticationProvider
     }
 
     promptHeader =
-        Collections.unmodifiableMap(
-            Collections.singletonMap("WWW-Authenticate", "Basic realm=\"" + realm + "\""));
+        Collections.unmodifiableMap(Map.of("WWW-Authenticate", "Basic realm=\"" + realm + "\""));
     credentials = new LinkedHashMap<>();
     @SuppressWarnings({"unchecked"})
     Map<String, String> users = (Map<String, String>) pluginConfig.get("credentials");
diff --git a/solr/core/src/java/org/apache/solr/security/cert/PathBasedCertPrincipalResolver.java b/solr/core/src/java/org/apache/solr/security/cert/PathBasedCertPrincipalResolver.java
index bc681685981..f2e823f9bb6 100644
--- a/solr/core/src/java/org/apache/solr/security/cert/PathBasedCertPrincipalResolver.java
+++ b/solr/core/src/java/org/apache/solr/security/cert/PathBasedCertPrincipalResolver.java
@@ -20,7 +20,7 @@ import java.lang.invoke.MethodHandles;
 import java.security.Principal;
 import java.security.cert.CertificateParsingException;
 import java.security.cert.X509Certificate;
-import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import javax.net.ssl.SSLPeerUnverifiedException;
@@ -120,8 +120,7 @@ public class PathBasedCertPrincipalResolver extends PathBasedCertResolverBase
   @Override
   public Principal resolvePrincipal(X509Certificate certificate)
       throws SSLPeerUnverifiedException, CertificateParsingException {
-    Map<String, Set<String>> matches =
-        getValuesFromPaths(certificate, Collections.singletonList(pattern));
+    Map<String, Set<String>> matches = getValuesFromPaths(certificate, List.of(pattern));
     String basePrincipal = null;
     if (matches != null && !matches.isEmpty()) {
       Set<String> fieldValues = matches.getOrDefault(pattern.getName(), Set.of());
diff --git a/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java b/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
index 3e638f56de9..f8c7725c429 100644
--- a/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
+++ b/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
@@ -38,7 +38,6 @@ import java.lang.invoke.MethodHandles;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
@@ -765,8 +764,7 @@ public class HttpSolrCall {
     if (collectionParam == null
         && // if collection param already exists, we may need to over-write it
         core != null
-        && collections.equals(
-            Collections.singletonList(core.getCoreDescriptor().getCollectionName()))) {
+        && collections.equals(List.of(core.getCoreDescriptor().getCollectionName()))) {
       return;
     }
     String newCollectionParam = StrUtils.join(collections, ',');
diff --git a/solr/core/src/java/org/apache/solr/update/AddUpdateCommand.java b/solr/core/src/java/org/apache/solr/update/AddUpdateCommand.java
index 5ca176ea66a..167a3d5a0bd 100644
--- a/solr/core/src/java/org/apache/solr/update/AddUpdateCommand.java
+++ b/solr/core/src/java/org/apache/solr/update/AddUpdateCommand.java
@@ -19,8 +19,8 @@ package org.apache.solr.update;
 import com.google.common.annotations.VisibleForTesting;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 import org.apache.lucene.document.Document;
 import org.apache.lucene.index.Term;
 import org.apache.lucene.util.BytesRef;
@@ -211,7 +211,7 @@ public class AddUpdateCommand extends UpdateCommand {
       final boolean ignoreNestedDocs = false; // throw an exception if found
       Document doc =
           DocumentBuilder.toDocument(solrDoc, req.getSchema(), forInPlaceUpdate, ignoreNestedDocs);
-      return Collections.singleton(doc);
+      return Set.of(doc);
     }
 
     List<SolrInputDocument> all = flatten(solrDoc);
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 5284e94e0e5..ef35d3c9b0c 100644
--- a/solr/core/src/java/org/apache/solr/update/UpdateLog.java
+++ b/solr/core/src/java/org/apache/solr/update/UpdateLog.java
@@ -1460,7 +1460,7 @@ public class UpdateLog implements PluginInfoInitialized, SolrMetricProducer {
     tlog.incref();
 
     ExecutorCompletionService<RecoveryInfo> cs = new ExecutorCompletionService<>(recoveryExecutor);
-    LogReplayer replayer = new LogReplayer(Collections.singletonList(tlog), false, true);
+    LogReplayer replayer = new LogReplayer(List.of(tlog), false, true);
 
     updateLocks.blockUpdates();
     try {
@@ -2059,7 +2059,7 @@ public class UpdateLog implements PluginInfoInitialized, SolrMetricProducer {
       throw new RuntimeException("executor is not running...");
     }
     ExecutorCompletionService<RecoveryInfo> cs = new ExecutorCompletionService<>(recoveryExecutor);
-    LogReplayer replayer = new LogReplayer(Collections.singletonList(bufferTlog), true);
+    LogReplayer replayer = new LogReplayer(List.of(bufferTlog), true);
     return cs.submit(
         () -> {
           replayer.run();
diff --git a/solr/core/src/java/org/apache/solr/update/processor/AtomicUpdateDocumentMerger.java b/solr/core/src/java/org/apache/solr/update/processor/AtomicUpdateDocumentMerger.java
index f93c729695d..3cdb0706980 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/AtomicUpdateDocumentMerger.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/AtomicUpdateDocumentMerger.java
@@ -22,7 +22,6 @@ import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Date;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
@@ -483,7 +482,7 @@ public class AtomicUpdateDocumentMerger {
       return ((Collection<?>) fieldVal)
           .stream().map(SolrInputDocument.class::cast).collect(Collectors.toList());
     } else {
-      return Collections.singletonList((SolrInputDocument) fieldVal);
+      return List.of((SolrInputDocument) fieldVal);
     }
   }
 
diff --git a/solr/core/src/java/org/apache/solr/update/processor/AtomicUpdateProcessorFactory.java b/solr/core/src/java/org/apache/solr/update/processor/AtomicUpdateProcessorFactory.java
index 8416e0eca9f..c8b7add9086 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/AtomicUpdateProcessorFactory.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/AtomicUpdateProcessorFactory.java
@@ -16,7 +16,6 @@
  */
 package org.apache.solr.update.processor;
 
-import static java.util.Collections.singletonMap;
 import static org.apache.solr.common.SolrException.ErrorCode.SERVER_ERROR;
 
 import java.io.IOException;
@@ -135,7 +134,7 @@ public class AtomicUpdateProcessorFactory extends UpdateRequestProcessorFactory
           continue;
         }
 
-        orgdoc.setField(field, singletonMap(operation, orgdoc.get(field).getValue()));
+        orgdoc.setField(field, Map.of(operation, orgdoc.get(field).getValue()));
         isAtomicUpdateAddedByMe = true;
       }
 
diff --git a/solr/core/src/java/org/apache/solr/update/processor/CloneFieldUpdateProcessorFactory.java b/solr/core/src/java/org/apache/solr/update/processor/CloneFieldUpdateProcessorFactory.java
index f9978a3ed22..8f4b7410338 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/CloneFieldUpdateProcessorFactory.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/CloneFieldUpdateProcessorFactory.java
@@ -22,7 +22,6 @@ import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -299,7 +298,7 @@ public class CloneFieldUpdateProcessorFactory extends UpdateRequestProcessorFact
           pe);
     }
     srcInclusions = new SelectorParams();
-    srcInclusions.fieldRegex = Collections.singletonList(this.pattern);
+    srcInclusions.fieldRegex = List.of(this.pattern);
   }
 
   /**
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 e381ae5f827..49c9fc717a7 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
@@ -24,7 +24,6 @@ import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.EnumSet;
 import java.util.HashSet;
 import java.util.List;
@@ -791,7 +790,7 @@ public class DistributedZkUpdateProcessor extends DistributedUpdateProcessor {
       } else {
         // I need to forward on to the leader...
         forwardToLeader = true;
-        return Collections.singletonList(
+        return List.of(
             new SolrCmdDistributor.ForwardNode(
                 new ZkCoreNodeProps(leaderReplica),
                 zkController.getZkStateReader(),
diff --git a/solr/core/src/java/org/apache/solr/update/processor/FirstFieldValueUpdateProcessorFactory.java b/solr/core/src/java/org/apache/solr/update/processor/FirstFieldValueUpdateProcessorFactory.java
index 44cff759554..3a399e2fbfb 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/FirstFieldValueUpdateProcessorFactory.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/FirstFieldValueUpdateProcessorFactory.java
@@ -20,6 +20,7 @@ import static org.apache.solr.update.processor.FieldMutatingUpdateProcessor.SELE
 
 import java.util.Collection;
 import java.util.Collections;
+import org.apache.solr.common.util.SuppressForbidden;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.update.processor.FieldMutatingUpdateProcessor.FieldNameSelector;
 
@@ -46,6 +47,7 @@ import org.apache.solr.update.processor.FieldMutatingUpdateProcessor.FieldNameSe
 public final class FirstFieldValueUpdateProcessorFactory
     extends FieldValueSubsetUpdateProcessorFactory {
 
+  @SuppressForbidden(reason = "singletonList allows null field values")
   @Override
   public <T> Collection<T> pickSubset(Collection<T> values) {
     // trust the iterator
diff --git a/solr/core/src/java/org/apache/solr/update/processor/LastFieldValueUpdateProcessorFactory.java b/solr/core/src/java/org/apache/solr/update/processor/LastFieldValueUpdateProcessorFactory.java
index 8be53308a3a..3f12f053ea6 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/LastFieldValueUpdateProcessorFactory.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/LastFieldValueUpdateProcessorFactory.java
@@ -22,6 +22,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.SortedSet;
+import org.apache.solr.common.util.SuppressForbidden;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.update.processor.FieldMutatingUpdateProcessor.FieldNameSelector;
 
@@ -48,6 +49,7 @@ import org.apache.solr.update.processor.FieldMutatingUpdateProcessor.FieldNameSe
 public final class LastFieldValueUpdateProcessorFactory
     extends FieldValueSubsetUpdateProcessorFactory {
 
+  @SuppressForbidden(reason = "singletonList allows null field values")
   @Override
   public <T> Collection<T> pickSubset(Collection<T> values) {
 
diff --git a/solr/core/src/java/org/apache/solr/update/processor/MaxFieldValueUpdateProcessorFactory.java b/solr/core/src/java/org/apache/solr/update/processor/MaxFieldValueUpdateProcessorFactory.java
index 8f985762e0f..42e412ebec5 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/MaxFieldValueUpdateProcessorFactory.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/MaxFieldValueUpdateProcessorFactory.java
@@ -22,6 +22,7 @@ import static org.apache.solr.update.processor.FieldMutatingUpdateProcessor.SELE
 import java.util.Collection;
 import java.util.Collections;
 import org.apache.solr.common.SolrException;
+import org.apache.solr.common.util.SuppressForbidden;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.update.processor.FieldMutatingUpdateProcessor.FieldNameSelector;
 
@@ -49,6 +50,7 @@ import org.apache.solr.update.processor.FieldMutatingUpdateProcessor.FieldNameSe
 public final class MaxFieldValueUpdateProcessorFactory
     extends FieldValueSubsetUpdateProcessorFactory {
 
+  @SuppressForbidden(reason = "singletonList allows null field values from Collections.max")
   @Override
   public <T> Collection<T> pickSubset(Collection<T> values) {
     try {
diff --git a/solr/core/src/java/org/apache/solr/update/processor/MinFieldValueUpdateProcessorFactory.java b/solr/core/src/java/org/apache/solr/update/processor/MinFieldValueUpdateProcessorFactory.java
index 8fef2e2e55b..4a5bd0a1e13 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/MinFieldValueUpdateProcessorFactory.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/MinFieldValueUpdateProcessorFactory.java
@@ -22,6 +22,7 @@ import static org.apache.solr.update.processor.FieldMutatingUpdateProcessor.SELE
 import java.util.Collection;
 import java.util.Collections;
 import org.apache.solr.common.SolrException;
+import org.apache.solr.common.util.SuppressForbidden;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.update.processor.FieldMutatingUpdateProcessor.FieldNameSelector;
 
@@ -49,6 +50,7 @@ import org.apache.solr.update.processor.FieldMutatingUpdateProcessor.FieldNameSe
 public final class MinFieldValueUpdateProcessorFactory
     extends FieldValueSubsetUpdateProcessorFactory {
 
+  @SuppressForbidden(reason = "singletonList allows null field values from Collections.min")
   @Override
   public <T> Collection<T> pickSubset(Collection<T> values) {
     try {
diff --git a/solr/core/src/java/org/apache/solr/update/processor/ParseBooleanFieldUpdateProcessorFactory.java b/solr/core/src/java/org/apache/solr/update/processor/ParseBooleanFieldUpdateProcessorFactory.java
index 710e98a337f..89a99da3d6a 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/ParseBooleanFieldUpdateProcessorFactory.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/ParseBooleanFieldUpdateProcessorFactory.java
@@ -17,7 +17,6 @@
 package org.apache.solr.update.processor;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.Locale;
 import java.util.Set;
@@ -66,8 +65,8 @@ public class ParseBooleanFieldUpdateProcessorFactory extends FieldMutatingUpdate
   private static final String FALSE_VALUES_PARAM = "falseValue";
   private static final String CASE_SENSITIVE_PARAM = "caseSensitive";
 
-  private Set<String> trueValues = new HashSet<>(Collections.singleton("true"));
-  private Set<String> falseValues = new HashSet<>(Collections.singleton("false"));
+  private Set<String> trueValues = new HashSet<>(Set.of("true"));
+  private Set<String> falseValues = new HashSet<>(Set.of("false"));
   private boolean caseSensitive = false;
 
   @Override
diff --git a/solr/core/src/java/org/apache/solr/update/processor/RoutedAliasUpdateProcessor.java b/solr/core/src/java/org/apache/solr/update/processor/RoutedAliasUpdateProcessor.java
index da5e771e2e8..b38cc5d1e6b 100644
--- a/solr/core/src/java/org/apache/solr/update/processor/RoutedAliasUpdateProcessor.java
+++ b/solr/core/src/java/org/apache/solr/update/processor/RoutedAliasUpdateProcessor.java
@@ -23,7 +23,6 @@ import static org.apache.solr.update.processor.DistributingUpdateProcessorFactor
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -199,9 +198,7 @@ public class RoutedAliasUpdateProcessor extends UpdateRequestProcessor {
       SolrCmdDistributor.Node targetLeaderNode =
           routeDocToSlice(targetCollection, cmd.getSolrInputDocument());
       cmdDistrib.distribAdd(
-          cmd,
-          Collections.singletonList(targetLeaderNode),
-          new ModifiableSolrParams(outParamsToLeader));
+          cmd, List.of(targetLeaderNode), new ModifiableSolrParams(outParamsToLeader));
     }
   }
 
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 aa19b6d25f4..b32b77846d2 100644
--- a/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java
+++ b/solr/core/src/java/org/apache/solr/util/SolrPluginUtils.java
@@ -16,7 +16,6 @@
  */
 package org.apache.solr.util;
 
-import static java.util.Collections.singletonList;
 import static org.apache.solr.core.PluginInfo.APPENDS;
 import static org.apache.solr.core.PluginInfo.DEFAULTS;
 import static org.apache.solr.core.PluginInfo.INVARIANTS;
@@ -171,9 +170,7 @@ public class SolrPluginUtils {
       RequestParams requestParams, SolrParams defaults, String paramSets, String type) {
     if (paramSets == null) return defaults;
     List<String> paramSetList =
-        paramSets.indexOf(',') == -1
-            ? singletonList(paramSets)
-            : StrUtils.splitSmart(paramSets, ',');
+        paramSets.indexOf(',') == -1 ? List.of(paramSets) : StrUtils.splitSmart(paramSets, ',');
     for (String name : paramSetList) {
       RequestParams.VersionedParams params = requestParams.getParams(name, type);
       if (params == null) return defaults;
diff --git a/solr/core/src/test/org/apache/solr/TestSimpleTrackingShardHandler.java b/solr/core/src/test/org/apache/solr/TestSimpleTrackingShardHandler.java
index 15bf978d4a5..6516164af93 100644
--- a/solr/core/src/test/org/apache/solr/TestSimpleTrackingShardHandler.java
+++ b/solr/core/src/test/org/apache/solr/TestSimpleTrackingShardHandler.java
@@ -16,7 +16,6 @@
  */
 package org.apache.solr;
 
-import java.util.Collections;
 import java.util.List;
 import org.apache.solr.handler.component.TrackingShardHandlerFactory;
 import org.apache.solr.handler.component.TrackingShardHandlerFactory.RequestTrackingQueue;
@@ -38,8 +37,7 @@ public class TestSimpleTrackingShardHandler extends BaseDistributedSearchTestCas
 
     TrackingShardHandlerFactory.setTrackingQueue(jettys, trackingQueue);
     // sanity check that our control jetty has the correct configs as well
-    TrackingShardHandlerFactory.setTrackingQueue(
-        Collections.singletonList(controlJetty), trackingQueue);
+    TrackingShardHandlerFactory.setTrackingQueue(List.of(controlJetty), trackingQueue);
 
     query("q", "*:*", "fl", "id", "sort", "id asc");
 
@@ -50,6 +48,6 @@ public class TestSimpleTrackingShardHandler extends BaseDistributedSearchTestCas
       }
     }
     TrackingShardHandlerFactory.setTrackingQueue(jettys, null);
-    TrackingShardHandlerFactory.setTrackingQueue(Collections.singletonList(controlJetty), null);
+    TrackingShardHandlerFactory.setTrackingQueue(List.of(controlJetty), null);
   }
 }
diff --git a/solr/core/src/test/org/apache/solr/api/NodeConfigClusterPluginsSourceTest.java b/solr/core/src/test/org/apache/solr/api/NodeConfigClusterPluginsSourceTest.java
index a50979b3418..0ad8666c527 100644
--- a/solr/core/src/test/org/apache/solr/api/NodeConfigClusterPluginsSourceTest.java
+++ b/solr/core/src/test/org/apache/solr/api/NodeConfigClusterPluginsSourceTest.java
@@ -17,7 +17,6 @@
 
 package org.apache.solr.api;
 
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import org.apache.solr.client.solrj.RemoteSolrException;
@@ -118,10 +117,7 @@ public class NodeConfigClusterPluginsSourceTest extends SolrCloudTestCase {
   public void testClusterPluginsEditApi() throws Exception {
     PluginMeta meta = SingletonNoConfig.pluginMeta();
     V2Request req =
-        new V2Request.Builder("/cluster/plugin")
-            .POST()
-            .withPayload(Collections.singletonMap("add", meta))
-            .build();
+        new V2Request.Builder("/cluster/plugin").POST().withPayload(Map.of("add", meta)).build();
     try {
       req.process(cluster.getSolrClient());
       fail("Expected a 404 response code because the Edit Apis are not registered");
diff --git a/solr/core/src/test/org/apache/solr/cli/TestSolrCLIRunExample.java b/solr/core/src/test/org/apache/solr/cli/TestSolrCLIRunExample.java
index 59bde025506..ad9660080ca 100644
--- a/solr/core/src/test/org/apache/solr/cli/TestSolrCLIRunExample.java
+++ b/solr/core/src/test/org/apache/solr/cli/TestSolrCLIRunExample.java
@@ -28,7 +28,6 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -477,8 +476,7 @@ public class TestSolrCLIRunExample extends SolrTestCaseJ4 {
     // index some docs - to verify all is good for both shards
     try (CloudSolrClient cloudClient =
         new RandomizingCloudHttp2SolrClientBuilder(
-                Collections.singletonList(executor.solrCloudCluster.getZkServer().getZkAddress()),
-                Optional.empty())
+                List.of(executor.solrCloudCluster.getZkServer().getZkAddress()), Optional.empty())
             .withDefaultCollection(collectionName)
             .build()) {
 
@@ -591,8 +589,7 @@ public class TestSolrCLIRunExample extends SolrTestCaseJ4 {
     // verify the collection was created with the specified parameters
     try (CloudSolrClient cloudClient =
         new RandomizingCloudSolrClientBuilder(
-                Collections.singletonList(executor.solrCloudCluster.getZkServer().getZkAddress()),
-                Optional.empty())
+                List.of(executor.solrCloudCluster.getZkServer().getZkAddress()), Optional.empty())
             .withDefaultCollection(collectionName)
             .build()) {
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/CollectionsAPISolrJTest.java b/solr/core/src/test/org/apache/solr/cloud/CollectionsAPISolrJTest.java
index 60636d30c92..c9598a8a19e 100644
--- a/solr/core/src/test/org/apache/solr/cloud/CollectionsAPISolrJTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/CollectionsAPISolrJTest.java
@@ -912,8 +912,7 @@ public class CollectionsAPISolrJTest extends SolrCloudTestCase {
         new AtomicReference<>(getCoreStatus(leader).startTime.getTime());
 
     // Check for value change
-    CollectionAdminRequest.modifyCollection(
-            collectionName, Collections.singletonMap(ZkStateReader.READ_ONLY, "true"))
+    CollectionAdminRequest.modifyCollection(collectionName, Map.of(ZkStateReader.READ_ONLY, "true"))
         .process(solrClient);
 
     DocCollection coll = solrClient.getClusterState().getCollection(collectionName);
@@ -986,8 +985,7 @@ public class CollectionsAPISolrJTest extends SolrCloudTestCase {
 
     // Check for removing value
     // setting to empty string is equivalent to removing the property, see SOLR-12507
-    CollectionAdminRequest.modifyCollection(
-            collectionName, Collections.singletonMap(ZkStateReader.READ_ONLY, ""))
+    CollectionAdminRequest.modifyCollection(collectionName, Map.of(ZkStateReader.READ_ONLY, ""))
         .process(cluster.getSolrClient());
     coll = solrClient.getClusterState().getCollection(collectionName);
     assertNull(coll.toString(), coll.getProperties().get(ZkStateReader.READ_ONLY));
diff --git a/solr/core/src/test/org/apache/solr/cloud/DistributedVersionInfoTest.java b/solr/core/src/test/org/apache/solr/cloud/DistributedVersionInfoTest.java
index 409adfdc26a..6df1bea6cfc 100644
--- a/solr/core/src/test/org/apache/solr/cloud/DistributedVersionInfoTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/DistributedVersionInfoTest.java
@@ -22,7 +22,6 @@ import static org.apache.solr.update.processor.DistributingUpdateProcessorFactor
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Random;
@@ -351,7 +350,7 @@ public class DistributedVersionInfoTest extends SolrCloudTestCase {
     doc.addField("id", String.valueOf(docId));
     doc.addField("a_t", "hello" + docId);
     AbstractFullDistribZkTestBase.sendDocsWithRetry(
-        cluster.getSolrClient(), COLLECTION, Collections.singletonList(doc), 2, 3, 100);
+        cluster.getSolrClient(), COLLECTION, List.of(doc), 2, 3, 100);
   }
 
   /**
diff --git a/solr/core/src/test/org/apache/solr/cloud/ForceLeaderTest.java b/solr/core/src/test/org/apache/solr/cloud/ForceLeaderTest.java
index 5364c1f32a0..e5c32a3a257 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ForceLeaderTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ForceLeaderTest.java
@@ -19,7 +19,6 @@ package org.apache.solr.cloud;
 import com.carrotsearch.randomizedtesting.annotations.Nightly;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
-import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
 import java.util.concurrent.TimeUnit;
@@ -204,8 +203,7 @@ public class ForceLeaderTest extends HttpPartitionTest {
   @Override
   protected CloudSolrClient createCloudClient(String defaultCollection) {
     CloudLegacySolrClient.Builder builder =
-        new CloudLegacySolrClient.Builder(
-            Collections.singletonList(zkServer.getZkAddress()), Optional.empty());
+        new CloudLegacySolrClient.Builder(List.of(zkServer.getZkAddress()), Optional.empty());
     builder.withDefaultCollection(TEST_COLLECTION);
     return builder.withConnectionTimeout(30000).withSocketTimeout(120000).build();
   }
@@ -306,7 +304,7 @@ public class ForceLeaderTest extends HttpPartitionTest {
     cloudClient.commit(collection);
     log.info("Doc {} sent and commit issued", docid);
     assertDocsExistInAllReplicas(notLeaders, collection, docid, docid);
-    assertDocsExistInAllReplicas(Collections.singletonList(leader), collection, docid, docid);
+    assertDocsExistInAllReplicas(List.of(leader), collection, docid, docid);
   }
 
   @Override
@@ -315,7 +313,7 @@ public class ForceLeaderTest extends HttpPartitionTest {
     doc.addField(id, String.valueOf(docId));
     doc.addField("a_t", "hello" + docId);
 
-    return sendDocsWithRetry(collectionName, Collections.singletonList(doc), 1, 5, 1);
+    return sendDocsWithRetry(collectionName, List.of(doc), 1, 5, 1);
   }
 
   private void doForceLeader(String collectionName, String shard)
@@ -324,8 +322,7 @@ public class ForceLeaderTest extends HttpPartitionTest {
         CollectionAdminRequest.forceLeaderElection(collectionName, shard);
 
     try (CloudSolrClient cloudClient =
-        new CloudLegacySolrClient.Builder(
-                Collections.singletonList(zkServer.getZkAddress()), Optional.empty())
+        new CloudLegacySolrClient.Builder(List.of(zkServer.getZkAddress()), Optional.empty())
             .withConnectionTimeout(3000)
             .withSocketTimeout(60000)
             .build()) {
diff --git a/solr/core/src/test/org/apache/solr/cloud/LeaderFailoverAfterPartitionTest.java b/solr/core/src/test/org/apache/solr/cloud/LeaderFailoverAfterPartitionTest.java
index 14408681acb..18e3d792cbe 100644
--- a/solr/core/src/test/org/apache/solr/cloud/LeaderFailoverAfterPartitionTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/LeaderFailoverAfterPartitionTest.java
@@ -17,7 +17,6 @@
 package org.apache.solr.cloud;
 
 import java.lang.invoke.MethodHandles;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -190,7 +189,7 @@ public class LeaderFailoverAfterPartitionTest extends HttpPartitionTest {
     SolrInputDocument doc = new SolrInputDocument();
     doc.addField(id, String.valueOf(6));
     doc.addField("a_t", "hello" + 6);
-    sendDocsWithRetry(testCollectionName, Collections.singletonList(doc), 1, 3, 1);
+    sendDocsWithRetry(testCollectionName, List.of(doc), 1, 3, 1);
 
     Set<String> replicasToCheck = new HashSet<>();
     for (Replica stillUp : participatingReplicas) replicasToCheck.add(stillUp.getName());
diff --git a/solr/core/src/test/org/apache/solr/cloud/LeaderFailureAfterFreshStartTest.java b/solr/core/src/test/org/apache/solr/cloud/LeaderFailureAfterFreshStartTest.java
index db978da4b36..f061661f113 100644
--- a/solr/core/src/test/org/apache/solr/cloud/LeaderFailureAfterFreshStartTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/LeaderFailureAfterFreshStartTest.java
@@ -17,8 +17,6 @@
 
 package org.apache.solr.cloud;
 
-import static java.util.Collections.singletonList;
-
 import com.carrotsearch.randomizedtesting.generators.RandomStrings;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
@@ -107,7 +105,7 @@ public class LeaderFailureAfterFreshStartTest extends AbstractFullDistribZkTestB
 
     // shutdown a node to simulate fresh start
     otherJetties.remove(freshNode);
-    forceNodeFailures(singletonList(freshNode));
+    forceNodeFailures(List.of(freshNode));
 
     del("*:*");
     waitForThingsToLevelOut(30, TimeUnit.SECONDS);
@@ -125,7 +123,7 @@ public class LeaderFailureAfterFreshStartTest extends AbstractFullDistribZkTestB
 
     // bring down the other node and index a few docs; so the leader and other node segments
     // diverge
-    forceNodeFailures(singletonList(secondNode));
+    forceNodeFailures(List.of(secondNode));
     for (int i = 0; i < 10; i++) {
       indexDoc(id, docId, i1, 50, tlong, 50, t1, "document number " + docId++);
       if (i % 2 == 0) {
@@ -133,10 +131,10 @@ public class LeaderFailureAfterFreshStartTest extends AbstractFullDistribZkTestB
       }
     }
     commit();
-    restartNodes(singletonList(secondNode));
+    restartNodes(List.of(secondNode));
 
     // start the freshNode
-    restartNodes(singletonList(freshNode));
+    restartNodes(List.of(freshNode));
     String coreName = freshNode.jetty.getCoreContainer().getCores().iterator().next().getName();
     Path replicationProperties =
         Path.of(freshNode.jetty.getSolrHome(), "cores", coreName, "data", "replication.properties");
@@ -144,7 +142,7 @@ public class LeaderFailureAfterFreshStartTest extends AbstractFullDistribZkTestB
 
     // shutdown the original leader
     log.info("Now shutting down initial leader");
-    forceNodeFailures(singletonList(initialLeaderJetty));
+    forceNodeFailures(List.of(initialLeaderJetty));
     waitForNewLeader(cloudClient, "shard1", initialLeaderJetty.info);
     waitTillNodesActive();
     log.info("Updating mappings from zk");
diff --git a/solr/core/src/test/org/apache/solr/cloud/MoveReplicaTest.java b/solr/core/src/test/org/apache/solr/cloud/MoveReplicaTest.java
index d6e00a202ee..76092a2c936 100644
--- a/solr/core/src/test/org/apache/solr/cloud/MoveReplicaTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/MoveReplicaTest.java
@@ -182,7 +182,7 @@ public class MoveReplicaTest extends SolrCloudTestCase {
           if (!r.getNodeName().equals(targetNode)) {
             continue;
           }
-          if (!r.isActive(Collections.singleton(targetNode))) {
+          if (!r.isActive(Set.of(targetNode))) {
             log.info("Not active: {}", r);
             allActive = false;
           }
@@ -227,7 +227,7 @@ public class MoveReplicaTest extends SolrCloudTestCase {
           if (!r.getNodeName().equals(replica.getNodeName())) {
             continue;
           }
-          if (!r.isActive(Collections.singleton(replica.getNodeName()))) {
+          if (!r.isActive(Set.of(replica.getNodeName()))) {
             log.info("Not active yet: {}", r);
             allActive = false;
           }
diff --git a/solr/core/src/test/org/apache/solr/cloud/OverseerModifyCollectionTest.java b/solr/core/src/test/org/apache/solr/cloud/OverseerModifyCollectionTest.java
index bae0a0cafb2..536fbce44a9 100644
--- a/solr/core/src/test/org/apache/solr/cloud/OverseerModifyCollectionTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/OverseerModifyCollectionTest.java
@@ -17,7 +17,7 @@
 
 package org.apache.solr.cloud;
 
-import java.util.Collections;
+import java.util.Map;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.response.RequestStatusState;
 import org.junit.BeforeClass;
@@ -43,8 +43,7 @@ public class OverseerModifyCollectionTest extends SolrCloudTestCase {
 
     // Modify configSet
     RequestStatusState requestStatusState =
-        CollectionAdminRequest.modifyCollection(
-                collName, Collections.singletonMap("collection.configName", "conf2"))
+        CollectionAdminRequest.modifyCollection(collName, Map.of("collection.configName", "conf2"))
             .processAndWait(cluster.getSolrClient(), DEFAULT_TIMEOUT);
     assertEquals(RequestStatusState.COMPLETED, requestStatusState);
 
@@ -58,8 +57,7 @@ public class OverseerModifyCollectionTest extends SolrCloudTestCase {
             Exception.class,
             () -> {
               CollectionAdminRequest.modifyCollection(
-                      collName,
-                      Collections.singletonMap("collection.configName", "notARealConfigName"))
+                      collName, Map.of("collection.configName", "notARealConfigName"))
                   .process(cluster.getSolrClient());
             });
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/PeerSyncReplicationTest.java b/solr/core/src/test/org/apache/solr/cloud/PeerSyncReplicationTest.java
index e89b9890bd2..c217ebb2487 100644
--- a/solr/core/src/test/org/apache/solr/cloud/PeerSyncReplicationTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/PeerSyncReplicationTest.java
@@ -17,8 +17,6 @@
 
 package org.apache.solr.cloud;
 
-import static java.util.Collections.singletonList;
-
 import com.carrotsearch.randomizedtesting.generators.RandomStrings;
 import io.opentelemetry.api.metrics.MeterProvider;
 import java.io.IOException;
@@ -121,7 +119,7 @@ public class PeerSyncReplicationTest extends AbstractFullDistribZkTestBase {
     otherJetties.remove(neverLeader);
 
     // first shutdown a node that will never be a leader
-    forceNodeFailures(singletonList(neverLeader));
+    forceNodeFailures(List.of(neverLeader));
 
     // node failure and recovery via PeerSync
     log.info("Forcing PeerSync");
@@ -143,7 +141,7 @@ public class PeerSyncReplicationTest extends AbstractFullDistribZkTestBase {
 
     // now shutdown the original leader
     log.info("Now shutting down initial leader");
-    forceNodeFailures(singletonList(initialLeaderJetty));
+    forceNodeFailures(List.of(initialLeaderJetty));
     log.info("Updating mappings from zk");
     waitForNewLeader(cloudClient, "shard1", initialLeaderJetty.info);
     updateMappingsFromZk(jettys, clients, true);
diff --git a/solr/core/src/test/org/apache/solr/cloud/ReindexCollectionTest.java b/solr/core/src/test/org/apache/solr/cloud/ReindexCollectionTest.java
index 31e4d4bbf82..aff39f246e7 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ReindexCollectionTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ReindexCollectionTest.java
@@ -18,7 +18,6 @@
 package org.apache.solr.cloud;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -78,7 +77,7 @@ public class ReindexCollectionTest extends SolrCloudTestCase {
     stateManager = cloudManager.getDistribStateManager();
     solrClient =
         new RandomizingCloudSolrClientBuilder(
-                Collections.singletonList(zkController.getZkServerAddress()), Optional.empty())
+                List.of(zkController.getZkServerAddress()), Optional.empty())
             .build();
   }
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/ShardTermsTest.java b/solr/core/src/test/org/apache/solr/cloud/ShardTermsTest.java
index 579285d7207..939a91bad62 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ShardTermsTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ShardTermsTest.java
@@ -17,7 +17,6 @@
 
 package org.apache.solr.cloud;
 
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
@@ -30,16 +29,16 @@ public class ShardTermsTest extends SolrTestCase {
     Map<String, Long> map = new HashMap<>();
     map.put("leader", 0L);
     ShardTerms terms = new ShardTerms(map, 0);
-    terms = terms.increaseTerms("leader", Collections.singleton("replica"));
+    terms = terms.increaseTerms("leader", Set.of("replica"));
     assertEquals(1L, terms.getTerm("leader").longValue());
 
     map.put("leader", 2L);
     map.put("live-replica", 2L);
     map.put("dead-replica", 1L);
     terms = new ShardTerms(map, 0);
-    assertNull(terms.increaseTerms("leader", Collections.singleton("dead-replica")));
+    assertNull(terms.increaseTerms("leader", Set.of("dead-replica")));
 
-    terms = terms.increaseTerms("leader", Collections.singleton("leader"));
+    terms = terms.increaseTerms("leader", Set.of("leader"));
     assertEquals(3L, terms.getTerm("live-replica").longValue());
     assertEquals(2L, terms.getTerm("leader").longValue());
     assertEquals(1L, terms.getTerm("dead-replica").longValue());
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestHashPartitioner.java b/solr/core/src/test/org/apache/solr/cloud/TestHashPartitioner.java
index 9b9dd28c7aa..21eda93cb37 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestHashPartitioner.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestHashPartitioner.java
@@ -18,7 +18,6 @@ package org.apache.solr.cloud;
 
 import java.time.Instant;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -299,8 +298,7 @@ public class TestHashPartitioner extends SolrTestCaseJ4 {
     return DocCollection.create(
         "collection1",
         slices,
-        Collections.singletonMap(
-            ZkStateReader.CONFIGNAME_PROP, ConfigSetsHandler.DEFAULT_CONFIGSET_NAME),
+        Map.of(ZkStateReader.CONFIGNAME_PROP, ConfigSetsHandler.DEFAULT_CONFIGSET_NAME),
         router,
         Integer.MAX_VALUE,
         Instant.EPOCH,
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestRandomFlRTGCloud.java b/solr/core/src/test/org/apache/solr/cloud/TestRandomFlRTGCloud.java
index 615c925b1cc..0423498ba6a 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestRandomFlRTGCloud.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestRandomFlRTGCloud.java
@@ -739,7 +739,7 @@ public class TestRandomFlRTGCloud extends SolrCloudTestCase {
           expectedFieldName + " vs " + actualFieldName,
           expected.getFieldValue(expectedFieldName),
           normalize(wt, actual.getFirstValue(actualFieldName)));
-      return Collections.<String>singleton(actualFieldName);
+      return Set.of(actualFieldName);
     }
   }
 
@@ -785,7 +785,7 @@ public class TestRandomFlRTGCloud extends SolrCloudTestCase {
 
     @Override
     public Set<String> getSuppressedFields() {
-      return Collections.singleton(expectedFieldName);
+      return Set.of(expectedFieldName);
     }
   }
 
@@ -834,14 +834,14 @@ public class TestRandomFlRTGCloud extends SolrCloudTestCase {
           // validates based on `actual.getFirstValue(...)`, it causes issues. Here we know that our
           // raw values are only on single-valued fields, so we wrap it to work around
           // `getFirstValue` in parent class. The same logic applies to `expected` (below)
-          actual.setField(actualFieldName, Collections.singleton(v));
+          actual.setField(actualFieldName, Set.of(v));
         }
         try {
           Object parsedExpected =
               ObjectBuilder.fromJSON((String) expected.getFieldValue(expectedFieldName));
           if (parsedExpected instanceof Collection) {
             // see note above
-            parsedExpected = Collections.singleton(parsedExpected);
+            parsedExpected = Set.of(parsedExpected);
           }
           expected = expected.deepCopy(); // need to copy before modifying expected!
           expected.setField(expectedFieldName, parsedExpected);
@@ -972,7 +972,7 @@ public class TestRandomFlRTGCloud extends SolrCloudTestCase {
       }
       assertTrue(
           USAGE + " must be >= " + minValidDocId + ": " + value, minValidDocId <= (Integer) value);
-      return Collections.<String>singleton(resultKey);
+      return Set.of(resultKey);
     }
   }
 
@@ -1012,7 +1012,7 @@ public class TestRandomFlRTGCloud extends SolrCloudTestCase {
 
       // trivial sanity check
       assertFalse(USAGE + " => blank string", value.toString().trim().isEmpty());
-      return Collections.<String>singleton(resultKey);
+      return Set.of(resultKey);
     }
   }
 
@@ -1052,7 +1052,7 @@ public class TestRandomFlRTGCloud extends SolrCloudTestCase {
 
       // trivial sanity check
       assertFalse(USAGE + " => blank string", value.toString().trim().isEmpty());
-      return Collections.singleton(resultKey);
+      return Set.of(resultKey);
     }
   }
 
@@ -1103,7 +1103,7 @@ public class TestRandomFlRTGCloud extends SolrCloudTestCase {
       Object actualVal = normalize(wt, actual.getFirstValue(resultKey));
       assertNotNull(getFlParam() + " => no value in actual doc", actualVal);
       assertEquals(getFlParam(), expectedVal, actualVal);
-      return Collections.<String>singleton(resultKey);
+      return Set.of(resultKey);
     }
   }
 
@@ -1153,7 +1153,7 @@ public class TestRandomFlRTGCloud extends SolrCloudTestCase {
           "this validator only works on numeric fields: " + origVal, origVal instanceof Number);
 
       assertEquals(fl, 1.3F, normalize(wt, actual.getFirstValue(resultKey)));
-      return Collections.<String>singleton(resultKey);
+      return Set.of(resultKey);
     }
   }
 
@@ -1218,7 +1218,7 @@ public class TestRandomFlRTGCloud extends SolrCloudTestCase {
             ((subDocIdVal < compVal) && ((compVal - 2) <= subDocIdVal)));
       }
 
-      return Collections.<String>singleton(SUBQ_KEY);
+      return Set.of(SUBQ_KEY);
     }
 
     @Override
@@ -1319,12 +1319,12 @@ public class TestRandomFlRTGCloud extends SolrCloudTestCase {
         }
       }
       assertEquals(fl, orig, actual.getFirstValue(resultKey));
-      return Collections.<String>singleton(resultKey);
+      return Set.of(resultKey);
     }
 
     @Override
     public Set<String> getSuppressedFields() {
-      return Collections.singleton(fieldName);
+      return Set.of(fieldName);
     }
   }
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/TestStressCloudBlindAtomicUpdates.java b/solr/core/src/test/org/apache/solr/cloud/TestStressCloudBlindAtomicUpdates.java
index 8f692d3006f..8abccaf7fbd 100644
--- a/solr/core/src/test/org/apache/solr/cloud/TestStressCloudBlindAtomicUpdates.java
+++ b/solr/core/src/test/org/apache/solr/cloud/TestStressCloudBlindAtomicUpdates.java
@@ -21,7 +21,6 @@ import java.net.URL;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Random;
@@ -428,8 +427,7 @@ public class TestStressCloudBlindAtomicUpdates extends SolrCloudTestCase {
       log.info("worker={}, docId={}, delta={}", workerId, docId, delta);
 
       SolrClient client = getRandClient(rand);
-      SolrInputDocument doc =
-          doc(f("id", "" + docId), f(updateField, Collections.singletonMap("inc", delta)));
+      SolrInputDocument doc = doc(f("id", "" + docId), f(updateField, Map.of("inc", delta)));
       UpdateResponse rsp = update(doc).process(client);
       assertEquals(doc + " => " + rsp, 0, rsp.getStatus());
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java b/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java
index 702c077a066..5c7cd7442d3 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ZkControllerTest.java
@@ -27,7 +27,6 @@ import java.nio.charset.StandardCharsets;
 import java.nio.file.Path;
 import java.time.Duration;
 import java.time.Instant;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -257,7 +256,7 @@ public class ZkControllerTest extends SolrCloudTestCase {
               // to wait indefinitely when using coreNodeName but usage of core name alone will
               // return immediately
               descriptor.getCloudDescriptor().setCoreNodeName("core_node0");
-              return Collections.singletonList(descriptor);
+              return List.of(descriptor);
             }
           };
       ZkController zkController = null;
diff --git a/solr/core/src/test/org/apache/solr/cloud/ZkShardTermsTest.java b/solr/core/src/test/org/apache/solr/cloud/ZkShardTermsTest.java
index eb0f3e183b8..7aed2e27d3d 100644
--- a/solr/core/src/test/org/apache/solr/cloud/ZkShardTermsTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/ZkShardTermsTest.java
@@ -65,7 +65,7 @@ public class ZkShardTermsTest extends SolrCloudTestCase {
         new ZkShardTerms(collection, "shard2", cluster.getZkClient())) {
       zkShardTerms.registerTerm("replica1");
       zkShardTerms.registerTerm("replica2");
-      zkShardTerms.ensureTermsIsHigher("replica1", Collections.singleton("replica2"));
+      zkShardTerms.ensureTermsIsHigher("replica1", Set.of("replica2"));
     }
 
     // When new collection is created, the old term nodes will be removed
@@ -94,7 +94,7 @@ public class ZkShardTermsTest extends SolrCloudTestCase {
       zkShardTerms.registerTerm("replica2");
 
       // normal case when leader failed to send an update to replica
-      zkShardTerms.ensureTermsIsHigher("replica1", Collections.singleton("replica2"));
+      zkShardTerms.ensureTermsIsHigher("replica1", Set.of("replica2"));
       zkShardTerms.startRecovering("replica2");
       assertEquals(zkShardTerms.getTerm("replica2"), 1);
       assertEquals(zkShardTerms.getTerm("replica2_recovering"), 0);
@@ -104,7 +104,7 @@ public class ZkShardTermsTest extends SolrCloudTestCase {
       assertEquals(zkShardTerms.getTerm("replica2"), 1);
       assertEquals(zkShardTerms.getTerm("replica2_recovering"), -1);
 
-      zkShardTerms.ensureTermsIsHigher("replica1", Collections.singleton("replica2"));
+      zkShardTerms.ensureTermsIsHigher("replica1", Set.of("replica2"));
       assertEquals(zkShardTerms.getTerm("replica1"), 2);
       assertEquals(zkShardTerms.getTerm("replica2"), 1);
       assertEquals(zkShardTerms.getTerm("replica2_recovering"), -1);
@@ -113,7 +113,7 @@ public class ZkShardTermsTest extends SolrCloudTestCase {
       assertEquals(zkShardTerms.getTerm("replica2"), 2);
       assertEquals(zkShardTerms.getTerm("replica2_recovering"), 1);
 
-      zkShardTerms.ensureTermsIsHigher("replica1", Collections.singleton("replica2"));
+      zkShardTerms.ensureTermsIsHigher("replica1", Set.of("replica2"));
       assertEquals(zkShardTerms.getTerm("replica1"), 3);
       assertEquals(zkShardTerms.getTerm("replica2"), 2);
       assertEquals(zkShardTerms.getTerm("replica2_recovering"), 1);
@@ -125,9 +125,9 @@ public class ZkShardTermsTest extends SolrCloudTestCase {
       zkShardTerms.startRecovering("replica2");
       zkShardTerms.doneRecovering("replica2");
 
-      zkShardTerms.ensureTermsIsHigher("replica1", Collections.singleton("replica2"));
+      zkShardTerms.ensureTermsIsHigher("replica1", Set.of("replica2"));
       zkShardTerms.startRecovering("replica2");
-      zkShardTerms.ensureTermsIsHigher("replica1", Collections.singleton("replica2"));
+      zkShardTerms.ensureTermsIsHigher("replica1", Set.of("replica2"));
       zkShardTerms.startRecovering("replica2");
       assertEquals(zkShardTerms.getTerm("replica1"), 5);
       assertEquals(zkShardTerms.getTerm("replica2"), 5);
@@ -147,7 +147,7 @@ public class ZkShardTermsTest extends SolrCloudTestCase {
       zkShardTerms.registerTerm("replica2_rem");
 
       // normal case when leader failed to send an update to replica
-      zkShardTerms.ensureTermsIsHigher("replica1_rem", Collections.singleton("replica2_rem"));
+      zkShardTerms.ensureTermsIsHigher("replica1_rem", Set.of("replica2_rem"));
       zkShardTerms.startRecovering("replica2_rem");
       assertEquals(zkShardTerms.getTerm("replica2_rem"), 1);
       assertEquals(zkShardTerms.getTerm("replica2_rem_recovering"), 0);
@@ -174,7 +174,7 @@ public class ZkShardTermsTest extends SolrCloudTestCase {
       assertEquals(0L, zkShardTerms.getTerm("rep2"));
     }
     waitFor(2, () -> rep1Terms.getTerms().size());
-    rep1Terms.ensureTermsIsHigher("rep1", Collections.singleton("rep2"));
+    rep1Terms.ensureTermsIsHigher("rep1", Set.of("rep2"));
     assertEquals(1L, rep1Terms.getTerm("rep1"));
     assertEquals(0L, rep1Terms.getTerm("rep2"));
 
@@ -272,7 +272,7 @@ public class ZkShardTermsTest extends SolrCloudTestCase {
     replicaTerms.addListener(watcher);
     replicaTerms.registerTerm("replica");
     waitFor(1, count::get);
-    leaderTerms.ensureTermsIsHigher("leader", Collections.singleton("replica"));
+    leaderTerms.ensureTermsIsHigher("leader", Set.of("replica"));
     waitFor(2, count::get);
     replicaTerms.setTermEqualsToLeader("replica");
     waitFor(3, count::get);
@@ -287,7 +287,7 @@ public class ZkShardTermsTest extends SolrCloudTestCase {
     ZkShardTerms terms = new ZkShardTerms(collection, "shard1", cluster.getZkClient());
     terms.registerTerm("leader");
     terms.registerTerm("replica");
-    terms.ensureTermsIsHigher("leader", Collections.singleton("replica"));
+    terms.ensureTermsIsHigher("leader", Set.of("replica"));
     assertEquals(1L, terms.getTerm("leader"));
     terms.setTermToZero("leader");
     assertEquals(0L, terms.getTerm("leader"));
@@ -301,7 +301,7 @@ public class ZkShardTermsTest extends SolrCloudTestCase {
     leaderTerms.registerTerm("leader");
     replicaTerms.registerTerm("replica");
 
-    leaderTerms.ensureTermsIsHigher("leader", Collections.singleton("replica"));
+    leaderTerms.ensureTermsIsHigher("leader", Set.of("replica"));
     waitFor(false, () -> replicaTerms.canBecomeLeader("replica"));
     waitFor(true, () -> leaderTerms.skipSendingUpdatesTo("replica"));
 
@@ -324,7 +324,7 @@ public class ZkShardTermsTest extends SolrCloudTestCase {
     leaderTerms.registerTerm("leader");
     replicaTerms.registerTerm("replica");
 
-    leaderTerms.ensureTermsIsHigher("leader", Collections.singleton("replica"));
+    leaderTerms.ensureTermsIsHigher("leader", Set.of("replica"));
     waitFor(false, () -> replicaTerms.canBecomeLeader("replica"));
     waitFor(true, () -> leaderTerms.skipSendingUpdatesTo("replica"));
 
diff --git a/solr/core/src/test/org/apache/solr/cloud/api/collections/ShardSplitTest.java b/solr/core/src/test/org/apache/solr/cloud/api/collections/ShardSplitTest.java
index 90421919c80..7fdf13328d1 100644
--- a/solr/core/src/test/org/apache/solr/cloud/api/collections/ShardSplitTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/api/collections/ShardSplitTest.java
@@ -21,7 +21,6 @@ import static org.apache.solr.common.cloud.ZkStateReader.REPLICATION_FACTOR;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -153,8 +152,7 @@ public class ShardSplitTest extends BasicDistributedZkTest {
             collectionName, 30, TimeUnit.SECONDS, SolrCloudTestCase.activeClusterShape(1, 1));
 
     var builder =
-        new RandomizingCloudSolrClientBuilder(
-            Collections.singletonList(zkServer.getZkAddress()), Optional.empty());
+        new RandomizingCloudSolrClientBuilder(List.of(zkServer.getZkAddress()), Optional.empty());
 
     try (CloudSolrClient client =
         builder
diff --git a/solr/core/src/test/org/apache/solr/cloud/api/collections/TestCollectionsAPIViaSolrCloudCluster.java b/solr/core/src/test/org/apache/solr/cloud/api/collections/TestCollectionsAPIViaSolrCloudCluster.java
index 4f6d009cfe5..747d7a9a8cb 100644
--- a/solr/core/src/test/org/apache/solr/cloud/api/collections/TestCollectionsAPIViaSolrCloudCluster.java
+++ b/solr/core/src/test/org/apache/solr/cloud/api/collections/TestCollectionsAPIViaSolrCloudCluster.java
@@ -54,7 +54,7 @@ public class TestCollectionsAPIViaSolrCloudCluster extends SolrCloudTestCase {
   private static final String configName = "solrCloudCollectionConfig";
   private static final Map<String, String>
       collectionProperties // ensure indexes survive core shutdown
-      = Collections.singletonMap("solr.directoryFactory", "solr.StandardDirectoryFactory");
+      = Map.of("solr.directoryFactory", "solr.StandardDirectoryFactory");
 
   @Override
   public void setUp() throws Exception {
diff --git a/solr/core/src/test/org/apache/solr/cloud/overseer/TestClusterStateMutator.java b/solr/core/src/test/org/apache/solr/cloud/overseer/TestClusterStateMutator.java
index 96dd45b58b5..577b4467127 100644
--- a/solr/core/src/test/org/apache/solr/cloud/overseer/TestClusterStateMutator.java
+++ b/solr/core/src/test/org/apache/solr/cloud/overseer/TestClusterStateMutator.java
@@ -19,7 +19,6 @@ package org.apache.solr.cloud.overseer;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-import java.util.Collections;
 import java.util.Map;
 import java.util.Set;
 import org.apache.solr.SolrTestCaseJ4;
@@ -56,7 +55,7 @@ public class TestClusterStateMutator extends SolrTestCaseJ4 {
     assertEquals("xyz", collection.getName());
     assertEquals(1, collection.getSlicesMap().size());
 
-    ClusterState state = new ClusterState(Set.of(), Collections.singletonMap("xyz", collection));
+    ClusterState state = new ClusterState(Set.of(), Map.of("xyz", collection));
     message =
         new ZkNodeProps(
             Map.of(
diff --git a/solr/core/src/test/org/apache/solr/cloud/overseer/ZkStateReaderTest.java b/solr/core/src/test/org/apache/solr/cloud/overseer/ZkStateReaderTest.java
index 3e7e575ca44..eb3eadff0e6 100644
--- a/solr/core/src/test/org/apache/solr/cloud/overseer/ZkStateReaderTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/overseer/ZkStateReaderTest.java
@@ -25,7 +25,6 @@ import java.lang.invoke.MethodHandles;
 import java.nio.file.Path;
 import java.time.Instant;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -163,7 +162,7 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
                 PerReplicaStatesOps.getZkClientPrsSupplier(
                     fixture.zkClient, DocCollection.getCollectionPath("c1"))));
 
-    writer.enqueueUpdate(reader.getClusterState(), Collections.singletonList(c1), null);
+    writer.enqueueUpdate(reader.getClusterState(), List.of(c1), null);
     writer.writePendingUpdates();
     reader.forceUpdateCollection("c1");
 
@@ -191,7 +190,7 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
             PerReplicaStatesOps.getZkClientPrsSupplier(
                 fixture.zkClient, DocCollection.getCollectionPath("c1")));
     ZkWriteCommand wc = new ZkWriteCommand("c1", state);
-    writer.enqueueUpdate(reader.getClusterState(), Collections.singletonList(wc), null);
+    writer.enqueueUpdate(reader.getClusterState(), List.of(wc), null);
     writer.writePendingUpdates();
     assertTrue(fixture.zkClient.exists(ZkStateReader.COLLECTIONS_ZKNODE + "/c1/state.json"));
     reader.waitForState(
@@ -211,7 +210,7 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
             PerReplicaStatesOps.getZkClientPrsSupplier(
                 fixture.zkClient, DocCollection.getCollectionPath("c1")));
     wc = new ZkWriteCommand("c1", state);
-    writer.enqueueUpdate(reader.getClusterState(), Collections.singletonList(wc), null);
+    writer.enqueueUpdate(reader.getClusterState(), List.of(wc), null);
     writer.writePendingUpdates();
 
     boolean found = false;
@@ -253,7 +252,7 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
             PerReplicaStatesOps.getZkClientPrsSupplier(
                 fixture.zkClient, DocCollection.getCollectionPath("c1")));
     ZkWriteCommand wc = new ZkWriteCommand("c1", state);
-    writer.enqueueUpdate(reader.getClusterState(), Collections.singletonList(wc), null);
+    writer.enqueueUpdate(reader.getClusterState(), List.of(wc), null);
     writer.writePendingUpdates();
 
     assertTrue(fixture.zkClient.exists(ZkStateReader.COLLECTIONS_ZKNODE + "/c1/state.json"));
@@ -296,7 +295,7 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
             PerReplicaStatesOps.getZkClientPrsSupplier(
                 fixture.zkClient, DocCollection.getCollectionPath("c1")));
     ZkWriteCommand wc = new ZkWriteCommand("c1", state);
-    writer.enqueueUpdate(clusterState, Collections.singletonList(wc), null);
+    writer.enqueueUpdate(clusterState, List.of(wc), null);
     clusterState = writer.writePendingUpdates();
 
     // have to register it here after the updates, otherwise the child node watch will not be
@@ -349,7 +348,7 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
 
     // now delete the collection
     wc = new ZkWriteCommand("c1", null);
-    writer.enqueueUpdate(clusterState, Collections.singletonList(wc), null);
+    writer.enqueueUpdate(clusterState, List.of(wc), null);
     clusterState = writer.writePendingUpdates();
     timeOut.waitFor(
         "Timeout on waiting for c1 to be removed from cluster state",
@@ -358,7 +357,7 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
     reader.unregisterCore("c1");
     // re-add the same collection
     wc = new ZkWriteCommand("c1", state);
-    writer.enqueueUpdate(clusterState, Collections.singletonList(wc), null);
+    writer.enqueueUpdate(clusterState, List.of(wc), null);
     clusterState = writer.writePendingUpdates();
     // re-register, otherwise the child watch would be missing from collection deletion
     reader.registerCore("c1");
@@ -417,7 +416,7 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
             PerReplicaStatesOps.getZkClientPrsSupplier(
                 fixture.zkClient, DocCollection.getCollectionPath("c1")));
     ZkWriteCommand wc = new ZkWriteCommand("c1", state);
-    writer.enqueueUpdate(reader.getClusterState(), Collections.singletonList(wc), null);
+    writer.enqueueUpdate(reader.getClusterState(), List.of(wc), null);
     writer.writePendingUpdates();
 
     assertTrue(fixture.zkClient.exists(ZkStateReader.COLLECTIONS_ZKNODE + "/c1/state.json"));
@@ -440,7 +439,7 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
             PerReplicaStatesOps.getZkClientPrsSupplier(
                 fixture.zkClient, DocCollection.getCollectionPath("c1")));
     wc = new ZkWriteCommand("c1", state);
-    writer.enqueueUpdate(reader.getClusterState(), Collections.singletonList(wc), null);
+    writer.enqueueUpdate(reader.getClusterState(), List.of(wc), null);
     writer.writePendingUpdates();
 
     reader.forciblyRefreshAllClusterStateSlow();
@@ -504,7 +503,7 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
             Instant.now(),
             null);
     ZkWriteCommand wc = new ZkWriteCommand("c1", state);
-    writer.enqueueUpdate(reader.getClusterState(), Collections.singletonList(wc), null);
+    writer.enqueueUpdate(reader.getClusterState(), List.of(wc), null);
     writer.writePendingUpdates();
 
     assertTrue(fixture.zkClient.exists(ZkStateReader.COLLECTIONS_ZKNODE + "/c1/state.json"));
@@ -526,7 +525,7 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
             Instant.now(),
             null);
     wc = new ZkWriteCommand("c1", state);
-    writer.enqueueUpdate(reader.getClusterState(), Collections.singletonList(wc), null);
+    writer.enqueueUpdate(reader.getClusterState(), List.of(wc), null);
     writer.writePendingUpdates();
 
     reader.forciblyRefreshAllClusterStateSlow();
@@ -654,7 +653,7 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
                         PerReplicaStatesOps.getZkClientPrsSupplier(
                             fixture.zkClient, DocCollection.getCollectionPath("c1")));
                 ZkWriteCommand wc = new ZkWriteCommand("c1", state);
-                writer.enqueueUpdate(clusterState, Collections.singletonList(wc), null);
+                writer.enqueueUpdate(clusterState, List.of(wc), null);
                 clusterState = writer.writePendingUpdates();
                 TimeUnit.MILLISECONDS.sleep(100);
               }
@@ -763,7 +762,7 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
               PerReplicaStatesOps.getZkClientPrsSupplier(
                   fixture.zkClient, DocCollection.getCollectionPath("c1")));
       ZkWriteCommand wc = new ZkWriteCommand("c1", state);
-      writer.enqueueUpdate(clusterState, Collections.singletonList(wc), null);
+      writer.enqueueUpdate(clusterState, List.of(wc), null);
       clusterState = writer.writePendingUpdates();
       barrier.await(250, TimeUnit.MILLISECONDS); // wait for the watch callback to execute
       fixture.zkClient.makePath(ZkStateReader.COLLECTIONS_ZKNODE + "/c1" + i, true);
@@ -799,14 +798,14 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
         DocCollection.create(
             collectionName,
             Map.of(sliceName, slice),
-            Collections.singletonMap(DocCollection.CollectionStateProps.PER_REPLICA_STATE, true),
+            Map.of(DocCollection.CollectionStateProps.PER_REPLICA_STATE, true),
             DocRouter.DEFAULT,
             0,
             Instant.now(),
             PerReplicaStatesOps.getZkClientPrsSupplier(
                 fixture.zkClient, DocCollection.getCollectionPath(collectionName)));
     ZkWriteCommand wc = new ZkWriteCommand(collectionName, state);
-    writer.enqueueUpdate(clusterState, Collections.singletonList(wc), null);
+    writer.enqueueUpdate(clusterState, List.of(wc), null);
     clusterState = writer.writePendingUpdates();
 
     TimeOut timeOut = new TimeOut(5000, TimeUnit.MILLISECONDS, TimeSource.NANO_TIME);
@@ -842,7 +841,7 @@ public class ZkStateReaderTest extends SolrTestCaseJ4 {
     wc =
         new ZkWriteCommand(
             collectionName, SliceMutator.updateReplica(state, slice, replica.getName(), replica));
-    writer.enqueueUpdate(clusterState, Collections.singletonList(wc), null);
+    writer.enqueueUpdate(clusterState, List.of(wc), null);
     clusterState = writer.writePendingUpdates();
 
     timeOut.waitFor(
diff --git a/solr/core/src/test/org/apache/solr/cloud/overseer/ZkStateWriterTest.java b/solr/core/src/test/org/apache/solr/cloud/overseer/ZkStateWriterTest.java
index f464523d406..6eed23c8b4e 100644
--- a/solr/core/src/test/org/apache/solr/cloud/overseer/ZkStateWriterTest.java
+++ b/solr/core/src/test/org/apache/solr/cloud/overseer/ZkStateWriterTest.java
@@ -19,8 +19,8 @@ package org.apache.solr.cloud.overseer;
 import java.lang.invoke.MethodHandles;
 import java.nio.file.Path;
 import java.time.Instant;
-import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -88,8 +88,7 @@ public class ZkStateWriterTest extends SolrTestCaseJ4 {
         zkClient.makePath(ZkStateReader.COLLECTIONS_ZKNODE + "/c3", true);
 
         Map<String, Object> props =
-            Collections.singletonMap(
-                ZkStateReader.CONFIGNAME_PROP, ConfigSetsHandler.DEFAULT_CONFIGSET_NAME);
+            Map.of(ZkStateReader.CONFIGNAME_PROP, ConfigSetsHandler.DEFAULT_CONFIGSET_NAME);
         ZkWriteCommand c1 = new ZkWriteCommand("c1", createDocCollection("c1", props));
         ZkWriteCommand c2 = new ZkWriteCommand("c2", createDocCollection("c2", props));
         ZkWriteCommand c3 = new ZkWriteCommand("c3", createDocCollection("c3", props));
@@ -98,23 +97,17 @@ public class ZkStateWriterTest extends SolrTestCaseJ4 {
 
         // First write is flushed immediately
         ClusterState clusterState =
-            writer.enqueueUpdate(reader.getClusterState(), Collections.singletonList(c1), null);
-        clusterState =
-            writer.enqueueUpdate(clusterState, Collections.singletonList(c1), FAIL_ON_WRITE);
-        clusterState =
-            writer.enqueueUpdate(clusterState, Collections.singletonList(c2), FAIL_ON_WRITE);
+            writer.enqueueUpdate(reader.getClusterState(), List.of(c1), null);
+        clusterState = writer.enqueueUpdate(clusterState, List.of(c1), FAIL_ON_WRITE);
+        clusterState = writer.enqueueUpdate(clusterState, List.of(c2), FAIL_ON_WRITE);
 
         Thread.sleep(Overseer.STATE_UPDATE_DELAY + 100);
         AtomicBoolean didWrite = new AtomicBoolean(false);
-        clusterState =
-            writer.enqueueUpdate(
-                clusterState, Collections.singletonList(c3), () -> didWrite.set(true));
+        clusterState = writer.enqueueUpdate(clusterState, List.of(c3), () -> didWrite.set(true));
         assertTrue("Exceed the update delay, should be flushed", didWrite.get());
 
         for (int i = 0; i <= Overseer.STATE_UPDATE_BATCH_SIZE; i++) {
-          clusterState =
-              writer.enqueueUpdate(
-                  clusterState, Collections.singletonList(c3), () -> didWrite.set(true));
+          clusterState = writer.enqueueUpdate(clusterState, List.of(c3), () -> didWrite.set(true));
         }
         assertTrue("Exceed the update batch size, should be flushed", didWrite.get());
       }
@@ -172,22 +165,16 @@ public class ZkStateWriterTest extends SolrTestCaseJ4 {
 
         // First write is flushed immediately
         ClusterState clusterState =
-            writer.enqueueUpdate(reader.getClusterState(), Collections.singletonList(c1), null);
-        clusterState =
-            writer.enqueueUpdate(clusterState, Collections.singletonList(c1), FAIL_ON_WRITE);
-        clusterState =
-            writer.enqueueUpdate(clusterState, Collections.singletonList(c2), FAIL_ON_WRITE);
+            writer.enqueueUpdate(reader.getClusterState(), List.of(c1), null);
+        clusterState = writer.enqueueUpdate(clusterState, List.of(c1), FAIL_ON_WRITE);
+        clusterState = writer.enqueueUpdate(clusterState, List.of(c2), FAIL_ON_WRITE);
 
         Thread.sleep(Overseer.STATE_UPDATE_DELAY + 100);
         AtomicBoolean didWrite = new AtomicBoolean(false);
-        clusterState =
-            writer.enqueueUpdate(
-                clusterState, Collections.singletonList(prs1), () -> didWrite.set(true));
+        clusterState = writer.enqueueUpdate(clusterState, List.of(prs1), () -> didWrite.set(true));
         assertTrue("Exceed the update delay, should be flushed", didWrite.get());
         didWrite.set(false);
-        clusterState =
-            writer.enqueueUpdate(
-                clusterState, Collections.singletonList(c3), () -> didWrite.set(true));
+        clusterState = writer.enqueueUpdate(clusterState, List.of(c3), () -> didWrite.set(true));
         assertTrue("Exceed the update delay, should be flushed", didWrite.get());
         assertTrue(
             "The updates queue should be empty having been flushed", writer.updates.isEmpty());
@@ -247,19 +234,16 @@ public class ZkStateWriterTest extends SolrTestCaseJ4 {
 
         // First write is flushed immediately
         ClusterState clusterState =
-            writer.enqueueUpdate(reader.getClusterState(), Collections.singletonList(c1), null);
+            writer.enqueueUpdate(reader.getClusterState(), List.of(c1), null);
 
         AtomicBoolean didWrite = new AtomicBoolean(false);
         AtomicBoolean didWritePrs = new AtomicBoolean(false);
         for (int i = 0; i <= Overseer.STATE_UPDATE_BATCH_SIZE; i++) {
-          clusterState =
-              writer.enqueueUpdate(
-                  clusterState, Collections.singletonList(c3), () -> didWrite.set(true));
+          clusterState = writer.enqueueUpdate(clusterState, List.of(c3), () -> didWrite.set(true));
           // Write a PRS update in the middle and make sure we still get the right results
           if (i == (Overseer.STATE_UPDATE_BATCH_SIZE / 2)) {
             clusterState =
-                writer.enqueueUpdate(
-                    clusterState, Collections.singletonList(prs1), () -> didWritePrs.set(true));
+                writer.enqueueUpdate(clusterState, List.of(prs1), () -> didWritePrs.set(true));
           }
         }
         assertTrue("Exceed the update batch size, should be flushed", didWrite.get());
@@ -305,10 +289,10 @@ public class ZkStateWriterTest extends SolrTestCaseJ4 {
                 "c1",
                 createDocCollection(
                     "c1",
-                    Collections.singletonMap(
+                    Map.of(
                         ZkStateReader.CONFIGNAME_PROP, ConfigSetsHandler.DEFAULT_CONFIGSET_NAME)));
 
-        writer.enqueueUpdate(reader.getClusterState(), Collections.singletonList(c1), null);
+        writer.enqueueUpdate(reader.getClusterState(), List.of(c1), null);
         ClusterState clusterState = writer.writePendingUpdates();
 
         Map<?, ?> map =
@@ -364,9 +348,9 @@ public class ZkStateWriterTest extends SolrTestCaseJ4 {
                 "c2",
                 createDocCollection(
                     "c2",
-                    Collections.singletonMap(
+                    Map.of(
                         ZkStateReader.CONFIGNAME_PROP, ConfigSetsHandler.DEFAULT_CONFIGSET_NAME)));
-        state = writer.enqueueUpdate(state, Collections.singletonList(c2), null);
+        state = writer.enqueueUpdate(state, List.of(c2), null);
         assertFalse(writer.hasPendingUpdates()); // first write is flushed immediately
 
         int c2Version = state.getCollection("c2").getZNodeVersion();
@@ -388,7 +372,7 @@ public class ZkStateWriterTest extends SolrTestCaseJ4 {
         assertTrue(state.hasCollection("c2"));
         assertEquals(c2Version + 1, state.getCollection("c2").getZNodeVersion());
 
-        writer.enqueueUpdate(state, Collections.singletonList(c2), null);
+        writer.enqueueUpdate(state, List.of(c2), null);
         assertTrue(writer.hasPendingUpdates());
 
         // get the most up-to-date state
@@ -402,18 +386,18 @@ public class ZkStateWriterTest extends SolrTestCaseJ4 {
                 "c1",
                 createDocCollection(
                     "c1",
-                    Collections.singletonMap(
+                    Map.of(
                         ZkStateReader.CONFIGNAME_PROP, ConfigSetsHandler.DEFAULT_CONFIGSET_NAME)));
 
         try {
-          writer.enqueueUpdate(state, Collections.singletonList(c1), null);
+          writer.enqueueUpdate(state, List.of(c1), null);
           fail("Enqueue should not have succeeded");
         } catch (KeeperException.BadVersionException bve) {
           // expected
         }
 
         try {
-          writer.enqueueUpdate(reader.getClusterState(), Collections.singletonList(c2), null);
+          writer.enqueueUpdate(reader.getClusterState(), List.of(c2), null);
           fail("enqueueUpdate after BadVersionException should not have succeeded");
         } catch (IllegalStateException e) {
           // expected
@@ -461,7 +445,7 @@ public class ZkStateWriterTest extends SolrTestCaseJ4 {
         // create new collection with stateFormat = 2
         ZkWriteCommand c1 = new ZkWriteCommand("c1", createDocCollection("c1", new HashMap<>()));
 
-        writer.enqueueUpdate(reader.getClusterState(), Collections.singletonList(c1), null);
+        writer.enqueueUpdate(reader.getClusterState(), List.of(c1), null);
         writer.writePendingUpdates();
 
         byte[] data =
@@ -497,7 +481,7 @@ public class ZkStateWriterTest extends SolrTestCaseJ4 {
                 DocCollection.create(
                     "c2", slices, new HashMap<>(), DocRouter.DEFAULT, 0, Instant.now(), null));
 
-        writer.enqueueUpdate(reader.getClusterState(), Collections.singletonList(c1), null);
+        writer.enqueueUpdate(reader.getClusterState(), List.of(c1), null);
         writer.writePendingUpdates();
 
         byte[] dataCompressed =
diff --git a/solr/core/src/test/org/apache/solr/cluster/events/ClusterEventProducerTest.java b/solr/core/src/test/org/apache/solr/cluster/events/ClusterEventProducerTest.java
index 6f217be9644..bdf6d51b49b 100644
--- a/solr/core/src/test/org/apache/solr/cluster/events/ClusterEventProducerTest.java
+++ b/solr/core/src/test/org/apache/solr/cluster/events/ClusterEventProducerTest.java
@@ -17,14 +17,12 @@
 
 package org.apache.solr.cluster.events;
 
-import static java.util.Collections.singletonMap;
 import static org.apache.solr.client.solrj.SolrRequest.METHOD.GET;
 import static org.apache.solr.client.solrj.SolrRequest.METHOD.POST;
 
 import com.carrotsearch.randomizedtesting.annotations.ThreadLeakLingering;
 import java.lang.invoke.MethodHandles;
 import java.time.Instant;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CountDownLatch;
@@ -103,7 +101,7 @@ public class ClusterEventProducerTest extends SolrCloudTestCase {
       V2Request req =
           new V2Request.Builder("/cluster/plugin")
               .withMethod(POST)
-              .withPayload(Collections.singletonMap("remove", ClusterEventProducer.PLUGIN_NAME))
+              .withPayload(Map.of("remove", ClusterEventProducer.PLUGIN_NAME))
               .build();
       req.process(cluster.getSolrClient());
     }
@@ -119,7 +117,7 @@ public class ClusterEventProducerTest extends SolrCloudTestCase {
     V2Request req =
         new V2Request.Builder("/cluster/plugin")
             .withMethod(POST)
-            .withPayload(Collections.singletonMap("add", plugin))
+            .withPayload(Map.of("add", plugin))
             .build();
     V2Response rsp = req.process(cluster.getSolrClient());
     assertEquals(0, rsp.getStatus());
@@ -341,7 +339,7 @@ public class ClusterEventProducerTest extends SolrCloudTestCase {
     V2Request req =
         new V2Request.Builder("/cluster/plugin")
             .withMethod(POST)
-            .withPayload(Collections.singletonMap("add", plugin))
+            .withPayload(Map.of("add", plugin))
             .build();
     V2Response rsp = req.process(cluster.getSolrClient());
     assertEquals(0, rsp.getStatus());
@@ -354,7 +352,7 @@ public class ClusterEventProducerTest extends SolrCloudTestCase {
         new V2Request.Builder("/cluster/plugin")
             .forceV2(true)
             .withMethod(POST)
-            .withPayload(singletonMap("add", plugin))
+            .withPayload(Map.of("add", plugin))
             .build();
     rsp = req.process(cluster.getSolrClient());
     // just check if the plugin is indeed registered
@@ -419,7 +417,7 @@ public class ClusterEventProducerTest extends SolrCloudTestCase {
     req =
         new V2Request.Builder("/cluster/plugin")
             .withMethod(POST)
-            .withPayload(Collections.singletonMap("remove", ClusterEventProducer.PLUGIN_NAME))
+            .withPayload(Map.of("remove", ClusterEventProducer.PLUGIN_NAME))
             .build();
     req.process(cluster.getSolrClient());
     version = phaser.awaitAdvanceInterruptibly(version, 10, TimeUnit.SECONDS);
@@ -440,7 +438,7 @@ public class ClusterEventProducerTest extends SolrCloudTestCase {
     req =
         new V2Request.Builder("/cluster/plugin")
             .withMethod(POST)
-            .withPayload(Collections.singletonMap("add", plugin))
+            .withPayload(Map.of("add", plugin))
             .build();
     rsp = req.process(cluster.getSolrClient());
     assertEquals(0, rsp.getStatus());
diff --git a/solr/core/src/test/org/apache/solr/cluster/events/impl/CollectionsRepairEventListenerTest.java b/solr/core/src/test/org/apache/solr/cluster/events/impl/CollectionsRepairEventListenerTest.java
index 2aec62eaa7c..3d621cc63c1 100644
--- a/solr/core/src/test/org/apache/solr/cluster/events/impl/CollectionsRepairEventListenerTest.java
+++ b/solr/core/src/test/org/apache/solr/cluster/events/impl/CollectionsRepairEventListenerTest.java
@@ -20,7 +20,7 @@ package org.apache.solr.cluster.events.impl;
 import static org.apache.solr.client.solrj.SolrRequest.METHOD.POST;
 
 import java.io.IOException;
-import java.util.Collections;
+import java.util.Map;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import org.apache.commons.io.IOUtils;
@@ -107,7 +107,7 @@ public class CollectionsRepairEventListenerTest extends SolrCloudTestCase {
     V2Request req =
         new V2Request.Builder("/cluster/plugin")
             .withMethod(POST)
-            .withPayload(Collections.singletonMap("add", plugin))
+            .withPayload(Map.of("add", plugin))
             .build();
     V2Response rsp = req.process(cluster.getSolrClient());
     assertNotNull(rsp);
diff --git a/solr/core/src/test/org/apache/solr/cluster/maintenance/InactiveShardRemoverTest.java b/solr/core/src/test/org/apache/solr/cluster/maintenance/InactiveShardRemoverTest.java
index b3a267bfdb7..f88815c7254 100644
--- a/solr/core/src/test/org/apache/solr/cluster/maintenance/InactiveShardRemoverTest.java
+++ b/solr/core/src/test/org/apache/solr/cluster/maintenance/InactiveShardRemoverTest.java
@@ -21,7 +21,6 @@ import static org.apache.solr.client.solrj.SolrRequest.METHOD.POST;
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -168,11 +167,11 @@ public class InactiveShardRemoverTest extends SolrCloudTestCase {
   private static void addPlugin(final InactiveShardRemoverConfig config)
       throws SolrServerException, IOException {
     PluginMeta plugin = pluginMeta(config);
-    pluginRequest(Collections.singletonMap("add", plugin));
+    pluginRequest(Map.of("add", plugin));
   }
 
   private static void removePlugin() throws SolrServerException, IOException {
-    pluginRequest(Collections.singletonMap("remove", InactiveShardRemover.PLUGIN_NAME));
+    pluginRequest(Map.of("remove", InactiveShardRemover.PLUGIN_NAME));
   }
 
   private static void pluginRequest(Map<String, Object> payload)
diff --git a/solr/core/src/test/org/apache/solr/cluster/placement/impl/PlacementPluginIntegrationTest.java b/solr/core/src/test/org/apache/solr/cluster/placement/impl/PlacementPluginIntegrationTest.java
index 0c81722721c..3ffb39bf373 100644
--- a/solr/core/src/test/org/apache/solr/cluster/placement/impl/PlacementPluginIntegrationTest.java
+++ b/solr/core/src/test/org/apache/solr/cluster/placement/impl/PlacementPluginIntegrationTest.java
@@ -17,7 +17,6 @@
 
 package org.apache.solr.cluster.placement.impl;
 
-import static java.util.Collections.singletonMap;
 import static org.hamcrest.Matchers.instanceOf;
 
 import java.util.Arrays;
@@ -145,7 +144,7 @@ public class PlacementPluginIntegrationTest extends SolrCloudTestCase {
         new V2Request.Builder("/cluster/plugin")
             .forceV2(true)
             .POST()
-            .withPayload(singletonMap("add", plugin))
+            .withPayload(Map.of("add", plugin))
             .build();
     req.process(cluster.getSolrClient());
 
@@ -203,7 +202,7 @@ public class PlacementPluginIntegrationTest extends SolrCloudTestCase {
         new V2Request.Builder("/cluster/plugin")
             .forceV2(true)
             .POST()
-            .withPayload(singletonMap("add", plugin))
+            .withPayload(Map.of("add", plugin))
             .build();
     req.process(cluster.getSolrClient());
 
@@ -221,7 +220,7 @@ public class PlacementPluginIntegrationTest extends SolrCloudTestCase {
         new V2Request.Builder("/cluster/plugin")
             .forceV2(true)
             .POST()
-            .withPayload(singletonMap("update", plugin))
+            .withPayload(Map.of("update", plugin))
             .build();
     req.process(cluster.getSolrClient());
 
@@ -241,7 +240,7 @@ public class PlacementPluginIntegrationTest extends SolrCloudTestCase {
         new V2Request.Builder("/cluster/plugin")
             .forceV2(true)
             .POST()
-            .withPayload(singletonMap("update", plugin))
+            .withPayload(Map.of("update", plugin))
             .build();
     req.process(cluster.getSolrClient());
 
@@ -260,7 +259,7 @@ public class PlacementPluginIntegrationTest extends SolrCloudTestCase {
         new V2Request.Builder("/cluster/plugin")
             .forceV2(true)
             .POST()
-            .withPayload(singletonMap("add", plugin))
+            .withPayload(Map.of("add", plugin))
             .build();
     req.process(cluster.getSolrClient());
     final int oldVersion = version;
@@ -312,7 +311,7 @@ public class PlacementPluginIntegrationTest extends SolrCloudTestCase {
         new V2Request.Builder("/cluster/plugin")
             .forceV2(true)
             .POST()
-            .withPayload(singletonMap("add", plugin))
+            .withPayload(Map.of("add", plugin))
             .build();
     req.process(cluster.getSolrClient());
 
@@ -413,7 +412,7 @@ public class PlacementPluginIntegrationTest extends SolrCloudTestCase {
         new V2Request.Builder("/cluster/plugin")
             .forceV2(true)
             .POST()
-            .withPayload(singletonMap("add", plugin))
+            .withPayload(Map.of("add", plugin))
             .build();
     req.process(cluster.getSolrClient());
 
diff --git a/solr/core/src/test/org/apache/solr/cluster/placement/plugins/SimplePlacementFactoryTest.java b/solr/core/src/test/org/apache/solr/cluster/placement/plugins/SimplePlacementFactoryTest.java
index 2f4d81f8658..00d18cce762 100644
--- a/solr/core/src/test/org/apache/solr/cluster/placement/plugins/SimplePlacementFactoryTest.java
+++ b/solr/core/src/test/org/apache/solr/cluster/placement/plugins/SimplePlacementFactoryTest.java
@@ -157,7 +157,7 @@ public class SimplePlacementFactoryTest extends AbstractPlacementFactoryTest {
                 shard ->
                     new PlacementRequestImpl(
                         solrCollection,
-                        Collections.singleton(shard),
+                        Set.of(shard),
                         new HashSet<>(liveNodes),
                         ReplicaCount.of(1, 0, 0)))
             .collect(Collectors.toList());
diff --git a/solr/core/src/test/org/apache/solr/core/CoreSorterTest.java b/solr/core/src/test/org/apache/solr/core/CoreSorterTest.java
index 78e8cae727f..c753a800f1f 100644
--- a/solr/core/src/test/org/apache/solr/core/CoreSorterTest.java
+++ b/solr/core/src/test/org/apache/solr/core/CoreSorterTest.java
@@ -124,7 +124,7 @@ public class CoreSorterTest extends SolrTestCaseJ4 {
         String slice = "s" + shardCounts.hashCode();
         List<Replica> replicas = new ArrayList<>();
         for (int myRepNum = 0; myRepNum < shardCounts.myReplicas; myRepNum++) {
-          addNewReplica(replicas, collection, slice, Collections.singletonList(thisNode));
+          addNewReplica(replicas, collection, slice, List.of(thisNode));
           // save this mapping for later
           myCountsToDescs.put(
               shardCounts,
@@ -145,8 +145,7 @@ public class CoreSorterTest extends SolrTestCaseJ4 {
           DocCollection.create(
               collection,
               sliceMap,
-              Collections.singletonMap(
-                  ZkStateReader.CONFIGNAME_PROP, ConfigSetsHandler.DEFAULT_CONFIGSET_NAME),
+              Map.of(ZkStateReader.CONFIGNAME_PROP, ConfigSetsHandler.DEFAULT_CONFIGSET_NAME),
               DocRouter.DEFAULT,
               Integer.MAX_VALUE,
               Instant.EPOCH,
diff --git a/solr/core/src/test/org/apache/solr/core/DirectoryFactoriesTest.java b/solr/core/src/test/org/apache/solr/core/DirectoryFactoriesTest.java
index f3a9bc5da50..1cdcaf3e8ed 100644
--- a/solr/core/src/test/org/apache/solr/core/DirectoryFactoriesTest.java
+++ b/solr/core/src/test/org/apache/solr/core/DirectoryFactoriesTest.java
@@ -18,8 +18,8 @@
 package org.apache.solr.core;
 
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 import org.apache.lucene.store.Directory;
 import org.apache.lucene.store.IOContext;
 import org.apache.lucene.store.IndexOutput;
@@ -81,7 +81,7 @@ public class DirectoryFactoriesTest extends SolrTestCaseJ4 {
         // ... or should *all* Caching DirFactories consult the cache as well as the disk itself?
         // assertTrue(path + " should exist once file is closed", dirFac.exists(path));
 
-        dir.sync(Collections.singleton("test_file"));
+        dir.sync(Set.of("test_file"));
         assertTrue(path + " should exist once file is synced", dirFac.exists(path));
 
       } finally {
diff --git a/solr/core/src/test/org/apache/solr/core/ResourceLoaderTest.java b/solr/core/src/test/org/apache/solr/core/ResourceLoaderTest.java
index f2169aca648..1b1c1de0662 100644
--- a/solr/core/src/test/org/apache/solr/core/ResourceLoaderTest.java
+++ b/solr/core/src/test/org/apache/solr/core/ResourceLoaderTest.java
@@ -26,7 +26,6 @@ import java.io.InputStream;
 import java.nio.charset.CharacterCodingException;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -227,8 +226,7 @@ public class ResourceLoaderTest extends SolrTestCaseJ4 {
     assertNotNull(loader.getClassLoader().getResource("aLibFile"));
 
     // add individual jars from other paths
-    loader.addToClassLoader(
-        Collections.singletonList(otherLib.resolve("jar2.jar").toUri().toURL()));
+    loader.addToClassLoader(List.of(otherLib.resolve("jar2.jar").toUri().toURL()));
 
     assertNotNull(loader.getClassLoader().getResource("explicitFile"));
     assertNull(loader.getClassLoader().getResource("otherFile"));
diff --git a/solr/core/src/test/org/apache/solr/core/TestConfigSetService.java b/solr/core/src/test/org/apache/solr/core/TestConfigSetService.java
index 883567b6734..3d259c95e8a 100644
--- a/solr/core/src/test/org/apache/solr/core/TestConfigSetService.java
+++ b/solr/core/src/test/org/apache/solr/core/TestConfigSetService.java
@@ -23,9 +23,9 @@ import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.function.Supplier;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.cloud.ZkConfigSetService;
@@ -91,8 +91,7 @@ public class TestConfigSetService extends SolrTestCaseJ4 {
     configSetService.uploadFileToConfig(configName, "subdir/file4", data, true);
     assertArrayEquals(configSetService.downloadFileFromConfig(configName, "subdir/file4"), data);
 
-    configSetService.setConfigMetadata(
-        configName, new HashMap<>(Collections.singletonMap("foo", true)));
+    configSetService.setConfigMetadata(configName, new HashMap<>(Map.of("foo", true)));
     assertTrue(configSetService.getConfigMetadata(configName).containsKey("foo"));
 
     List<String> configFiles = configSetService.getAllConfigFiles(configName);
diff --git a/solr/core/src/test/org/apache/solr/core/TestInitParams.java b/solr/core/src/test/org/apache/solr/core/TestInitParams.java
index c328055d126..89ae2fb08e1 100644
--- a/solr/core/src/test/org/apache/solr/core/TestInitParams.java
+++ b/solr/core/src/test/org/apache/solr/core/TestInitParams.java
@@ -16,10 +16,9 @@
  */
 package org.apache.solr.core;
 
-import static java.util.Collections.singletonMap;
-
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.Map;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.util.NamedList;
 import org.apache.solr.request.SolrRequestHandler;
@@ -55,7 +54,7 @@ public class TestInitParams extends SolrTestCaseJ4 {
         new PluginInfo(
             "requestHandler",
             new HashMap<>(),
-            new NamedList<>(singletonMap("defaults", new NamedList<>(singletonMap("a", "A1")))),
+            new NamedList<>(Map.of("defaults", new NamedList<>(Map.of("a", "A1")))),
             null);
     initParams.apply(pluginInfo);
     assertEquals("A", initParams.defaults.get("a"));
@@ -116,15 +115,14 @@ public class TestInitParams extends SolrTestCaseJ4 {
 
   public void testMatchPath() {
     InitParams initParams =
-        new InitParams(new PluginInfo(InitParams.TYPE, singletonMap("path", "/update/json/docs")));
+        new InitParams(new PluginInfo(InitParams.TYPE, Map.of("path", "/update/json/docs")));
     assertFalse(initParams.matchPath("/update"));
     assertTrue(initParams.matchPath("/update/json/docs"));
-    initParams =
-        new InitParams(new PluginInfo(InitParams.TYPE, singletonMap("path", "/update/**")));
+    initParams = new InitParams(new PluginInfo(InitParams.TYPE, Map.of("path", "/update/**")));
     assertTrue(initParams.matchPath("/update/json/docs"));
     assertTrue(initParams.matchPath("/update/json"));
     assertTrue(initParams.matchPath("/update"));
-    initParams = new InitParams(new PluginInfo(InitParams.TYPE, singletonMap("path", "/update/*")));
+    initParams = new InitParams(new PluginInfo(InitParams.TYPE, Map.of("path", "/update/*")));
     assertFalse(initParams.matchPath("/update/json/docs"));
     assertTrue(initParams.matchPath("/update/json"));
     assertTrue(initParams.matchPath("/update"));
diff --git a/solr/core/src/test/org/apache/solr/filestore/TestDistribFileStore.java b/solr/core/src/test/org/apache/solr/filestore/TestDistribFileStore.java
index a5c0d8fdb86..8e7b5ab80ed 100644
--- a/solr/core/src/test/org/apache/solr/filestore/TestDistribFileStore.java
+++ b/solr/core/src/test/org/apache/solr/filestore/TestDistribFileStore.java
@@ -47,6 +47,7 @@ import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.ModifiableSolrParams;
 import org.apache.solr.common.util.JavaBinCodec;
 import org.apache.solr.common.util.StrUtils;
+import org.apache.solr.common.util.SuppressForbidden;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.embedded.JettySolrRunner;
 import org.apache.solr.packagemanager.PackageUtils;
@@ -68,6 +69,7 @@ public class TestDistribFileStore extends SolrCloudTestCase {
   }
 
   @Test
+  @SuppressForbidden(reason = "singletonMap with null value is intentional")
   public void testFileStoreManagement() throws Exception {
     MiniSolrCloudCluster cluster =
         configureCluster(4)
diff --git a/solr/core/src/test/org/apache/solr/handler/DocumentAnalysisRequestHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/DocumentAnalysisRequestHandlerTest.java
index 4ce6b67a06e..07b912a50b8 100644
--- a/solr/core/src/test/org/apache/solr/handler/DocumentAnalysisRequestHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/DocumentAnalysisRequestHandlerTest.java
@@ -21,8 +21,8 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.Reader;
 import java.nio.charset.StandardCharsets;
-import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 import org.apache.lucene.tests.analysis.MockTokenizer;
 import org.apache.solr.client.solrj.request.DocumentAnalysisRequest;
 import org.apache.solr.common.SolrInputDocument;
@@ -83,7 +83,7 @@ public class DocumentAnalysisRequestHandlerTest extends AnalysisRequestHandlerTe
         new SolrQueryRequestBase(h.getCore(), params) {
           @Override
           public Iterable<ContentStream> getContentStreams() {
-            return Collections.singleton(cs);
+            return Set.of(cs);
           }
         };
 
@@ -154,7 +154,7 @@ public class DocumentAnalysisRequestHandlerTest extends AnalysisRequestHandlerTe
         new SolrQueryRequestBase(h.getCore(), params) {
           @Override
           public Iterable<ContentStream> getContentStreams() {
-            return Collections.singleton(cs);
+            return Set.of(cs);
           }
         };
 
@@ -187,7 +187,7 @@ public class DocumentAnalysisRequestHandlerTest extends AnalysisRequestHandlerTe
         new SolrQueryRequestBase(h.getCore(), params) {
           @Override
           public Iterable<ContentStream> getContentStreams() {
-            return Collections.singleton(cs);
+            return Set.of(cs);
           }
         };
 
diff --git a/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java b/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java
index 06593f4b3ab..8f6208449da 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java
@@ -17,8 +17,6 @@
 
 package org.apache.solr.handler;
 
-import static java.util.Collections.singletonList;
-import static java.util.Collections.singletonMap;
 import static org.apache.solr.client.solrj.SolrRequest.METHOD.GET;
 import static org.apache.solr.filestore.TestDistribFileStore.readFile;
 import static org.apache.solr.filestore.TestDistribFileStore.uploadKey;
@@ -27,6 +25,7 @@ import static org.hamcrest.Matchers.containsString;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.ByteBuffer;
+import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.Callable;
@@ -152,7 +151,7 @@ public class TestContainerPlugin extends SolrCloudTestCase {
     int version = phaser.getPhase();
 
     PluginMeta plugin = new PluginMeta();
-    V2Request addPlugin = postPlugin(singletonMap("add", plugin));
+    V2Request addPlugin = postPlugin(Map.of("add", plugin));
 
     // test with an invalid class
     try (ErrorLogMuter errors = ErrorLogMuter.substring("TestContainerPlugin$C2")) {
@@ -238,7 +237,7 @@ public class TestContainerPlugin extends SolrCloudTestCase {
 
     // update the clusterSingleton config
     c6Cfg.strVal = "updated";
-    postPlugin(singletonMap("update", plugin)).process(cluster.getSolrClient());
+    postPlugin(Map.of("update", plugin)).process(cluster.getSolrClient());
     version = phaser.awaitAdvanceInterruptibly(version, 10, TimeUnit.SECONDS);
 
     assertTrue("stopCalled", C6.stopCalled);
@@ -259,7 +258,7 @@ public class TestContainerPlugin extends SolrCloudTestCase {
     p.klass = CC.class.getName();
     p.config = cfg;
 
-    postPlugin(singletonMap("add", p)).process(cluster.getSolrClient());
+    postPlugin(Map.of("add", p)).process(cluster.getSolrClient());
 
     version = phaser.awaitAdvanceInterruptibly(version, 10, TimeUnit.SECONDS);
 
@@ -269,7 +268,7 @@ public class TestContainerPlugin extends SolrCloudTestCase {
             "/config/boolVal", "true", "/config/strVal", "Something", "/config/longVal", "1234"));
 
     cfg.strVal = "Something else";
-    postPlugin(singletonMap("update", p)).process(cluster.getSolrClient());
+    postPlugin(Map.of("update", p)).process(cluster.getSolrClient());
     version = phaser.awaitAdvanceInterruptibly(version, 10, TimeUnit.SECONDS);
 
     TestDistribFileStore.assertResponseValues(
@@ -312,12 +311,12 @@ public class TestContainerPlugin extends SolrCloudTestCase {
     PackagePayload.AddVersion add = new PackagePayload.AddVersion();
     add.version = "1.0";
     add.pkg = "mypkg";
-    add.files = singletonList(FILE1);
+    add.files = List.of(FILE1);
     V2Request addPkgVersionReq =
         new V2Request.Builder("/cluster/package")
             .forceV2(forceV2)
             .POST()
-            .withPayload(singletonMap("add", add))
+            .withPayload(Map.of("add", add))
             .build();
     addPkgVersionReq.process(cluster.getSolrClient());
     assertTrue(
@@ -337,7 +336,7 @@ public class TestContainerPlugin extends SolrCloudTestCase {
     plugin.name = "myplugin";
     plugin.klass = "mypkg:org.apache.solr.handler.MyPlugin";
     plugin.version = add.version;
-    final V2Request addPluginReq = postPlugin(singletonMap("add", plugin));
+    final V2Request addPluginReq = postPlugin(Map.of("add", plugin));
     addPluginReq.process(cluster.getSolrClient());
     version = phaser.awaitAdvanceInterruptibly(version, 10, TimeUnit.SECONDS);
 
@@ -353,12 +352,12 @@ public class TestContainerPlugin extends SolrCloudTestCase {
 
     // now let's upload the jar file for version 2.0 of the plugin
     add.version = "2.0";
-    add.files = singletonList(FILE2);
+    add.files = List.of(FILE2);
     addPkgVersionReq.process(cluster.getSolrClient());
 
     // here the plugin version is updated
     plugin.version = add.version;
-    postPlugin(singletonMap("update", plugin)).process(cluster.getSolrClient());
+    postPlugin(Map.of("update", plugin)).process(cluster.getSolrClient());
     version = phaser.awaitAdvanceInterruptibly(version, 10, TimeUnit.SECONDS);
 
     // now verify if it is indeed updated
@@ -390,7 +389,7 @@ public class TestContainerPlugin extends SolrCloudTestCase {
     plugin.klass = ConfigurablePluginWithValidation.class.getName();
     plugin.config = config;
 
-    final V2Request addPlugin = postPlugin(singletonMap("add", plugin));
+    final V2Request addPlugin = postPlugin(Map.of("add", plugin));
 
     // Verify that the expected error is thrown and the plugin is not registered
     expectError(addPlugin, "invalid config");
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/AdminHandlersProxyTest.java b/solr/core/src/test/org/apache/solr/handler/admin/AdminHandlersProxyTest.java
index 14411a38876..8e7b383db7f 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/AdminHandlersProxyTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/AdminHandlersProxyTest.java
@@ -18,7 +18,7 @@
 package org.apache.solr.handler.admin;
 
 import java.io.IOException;
-import java.util.Collections;
+import java.util.Map;
 import java.util.Set;
 import org.apache.solr.client.solrj.SolrServerException;
 import org.apache.solr.client.solrj.impl.CloudSolrClient;
@@ -50,7 +50,7 @@ public class AdminHandlersProxyTest extends SolrCloudTestCase {
 
   @Test
   public void proxySystemInfoHandlerAllNodes() throws IOException, SolrServerException {
-    MapSolrParams params = new MapSolrParams(Collections.singletonMap("nodes", "all"));
+    MapSolrParams params = new MapSolrParams(Map.of("nodes", "all"));
 
     SystemInfoRequest req = new SystemInfoRequest(params);
     SystemInfoResponse rsp = req.process(solrClient, null);
@@ -64,8 +64,7 @@ public class AdminHandlersProxyTest extends SolrCloudTestCase {
 
   @Test(expected = SolrException.class)
   public void proxySystemInfoHandlerNonExistingNode() throws IOException, SolrServerException {
-    MapSolrParams params =
-        new MapSolrParams(Collections.singletonMap("nodes", "example.com:1234_solr"));
+    MapSolrParams params = new MapSolrParams(Map.of("nodes", "example.com:1234_solr"));
     SystemInfoRequest req = new SystemInfoRequest(params);
     SystemInfoResponse rsp = req.process(solrClient, null);
   }
@@ -76,7 +75,7 @@ public class AdminHandlersProxyTest extends SolrCloudTestCase {
     assertEquals(2, nodes.size());
     nodes.forEach(
         node -> {
-          MapSolrParams params = new MapSolrParams(Collections.singletonMap("nodes", node));
+          MapSolrParams params = new MapSolrParams(Map.of("nodes", node));
           SystemInfoRequest req = new SystemInfoRequest(params);
           try {
             SystemInfoResponse rsp = req.process(solrClient, null);
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/SecurityConfHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/admin/SecurityConfHandlerTest.java
index 687171d7fad..6177c9f1a3a 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/SecurityConfHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/SecurityConfHandlerTest.java
@@ -19,7 +19,6 @@ package org.apache.solr.handler.admin;
 import static org.apache.solr.handler.admin.SecurityConfHandler.SecurityConfig;
 
 import java.nio.charset.StandardCharsets;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -49,7 +48,7 @@ public class SecurityConfHandlerTest extends SolrTestCaseJ4 {
     req.getContext().put("path", "/admin/authentication");
     ContentStreamBase.ByteArrayStream o =
         new ContentStreamBase.ByteArrayStream(command.getBytes(StandardCharsets.UTF_8), "");
-    req.setContentStreams(Collections.singletonList(o));
+    req.setContentStreams(List.of(o));
     handler.handleRequestBody(req, new SolrQueryResponse());
 
     try (BasicAuthPlugin basicAuth = new BasicAuthPlugin()) {
@@ -59,7 +58,7 @@ public class SecurityConfHandlerTest extends SolrTestCaseJ4 {
 
       command = "{\n" + "'set-user': {'harry':'HarryIsCool'},\n" + "'delete-user': ['tom']\n" + "}";
       o = new ContentStreamBase.ByteArrayStream(command.getBytes(StandardCharsets.UTF_8), "");
-      req.setContentStreams(Collections.singletonList(o));
+      req.setContentStreams(List.of(o));
       handler.handleRequestBody(req, new SolrQueryResponse());
       securityCfg = handler.m.get("/security.json");
       assertEquals(3, securityCfg.getVersion());
@@ -81,7 +80,7 @@ public class SecurityConfHandlerTest extends SolrTestCaseJ4 {
     req.getContext().put("httpMethod", SolrRequest.METHOD.POST);
     req.getContext().put("path", "/admin/authorization");
     o = new ContentStreamBase.ByteArrayStream(command.getBytes(StandardCharsets.UTF_8), "");
-    req.setContentStreams(Collections.singletonList(o));
+    req.setContentStreams(List.of(o));
     SolrQueryResponse rsp = new SolrQueryResponse();
     handler.handleRequestBody(req, rsp);
     assertNull(rsp.getValues().get(CommandOperation.ERR_MSGS));
@@ -105,7 +104,7 @@ public class SecurityConfHandlerTest extends SolrTestCaseJ4 {
     req.getContext().put("httpMethod", SolrRequest.METHOD.POST);
     req.getContext().put("path", "/admin/authorization");
     o = new ContentStreamBase.ByteArrayStream(command.getBytes(StandardCharsets.UTF_8), "");
-    req.setContentStreams(Collections.singletonList(o));
+    req.setContentStreams(List.of(o));
     rsp = new SolrQueryResponse();
     handler.handleRequestBody(req, rsp);
     authzconf = (Map) handler.m.get("/security.json").getData().get("authorization");
@@ -126,7 +125,7 @@ public class SecurityConfHandlerTest extends SolrTestCaseJ4 {
     req.getContext().put("httpMethod", SolrRequest.METHOD.POST);
     req.getContext().put("path", "/admin/authorization");
     o = new ContentStreamBase.ByteArrayStream(command.getBytes(StandardCharsets.UTF_8), "");
-    req.setContentStreams(Collections.singletonList(o));
+    req.setContentStreams(List.of(o));
     rsp = new SolrQueryResponse();
     handler.handleRequestBody(req, rsp);
     authzconf = (Map) handler.m.get("/security.json").getData().get("authorization");
@@ -143,7 +142,7 @@ public class SecurityConfHandlerTest extends SolrTestCaseJ4 {
     req.getContext().put("httpMethod", SolrRequest.METHOD.POST);
     req.getContext().put("path", "/admin/authorization");
     o = new ContentStreamBase.ByteArrayStream(command.getBytes(StandardCharsets.UTF_8), "");
-    req.setContentStreams(Collections.singletonList(o));
+    req.setContentStreams(List.of(o));
     rsp = new SolrQueryResponse();
     handler.handleRequestBody(req, rsp);
     assertNull(rsp.getValues().get(CommandOperation.ERR_MSGS));
@@ -167,7 +166,7 @@ public class SecurityConfHandlerTest extends SolrTestCaseJ4 {
     req.getContext().put("httpMethod", SolrRequest.METHOD.POST);
     req.getContext().put("path", "/admin/authorization");
     o = new ContentStreamBase.ByteArrayStream(command.getBytes(StandardCharsets.UTF_8), "");
-    req.setContentStreams(Collections.singletonList(o));
+    req.setContentStreams(List.of(o));
     rsp = new SolrQueryResponse();
     handler.handleRequestBody(req, rsp);
     @SuppressWarnings({"rawtypes"})
@@ -242,7 +241,7 @@ public class SecurityConfHandlerTest extends SolrTestCaseJ4 {
       req.getContext().put("path", "/admin/authentication");
       ContentStreamBase.ByteArrayStream o =
           new ContentStreamBase.ByteArrayStream(command.getBytes(StandardCharsets.UTF_8), "");
-      req.setContentStreams(Collections.singletonList(o));
+      req.setContentStreams(List.of(o));
       handleRequestBody(req, new SolrQueryResponse());
 
       command =
@@ -253,7 +252,7 @@ public class SecurityConfHandlerTest extends SolrTestCaseJ4 {
       req.getContext().put("httpMethod", SolrRequest.METHOD.POST);
       req.getContext().put("path", "/admin/authorization");
       o = new ContentStreamBase.ByteArrayStream(command.getBytes(StandardCharsets.UTF_8), "");
-      req.setContentStreams(Collections.singletonList(o));
+      req.setContentStreams(List.of(o));
       SolrQueryResponse rsp = new SolrQueryResponse();
       handleRequestBody(req, rsp);
       Map<String, Object> data = m.get("/security.json").getData();
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java b/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java
index 69813bf75c9..101ee2a09b3 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java
@@ -32,7 +32,6 @@ import static org.mockito.Mockito.when;
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.nio.file.Path;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -263,7 +262,7 @@ public class TestApiFramework extends SolrTestCaseJ4 {
 
           @Override
           public Iterable<ContentStream> getContentStreams() {
-            return Collections.singletonList(
+            return List.of(
                 new ContentStreamBase() {
                   @Override
                   public InputStream getStream() {
diff --git a/solr/core/src/test/org/apache/solr/handler/admin/ZookeeperStatusHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/admin/ZookeeperStatusHandlerTest.java
index 2324b4cce07..a180edacfbe 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/ZookeeperStatusHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/ZookeeperStatusHandlerTest.java
@@ -25,7 +25,6 @@ import static org.mockito.Mockito.when;
 import java.io.IOException;
 import java.net.URL;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ExecutionException;
@@ -170,9 +169,7 @@ public class ZookeeperStatusHandlerTest extends SolrCloudTestCase {
   public void validateNotWhitelisted() {
     try (ZookeeperStatusHandler zsh = new ZookeeperStatusHandler(null)) {
       zsh.validateZkRawResponse(
-          Collections.singletonList("mntr is not executed because it is not in the whitelist."),
-          "zoo1:2181",
-          "mntr");
+          List.of("mntr is not executed because it is not in the whitelist."), "zoo1:2181", "mntr");
     } catch (IOException e) {
       fail("Error closing ZookeeperStatusHandler");
     }
@@ -191,7 +188,7 @@ public class ZookeeperStatusHandlerTest extends SolrCloudTestCase {
   public void validateNotServingRequestsResponse() {
     try (ZookeeperStatusHandler zsh = new ZookeeperStatusHandler(null)) {
       zsh.validateZkRawResponse(
-          Collections.singletonList("This ZooKeeper instance is not currently serving requests"),
+          List.of("This ZooKeeper instance is not currently serving requests"),
           "zoo1:2181",
           "mntr");
     } catch (IOException e) {
diff --git a/solr/core/src/test/org/apache/solr/handler/component/ParallelHttpShardHandlerTest.java b/solr/core/src/test/org/apache/solr/handler/component/ParallelHttpShardHandlerTest.java
index ebdcbe658fb..4eb0db8858f 100644
--- a/solr/core/src/test/org/apache/solr/handler/component/ParallelHttpShardHandlerTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/component/ParallelHttpShardHandlerTest.java
@@ -16,7 +16,6 @@
  */
 package org.apache.solr.handler.component;
 
-import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.AbstractExecutorService;
 import java.util.concurrent.TimeUnit;
@@ -87,8 +86,7 @@ public class ParallelHttpShardHandlerTest extends SolrTestCaseJ4 {
     ModifiableSolrParams params = new ModifiableSolrParams();
     QueryRequest queryRequest = new QueryRequest(params);
     LBSolrClient.Endpoint endpoint = new LBSolrClient.Endpoint("http://ignored:8983/solr");
-    LBSolrClient.Req lbReq =
-        new LBSolrClient.Req(queryRequest, Collections.singletonList(endpoint));
+    LBSolrClient.Req lbReq = new LBSolrClient.Req(queryRequest, List.of(endpoint));
 
     handler.makeShardRequest(
         shardRequest, "shardA", params, lbReq, simpleResponse, shardResponse, System.nanoTime());
diff --git a/solr/core/src/test/org/apache/solr/handler/component/StatsComponentTest.java b/solr/core/src/test/org/apache/solr/handler/component/StatsComponentTest.java
index d2fe25fdcec..033901bf2f6 100644
--- a/solr/core/src/test/org/apache/solr/handler/component/StatsComponentTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/component/StatsComponentTest.java
@@ -1517,8 +1517,7 @@ public class StatsComponentTest extends SolrTestCaseJ4 {
           perShardXpaths.addAll(expectedDep.perShardXpaths);
         }
       }
-      ALL.put(
-          stat, new ExpectedStat(stat, input, perShardXpaths, Collections.singletonList(xpath)));
+      ALL.put(stat, new ExpectedStat(stat, input, perShardXpaths, List.of(xpath)));
     }
 
     public static void create(
@@ -1608,10 +1607,7 @@ public class StatsComponentTest extends SolrTestCaseJ4 {
     ExpectedStat.createSimple(Stat.stddev, "true", "double", String.valueOf(stddev));
     final String distinctValsXpath = "count(" + kpre + "arr[@name='distinctValues']/*)=10";
     ExpectedStat.create(
-        Stat.distinctValues,
-        "true",
-        Collections.singletonList(distinctValsXpath),
-        Collections.singletonList(distinctValsXpath));
+        Stat.distinctValues, "true", List.of(distinctValsXpath), List.of(distinctValsXpath));
     ExpectedStat.createSimple(Stat.countDistinct, "true", "long", "10");
     final String percentileShardXpath =
         kpre
@@ -1624,7 +1620,7 @@ public class StatsComponentTest extends SolrTestCaseJ4 {
     ExpectedStat.create(
         Stat.percentiles,
         "'90, 99'",
-        Collections.singletonList(percentileShardXpath),
+        List.of(percentileShardXpath),
         Arrays.asList(
             "count(" + kpre + "lst[@name='percentiles']/*)=2",
             kpre + "lst[@name='percentiles']/double[@name='90.0'][.=" + p90 + "]",
@@ -1636,10 +1632,7 @@ public class StatsComponentTest extends SolrTestCaseJ4 {
             + "']";
     final String cardinalityXpath = kpre + "long[@name='cardinality'][.='10']";
     ExpectedStat.create(
-        Stat.cardinality,
-        "true",
-        Collections.singletonList(cardinalityShardXpath),
-        Collections.singletonList(cardinalityXpath));
+        Stat.cardinality, "true", List.of(cardinalityShardXpath), List.of(cardinalityXpath));
 
     // canary in the coal mine
     assertEquals(
diff --git a/solr/core/src/test/org/apache/solr/handler/designer/ManagedSchemaDiffTest.java b/solr/core/src/test/org/apache/solr/handler/designer/ManagedSchemaDiffTest.java
index fa0ad697bb2..023f310399d 100644
--- a/solr/core/src/test/org/apache/solr/handler/designer/ManagedSchemaDiffTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/designer/ManagedSchemaDiffTest.java
@@ -21,7 +21,6 @@ import static org.apache.solr.handler.admin.ConfigSetsHandler.DEFAULT_CONFIGSET_
 import static org.apache.solr.handler.designer.ManagedSchemaDiff.mapFieldsToPropertyValues;
 
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -110,7 +109,7 @@ public class ManagedSchemaDiffTest extends SolrCloudTestCase {
     Map<String, Object> diff = ManagedSchemaDiff.diff(list1, list2);
     assertTrue(diff.containsKey("old"));
     assertTrue(diff.containsKey("new"));
-    assertEquals(Collections.singletonList(obj2), diff.get("old"));
+    assertEquals(List.of(obj2), diff.get("old"));
     assertEquals(Arrays.asList(obj3, obj4), diff.get("new"));
   }
 
diff --git a/solr/core/src/test/org/apache/solr/handler/designer/TestSchemaDesignerAPI.java b/solr/core/src/test/org/apache/solr/handler/designer/TestSchemaDesignerAPI.java
index 59dac14425a..ed1aba6ceb5 100644
--- a/solr/core/src/test/org/apache/solr/handler/designer/TestSchemaDesignerAPI.java
+++ b/solr/core/src/test/org/apache/solr/handler/designer/TestSchemaDesignerAPI.java
@@ -28,7 +28,6 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -108,7 +107,7 @@ public class TestSchemaDesignerAPI extends SolrCloudTestCase implements SchemaDe
 
     // POST some sample TSV docs
     ContentStream stream = new ContentStreamBase.StringStream(tsv, "text/csv");
-    when(req.getContentStreams()).thenReturn(Collections.singletonList(stream));
+    when(req.getContentStreams()).thenReturn(List.of(stream));
 
     // POST /schema-designer/analyze
     schemaDesignerAPI.analyze(req, rsp);
@@ -196,7 +195,7 @@ public class TestSchemaDesignerAPI extends SolrCloudTestCase implements SchemaDe
       ContentStreamBase.FileStream stream = new ContentStreamBase.FileStream(next);
       stream.setContentType(
           TestSampleDocumentsLoader.guessContentTypeFromFilename(next.getFileName().toString()));
-      when(req.getContentStreams()).thenReturn(Collections.singletonList(stream));
+      when(req.getContentStreams()).thenReturn(List.of(stream));
 
       rsp = new SolrQueryResponse();
 
@@ -228,7 +227,7 @@ public class TestSchemaDesignerAPI extends SolrCloudTestCase implements SchemaDe
             ENABLE_DYNAMIC_FIELDS_PARAM, false,
             ENABLE_FIELD_GUESSING_PARAM, true,
             ENABLE_NESTED_DOCS_PARAM, false,
-            LANGUAGES_PARAM, Collections.singletonList("en"),
+            LANGUAGES_PARAM, List.of("en"),
             COPY_FROM_PARAM, "_default");
     assertDesignerSettings(expSettings, rsp.getValues());
 
@@ -308,7 +307,7 @@ public class TestSchemaDesignerAPI extends SolrCloudTestCase implements SchemaDe
     // POST some sample XML docs
     ContentStreamBase.FileStream stream = new ContentStreamBase.FileStream(filmsXml);
     stream.setContentType("application/xml");
-    when(req.getContentStreams()).thenReturn(Collections.singletonList(stream));
+    when(req.getContentStreams()).thenReturn(List.of(stream));
 
     SolrQueryResponse rsp = new SolrQueryResponse();
 
@@ -362,7 +361,7 @@ public class TestSchemaDesignerAPI extends SolrCloudTestCase implements SchemaDe
     Path booksJson = ExternalPaths.SOURCE_HOME.resolve("example/exampledocs/books.json");
     ContentStreamBase.FileStream stream = new ContentStreamBase.FileStream(booksJson);
     stream.setContentType(JSON_MIME);
-    when(req.getContentStreams()).thenReturn(Collections.singletonList(stream));
+    when(req.getContentStreams()).thenReturn(List.of(stream));
 
     rsp = new SolrQueryResponse();
 
@@ -414,9 +413,7 @@ public class TestSchemaDesignerAPI extends SolrCloudTestCase implements SchemaDe
     req = mock(SolrQueryRequest.class);
     when(req.getParams()).thenReturn(reqParams);
     when(req.getContentStreams())
-        .thenReturn(
-            Collections.singletonList(
-                new ContentStreamBase.StringStream(solrconfigXml, "application/xml")));
+        .thenReturn(List.of(new ContentStreamBase.StringStream(solrconfigXml, "application/xml")));
 
     schemaDesignerAPI.updateFileContents(req, rsp);
     rspData = rsp.getValues().toSolrParams();
@@ -432,9 +429,7 @@ public class TestSchemaDesignerAPI extends SolrCloudTestCase implements SchemaDe
     req = mock(SolrQueryRequest.class);
     when(req.getParams()).thenReturn(reqParams);
     when(req.getContentStreams())
-        .thenReturn(
-            Collections.singletonList(
-                new ContentStreamBase.StringStream("<config/>", "application/xml")));
+        .thenReturn(List.of(new ContentStreamBase.StringStream("<config/>", "application/xml")));
 
     // this should fail b/c the updated solrconfig.xml is invalid
     schemaDesignerAPI.updateFileContents(req, rsp);
@@ -459,7 +454,7 @@ public class TestSchemaDesignerAPI extends SolrCloudTestCase implements SchemaDe
             ENABLE_DYNAMIC_FIELDS_PARAM, false,
             ENABLE_FIELD_GUESSING_PARAM, false,
             ENABLE_NESTED_DOCS_PARAM, false,
-            LANGUAGES_PARAM, Collections.singletonList("en"),
+            LANGUAGES_PARAM, List.of("en"),
             COPY_FROM_PARAM, "_default");
     assertDesignerSettings(expSettings, rsp.getValues());
 
@@ -561,7 +556,7 @@ public class TestSchemaDesignerAPI extends SolrCloudTestCase implements SchemaDe
     when(req.getParams()).thenReturn(reqParams);
     stream = new ContentStreamBase.FileStream(getFile("schema-designer/add-new-field.json"));
     stream.setContentType(JSON_MIME);
-    when(req.getContentStreams()).thenReturn(Collections.singletonList(stream));
+    when(req.getContentStreams()).thenReturn(List.of(stream));
     rsp = new SolrQueryResponse();
 
     // POST /schema-designer/add
@@ -582,7 +577,7 @@ public class TestSchemaDesignerAPI extends SolrCloudTestCase implements SchemaDe
     // "temp" collection
     stream = new ContentStreamBase.FileStream(getFile("schema-designer/update-author-field.json"));
     stream.setContentType(JSON_MIME);
-    when(req.getContentStreams()).thenReturn(Collections.singletonList(stream));
+    when(req.getContentStreams()).thenReturn(List.of(stream));
 
     rsp = new SolrQueryResponse();
 
@@ -600,7 +595,7 @@ public class TestSchemaDesignerAPI extends SolrCloudTestCase implements SchemaDe
     when(req.getParams()).thenReturn(reqParams);
     stream = new ContentStreamBase.FileStream(getFile("schema-designer/add-new-type.json"));
     stream.setContentType(JSON_MIME);
-    when(req.getContentStreams()).thenReturn(Collections.singletonList(stream));
+    when(req.getContentStreams()).thenReturn(List.of(stream));
     rsp = new SolrQueryResponse();
 
     // POST /schema-designer/add
@@ -626,7 +621,7 @@ public class TestSchemaDesignerAPI extends SolrCloudTestCase implements SchemaDe
     when(req.getParams()).thenReturn(reqParams);
     stream = new ContentStreamBase.FileStream(getFile("schema-designer/update-type.json"));
     stream.setContentType(JSON_MIME);
-    when(req.getContentStreams()).thenReturn(Collections.singletonList(stream));
+    when(req.getContentStreams()).thenReturn(List.of(stream));
     rsp = new SolrQueryResponse();
 
     // POST /schema-designer/update
@@ -722,7 +717,7 @@ public class TestSchemaDesignerAPI extends SolrCloudTestCase implements SchemaDe
     ContentStreamBase.FileStream stream =
         new ContentStreamBase.FileStream(getFile("schema-designer/add-new-field.json"));
     stream.setContentType(JSON_MIME);
-    when(req.getContentStreams()).thenReturn(Collections.singletonList(stream));
+    when(req.getContentStreams()).thenReturn(List.of(stream));
     rsp = new SolrQueryResponse();
 
     // POST /schema-designer/add
@@ -794,7 +789,7 @@ public class TestSchemaDesignerAPI extends SolrCloudTestCase implements SchemaDe
     assertFalse(schemaField.isRequired());
     assertTrue(schemaField.stored());
     List<String> srcFields = schema.getCopySources("_text_");
-    assertEquals(Collections.singletonList(fieldName), srcFields);
+    assertEquals(List.of(fieldName), srcFields);
   }
 
   @SuppressWarnings({"unchecked"})
@@ -857,7 +852,7 @@ public class TestSchemaDesignerAPI extends SolrCloudTestCase implements SchemaDe
 
     ContentStreamBase.StringStream stringStream =
         new ContentStreamBase.StringStream(JSONUtil.toJSON(mapParams), JSON_MIME);
-    when(req.getContentStreams()).thenReturn(Collections.singletonList(stringStream));
+    when(req.getContentStreams()).thenReturn(List.of(stringStream));
 
     rsp = new SolrQueryResponse();
     schemaDesignerAPI.updateSchemaObject(req, rsp);
@@ -868,7 +863,7 @@ public class TestSchemaDesignerAPI extends SolrCloudTestCase implements SchemaDe
     ContentStreamBase.FileStream fileStream =
         new ContentStreamBase.FileStream(getFile("schema-designer/add-new-field.json"));
     fileStream.setContentType(JSON_MIME);
-    when(req.getContentStreams()).thenReturn(Collections.singletonList(fileStream));
+    when(req.getContentStreams()).thenReturn(List.of(fileStream));
     rsp = new SolrQueryResponse();
     // POST /schema-designer/add
     schemaDesignerAPI.addSchemaObject(req, rsp);
@@ -879,7 +874,7 @@ public class TestSchemaDesignerAPI extends SolrCloudTestCase implements SchemaDe
     reqParams.set(SCHEMA_VERSION_PARAM, schemaVersion);
     fileStream = new ContentStreamBase.FileStream(getFile("schema-designer/add-new-type.json"));
     fileStream.setContentType(JSON_MIME);
-    when(req.getContentStreams()).thenReturn(Collections.singletonList(fileStream));
+    when(req.getContentStreams()).thenReturn(List.of(fileStream));
     rsp = new SolrQueryResponse();
     // POST /schema-designer/add
     schemaDesignerAPI.addSchemaObject(req, rsp);
diff --git a/solr/core/src/test/org/apache/solr/handler/designer/TestSchemaDesignerConfigSetHelper.java b/solr/core/src/test/org/apache/solr/handler/designer/TestSchemaDesignerConfigSetHelper.java
index 4552a8a65bc..82231061bdf 100644
--- a/solr/core/src/test/org/apache/solr/handler/designer/TestSchemaDesignerConfigSetHelper.java
+++ b/solr/core/src/test/org/apache/solr/handler/designer/TestSchemaDesignerConfigSetHelper.java
@@ -26,7 +26,6 @@ import static org.apache.solr.schema.IndexSchema.ROOT_FIELD_NAME;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.zip.ZipEntry;
@@ -150,14 +149,14 @@ public class TestSchemaDesignerConfigSetHelper extends SolrCloudTestCase
 
     schema =
         helper.syncLanguageSpecificObjectsAndFiles(
-            configSet, schema, Collections.singletonList("en"), true, DEFAULT_CONFIGSET_NAME);
+            configSet, schema, List.of("en"), true, DEFAULT_CONFIGSET_NAME);
     assertNotNull(schema.getFieldTypeByName("text_en"));
     assertNotNull(schema.getFieldOrNull("*_txt_en"));
     assertNull(schema.getFieldTypeByName("text_fr"));
 
     schema =
         helper.syncLanguageSpecificObjectsAndFiles(
-            configSet, schema, Collections.singletonList("en"), false, DEFAULT_CONFIGSET_NAME);
+            configSet, schema, List.of("en"), false, DEFAULT_CONFIGSET_NAME);
     assertNotNull(schema.getFieldTypeByName("text_en"));
     assertNull(schema.getFieldOrNull("*_txt_en"));
     assertNull(schema.getFieldTypeByName("text_fr"));
@@ -185,8 +184,7 @@ public class TestSchemaDesignerConfigSetHelper extends SolrCloudTestCase
     // add a field that uses text_en and then try removing "en" from the lang set
     helper.createCollection(mutableId, mutableId); // need to create field
     Map<String, Object> addField = Map.of("name", "title", "type", "text_en");
-    String addedFieldName =
-        helper.addSchemaObject(configSet, Collections.singletonMap("add-field", addField));
+    String addedFieldName = helper.addSchemaObject(configSet, Map.of("add-field", addField));
     assertEquals("title", addedFieldName);
 
     schema = helper.loadLatestSchema(helper.loadSolrConfig(mutableId));
@@ -194,7 +192,7 @@ public class TestSchemaDesignerConfigSetHelper extends SolrCloudTestCase
 
     schema =
         helper.syncLanguageSpecificObjectsAndFiles(
-            configSet, schema, Collections.singletonList("fr"), true, DEFAULT_CONFIGSET_NAME);
+            configSet, schema, List.of("fr"), true, DEFAULT_CONFIGSET_NAME);
     assertNotNull(schema.getFieldTypeByName("text_en")); // being used, so not removed
     assertNotNull(schema.getFieldOrNull("*_txt_en"));
     assertTrue(
@@ -283,8 +281,7 @@ public class TestSchemaDesignerConfigSetHelper extends SolrCloudTestCase
     helper.createCollection(mutableId, mutableId);
 
     Map<String, Object> addField = Map.of("name", "title", "type", "text_en");
-    String addedFieldName =
-        helper.addSchemaObject(configSet, Collections.singletonMap("add-field", addField));
+    String addedFieldName = helper.addSchemaObject(configSet, Map.of("add-field", addField));
     assertEquals("title", addedFieldName);
 
     Map<String, Object> analysis =
@@ -309,14 +306,11 @@ public class TestSchemaDesignerConfigSetHelper extends SolrCloudTestCase
 
     // add / update field
     Map<String, Object> addField = Map.of("name", "author", "type", "string");
-    String addedFieldName =
-        helper.addSchemaObject(configSet, Collections.singletonMap("add-field", addField));
+    String addedFieldName = helper.addSchemaObject(configSet, Map.of("add-field", addField));
     assertEquals("author", addedFieldName);
 
     helper.addSchemaObject(
-        configSet,
-        Collections.singletonMap(
-            "add-field", Map.of("name", "_catch_all_", "type", "text_general")));
+        configSet, Map.of("add-field", Map.of("name", "_catch_all_", "type", "text_general")));
 
     Map<String, Object> updateField =
         Map.of("name", "author", "type", "string", "copyDest", "_text_");
@@ -336,8 +330,8 @@ public class TestSchemaDesignerConfigSetHelper extends SolrCloudTestCase
     assertEquals(false, resp.get("rebuild"));
 
     latest = helper.loadLatestSchema(helper.loadSolrConfig(mutableId));
-    assertEquals(Collections.singletonList("author"), latest.getCopySources("_text_"));
-    assertEquals(Collections.singletonList("author"), latest.getCopySources("_catch_all_"));
+    assertEquals(List.of("author"), latest.getCopySources("_text_"));
+    assertEquals(List.of("author"), latest.getCopySources("_catch_all_"));
 
     updateField = Map.of("name", "author", "type", "string", "copyDest", "");
     latest = helper.loadLatestSchema(helper.loadSolrConfig(mutableId));
@@ -362,8 +356,7 @@ public class TestSchemaDesignerConfigSetHelper extends SolrCloudTestCase
 
     // add / update field
     Map<String, Object> addField = Map.of("name", "author", "type", "string");
-    String addedFieldName =
-        helper.addSchemaObject(configSet, Collections.singletonMap("add-field", addField));
+    String addedFieldName = helper.addSchemaObject(configSet, Map.of("add-field", addField));
     assertEquals("author", addedFieldName);
 
     Map<String, Object> updateField = Map.of("name", "author", "type", "string", "required", true);
@@ -401,7 +394,7 @@ public class TestSchemaDesignerConfigSetHelper extends SolrCloudTestCase
 
     // did the copy field update get applied?
     latest = helper.loadLatestSchema(helper.loadSolrConfig(mutableId));
-    assertEquals(Collections.singletonList("author"), latest.getCopySources("_text_"));
+    assertEquals(List.of("author"), latest.getCopySources("_text_"));
 
     // switch the author field type to strings
     updateField =
@@ -417,8 +410,7 @@ public class TestSchemaDesignerConfigSetHelper extends SolrCloudTestCase
     // add / update field type
     Map<String, Object> addType =
         Map.of("name", "testType", "class", "solr.StrField", "docValues", true);
-    String addTypeName =
-        helper.addSchemaObject(configSet, Collections.singletonMap("add-field-type", addType));
+    String addTypeName = helper.addSchemaObject(configSet, Map.of("add-field-type", addType));
     assertEquals("testType", addTypeName);
 
     latest = helper.loadLatestSchema(helper.loadSolrConfig(mutableId));
@@ -441,8 +433,7 @@ public class TestSchemaDesignerConfigSetHelper extends SolrCloudTestCase
     // add / update dynamic field
     Map<String, Object> addDynField = Map.of("name", "*_test", "type", "string");
     String addedDynFieldName =
-        helper.addSchemaObject(
-            configSet, Collections.singletonMap("add-dynamic-field", addDynField));
+        helper.addSchemaObject(configSet, Map.of("add-dynamic-field", addDynField));
     assertEquals("*_test", addedDynFieldName);
 
     // update the dynamic field
diff --git a/solr/core/src/test/org/apache/solr/handler/designer/TestSchemaDesignerSettingsDAO.java b/solr/core/src/test/org/apache/solr/handler/designer/TestSchemaDesignerSettingsDAO.java
index 3b1989c06a0..e7826e1e77a 100644
--- a/solr/core/src/test/org/apache/solr/handler/designer/TestSchemaDesignerSettingsDAO.java
+++ b/solr/core/src/test/org/apache/solr/handler/designer/TestSchemaDesignerSettingsDAO.java
@@ -19,7 +19,6 @@ package org.apache.solr.handler.designer;
 
 import static org.apache.solr.handler.admin.ConfigSetsHandler.DEFAULT_CONFIGSET_NAME;
 
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import org.apache.solr.client.solrj.SolrResponse;
@@ -119,7 +118,7 @@ public class TestSchemaDesignerSettingsDAO extends SolrCloudTestCase
     settings.setDynamicFieldsEnabled(false);
     settings.setNestedDocsEnabled(true);
     settings.setFieldGuessingEnabled(false);
-    settings.setLanguages(Collections.singletonList("en"));
+    settings.setLanguages(List.of("en"));
 
     assertTrue(
         "updated settings should have changed in ZK", dao.persistIfChanged(configSet, settings));
@@ -139,7 +138,7 @@ public class TestSchemaDesignerSettingsDAO extends SolrCloudTestCase
             DESIGNER_KEY + ENABLE_NESTED_DOCS_PARAM,
             true,
             DESIGNER_KEY + LANGUAGES_PARAM,
-            Collections.singletonList("en"));
+            List.of("en"));
     assertDesignerSettings(expSettings, settings);
     assertTrue("should be disabled", dao.isDesignerDisabled(configSet));
 
diff --git a/solr/core/src/test/org/apache/solr/handler/tagger/EmbeddedSolrNoSerializeTest.java b/solr/core/src/test/org/apache/solr/handler/tagger/EmbeddedSolrNoSerializeTest.java
index e0792724df3..ca70f22b066 100644
--- a/solr/core/src/test/org/apache/solr/handler/tagger/EmbeddedSolrNoSerializeTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/tagger/EmbeddedSolrNoSerializeTest.java
@@ -24,7 +24,7 @@ package org.apache.solr.handler.tagger;
 
 import java.io.IOException;
 import java.util.Collection;
-import java.util.Collections;
+import java.util.Set;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.BiFunction;
 import org.apache.lucene.document.Field;
@@ -99,7 +99,7 @@ public class EmbeddedSolrNoSerializeTest extends SolrTestCaseJ4 {
     @SuppressWarnings("deprecation")
     @Override
     public Collection<ContentStream> getContentStreams() {
-      return Collections.singleton(new ContentStreamBase.StringStream(input));
+      return Set.of(new ContentStreamBase.StringStream(input));
     }
 
     //     As of 7.2.  But won't work until: https://issues.apache.org/jira/browse/SOLR-12142
diff --git a/solr/core/src/test/org/apache/solr/handler/tagger/TaggerTestCase.java b/solr/core/src/test/org/apache/solr/handler/tagger/TaggerTestCase.java
index 06c75e8a305..5caa906369e 100644
--- a/solr/core/src/test/org/apache/solr/handler/tagger/TaggerTestCase.java
+++ b/solr/core/src/test/org/apache/solr/handler/tagger/TaggerTestCase.java
@@ -26,11 +26,11 @@ import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 import java.util.TreeSet;
 import org.apache.lucene.document.Document;
 import org.apache.solr.SolrTestCaseJ4;
@@ -182,7 +182,7 @@ public abstract class TaggerTestCase extends SolrTestCaseJ4 {
     SolrParams params = SolrParams.wrapDefaults(moreParams, baseParams);
     SolrQueryRequestBase req = new SolrQueryRequestBase(h.getCore(), params) {};
     Iterable<ContentStream> stream =
-        Collections.singleton((ContentStream) new ContentStreamBase.StringStream(doc));
+        Set.of((ContentStream) new ContentStreamBase.StringStream(doc));
     req.setContentStreams(stream);
     return req;
   }
diff --git a/solr/core/src/test/org/apache/solr/handler/tagger/XmlInterpolationTest.java b/solr/core/src/test/org/apache/solr/handler/tagger/XmlInterpolationTest.java
index 38b24490d26..0e4a8c383c5 100644
--- a/solr/core/src/test/org/apache/solr/handler/tagger/XmlInterpolationTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/tagger/XmlInterpolationTest.java
@@ -26,9 +26,9 @@ import java.io.IOException;
 import java.io.Reader;
 import java.io.StringReader;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Locale;
+import java.util.Set;
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import org.apache.lucene.analysis.charfilter.HTMLStripCharFilter;
@@ -203,8 +203,7 @@ public class XmlInterpolationTest extends TaggerTestCase {
   private String[] analyzeReturnTokens(String docText) {
     List<String> result = new ArrayList<>();
 
-    Reader filter =
-        new HTMLStripCharFilter(new StringReader(docText), Collections.singleton("unescaped"));
+    Reader filter = new HTMLStripCharFilter(new StringReader(docText), Set.of("unescaped"));
     WhitespaceTokenizer ts = new WhitespaceTokenizer();
     final CharTermAttribute termAttribute = ts.addAttribute(CharTermAttribute.class);
     try {
diff --git a/solr/core/src/test/org/apache/solr/highlight/HighlighterTest.java b/solr/core/src/test/org/apache/solr/highlight/HighlighterTest.java
index ab8c4cd2512..0f50498c75b 100644
--- a/solr/core/src/test/org/apache/solr/highlight/HighlighterTest.java
+++ b/solr/core/src/test/org/apache/solr/highlight/HighlighterTest.java
@@ -18,7 +18,6 @@ package org.apache.solr.highlight;
 
 import java.io.IOException;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -1388,8 +1387,7 @@ public class HighlighterTest extends SolrTestCaseJ4 {
     Query query =
         new SpanPayloadCheckQuery(
             new SpanTermQuery(new Term(FIELD_NAME, "word")),
-            Collections.singletonList(
-                new BytesRef(new byte[] {0, 0, 0, 7}))); // bytes for integer 7
+            List.of(new BytesRef(new byte[] {0, 0, 0, 7}))); // bytes for integer 7
 
     // invoke highlight component... the hard way
     final SearchComponent hlComp = h.getCore().getSearchComponent("highlight");
@@ -1397,7 +1395,7 @@ public class HighlighterTest extends SolrTestCaseJ4 {
         req("hl", "true", "hl.fl", FIELD_NAME, HighlightParams.USE_PHRASE_HIGHLIGHTER, "true");
     try {
       SolrQueryResponse resp = new SolrQueryResponse();
-      ResponseBuilder rb = new ResponseBuilder(req, resp, Collections.singletonList(hlComp));
+      ResponseBuilder rb = new ResponseBuilder(req, resp, List.of(hlComp));
       rb.setHighlightQuery(query);
       rb.setResults(req.getSearcher().getDocListAndSet(query, null, 0, 1));
       // highlight:
diff --git a/solr/core/src/test/org/apache/solr/packagemanager/TestPackageManager.java b/solr/core/src/test/org/apache/solr/packagemanager/TestPackageManager.java
index 69f590136ae..4d6bedf078a 100644
--- a/solr/core/src/test/org/apache/solr/packagemanager/TestPackageManager.java
+++ b/solr/core/src/test/org/apache/solr/packagemanager/TestPackageManager.java
@@ -19,7 +19,7 @@ package org.apache.solr.packagemanager;
 import com.jayway.jsonpath.InvalidPathException;
 import java.io.IOException;
 import java.net.URL;
-import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import org.apache.solr.cli.CLITestHelper;
 import org.apache.solr.cli.ToolRuntime;
@@ -64,13 +64,8 @@ public class TestPackageManager extends SolrCloudTestCase {
         plugin.verifyCommand.condition = "&[no_quotes_error_jpath]";
         manager.verify(
             new SolrPackageInstance(
-                "",
-                "",
-                "1.0",
-                new SolrPackage.Manifest(),
-                Collections.singletonList(plugin),
-                Map.of()),
-            Collections.singletonList(COLLECTION_NAME),
+                "", "", "1.0", new SolrPackage.Manifest(), List.of(plugin), Map.of()),
+            List.of(COLLECTION_NAME),
             plugin.type.equals("cluster"),
             new String[0]);
         fail();
diff --git a/solr/core/src/test/org/apache/solr/pkg/TestPackages.java b/solr/core/src/test/org/apache/solr/pkg/TestPackages.java
index 9f32d698b19..597e2044544 100644
--- a/solr/core/src/test/org/apache/solr/pkg/TestPackages.java
+++ b/solr/core/src/test/org/apache/solr/pkg/TestPackages.java
@@ -31,7 +31,6 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.nio.ByteBuffer;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -141,7 +140,7 @@ public class TestPackages extends SolrCloudTestCase {
         new V2Request.Builder("/cluster/package")
             .forceV2(true)
             .withMethod(SolrRequest.METHOD.POST)
-            .withPayload(Collections.singletonMap("add", add))
+            .withPayload(Map.of("add", add))
             .build();
 
     req.process(cluster.getSolrClient());
@@ -222,7 +221,7 @@ public class TestPackages extends SolrCloudTestCase {
         new V2Request.Builder("/cluster/package")
             .forceV2(true)
             .withMethod(SolrRequest.METHOD.POST)
-            .withPayload(Collections.singletonMap("add", add))
+            .withPayload(Map.of("add", add))
             .build();
 
     req.process(cluster.getSolrClient());
@@ -412,7 +411,7 @@ public class TestPackages extends SolrCloudTestCase {
         new V2Request.Builder("/cluster/package")
             .withMethod(SolrRequest.METHOD.POST)
             .forceV2(true)
-            .withPayload(Collections.singletonMap("delete", delVersion))
+            .withPayload(Map.of("delete", delVersion))
             .build();
     delete.process(cluster.getSolrClient());
 
@@ -595,7 +594,7 @@ public class TestPackages extends SolrCloudTestCase {
         new V2Request.Builder("/cluster/package")
             .forceV2(true)
             .withMethod(SolrRequest.METHOD.POST)
-            .withPayload(Collections.singletonMap("add", add))
+            .withPayload(Map.of("add", add))
             .build();
 
     // the files are not yet there. The command should fail with error saying "No such file"
@@ -604,7 +603,7 @@ public class TestPackages extends SolrCloudTestCase {
     // post the jar file. No signature is sent
     postFileAndWait(cluster, "runtimecode/runtimelibs.jar.bin", FILE1, null);
 
-    add.files = Collections.singletonList(FILE1);
+    add.files = List.of(FILE1);
     expectError(req, cluster.getSolrClient(), errPath, FILE1 + " has no signature");
     // now we upload the keys
     byte[] derFile = readFile("cryptokeys/pub_key512.der");
@@ -617,7 +616,7 @@ public class TestPackages extends SolrCloudTestCase {
         "L3q/qIGs4NaF6JiO0ZkMUFa88j0OmYc+I6O7BOdNuMct/xoZ4h73aZHZGc0+nmI1f/U3bOlMPINlSOM6LK3JpQ==");
     // with correct signature
     // after uploading the file, let's delete the keys to see if we get proper error message
-    add.files = Collections.singletonList(FILE2);
+    add.files = List.of(FILE2);
     /*expectError(req, cluster.getSolrClient(), errPath,
     "ZooKeeper does not have any public keys");*/
 
@@ -645,7 +644,7 @@ public class TestPackages extends SolrCloudTestCase {
     // this time we are adding the second version of the package (0.13)
     add.version = "0.13";
     add.pkg = "test_pkg";
-    add.files = Collections.singletonList(FILE3);
+    add.files = List.of(FILE3);
 
     // this request should succeed
     req.process(cluster.getSolrClient());
@@ -665,7 +664,7 @@ public class TestPackages extends SolrCloudTestCase {
         new V2Request.Builder("/cluster/package")
             .forceV2(true)
             .withMethod(SolrRequest.METHOD.POST)
-            .withPayload(Collections.singletonMap("delete", delVersion))
+            .withPayload(Map.of("delete", delVersion))
             .build();
 
     // we are expecting an error
@@ -772,7 +771,7 @@ public class TestPackages extends SolrCloudTestCase {
         new V2Request.Builder("/cluster/package")
             .forceV2(true)
             .withMethod(SolrRequest.METHOD.POST)
-            .withPayload(Collections.singletonMap("add", add))
+            .withPayload(Map.of("add", add))
             .build();
     req.process(cluster.getSolrClient());
 
@@ -814,7 +813,7 @@ public class TestPackages extends SolrCloudTestCase {
         new V2Request.Builder("/cluster/package")
             .forceV2(true)
             .withMethod(SolrRequest.METHOD.POST)
-            .withPayload(Collections.singletonMap("add", add))
+            .withPayload(Map.of("add", add))
             .build();
     req.process(cluster.getSolrClient());
 
diff --git a/solr/core/src/test/org/apache/solr/request/macro/TestMacroExpander.java b/solr/core/src/test/org/apache/solr/request/macro/TestMacroExpander.java
index 231fa299c94..a31e4f37e2a 100644
--- a/solr/core/src/test/org/apache/solr/request/macro/TestMacroExpander.java
+++ b/solr/core/src/test/org/apache/solr/request/macro/TestMacroExpander.java
@@ -16,7 +16,6 @@
  */
 package org.apache.solr.request.macro;
 
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import org.apache.solr.SolrTestCase;
@@ -154,7 +153,7 @@ public class TestMacroExpander extends SolrTestCase {
 
   @Test
   public void testUnbalanced() { // SOLR-13181
-    final Map<String, String[]> request = Collections.singletonMap("answer", new String[] {"42"});
+    final Map<String, String[]> request = Map.of("answer", new String[] {"42"});
     final MacroExpander meSkipOnMissingParams = new MacroExpander(request);
     final MacroExpander meFailOnMissingParams = new MacroExpander(request, true);
     assertEquals("${noClose", meSkipOnMissingParams.expand("${noClose"));
diff --git a/solr/core/src/test/org/apache/solr/response/TestPushWriter.java b/solr/core/src/test/org/apache/solr/response/TestPushWriter.java
index 08e01b3830b..8cf3d154687 100644
--- a/solr/core/src/test/org/apache/solr/response/TestPushWriter.java
+++ b/solr/core/src/test/org/apache/solr/response/TestPushWriter.java
@@ -17,8 +17,6 @@
 
 package org.apache.solr.response;
 
-import static java.util.Collections.singletonMap;
-
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.OutputStreamWriter;
@@ -102,7 +100,7 @@ public class TestPushWriter extends SolrTestCaseJ4 {
   protected void writeData(PushWriter pw) throws IOException {
     pw.writeMap(
         m -> {
-          m.put("responseHeader", singletonMap("status", 0))
+          m.put("responseHeader", Map.of("status", 0))
               .put(
                   "response",
                   (MapWriter)
@@ -113,8 +111,8 @@ public class TestPushWriter extends SolrTestCaseJ4 {
                                 (IteratorWriter)
                                     w -> {
                                       w.add((MapWriter) m3 -> m3.put("id", 1))
-                                          .add(singletonMap("id", 2))
-                                          .add(singletonMap("id", 3));
+                                          .add(Map.of("id", 2))
+                                          .add(Map.of("id", 3));
                                     });
                       });
         });
@@ -125,7 +123,7 @@ public class TestPushWriter extends SolrTestCaseJ4 {
     pw.writeMap(
         name,
         m -> {
-          m.put("responseHeader", singletonMap("status", 0))
+          m.put("responseHeader", Map.of("status", 0))
               .put(
                   "response",
                   (MapWriter)
@@ -136,8 +134,8 @@ public class TestPushWriter extends SolrTestCaseJ4 {
                                 (IteratorWriter)
                                     w -> {
                                       w.add((MapWriter) m3 -> m3.put("id", 1))
-                                          .add(singletonMap("id", 2))
-                                          .add(singletonMap("id", 3));
+                                          .add(Map.of("id", 2))
+                                          .add(Map.of("id", 3));
                                     });
                       });
         });
diff --git a/solr/core/src/test/org/apache/solr/response/TestRetrieveFieldsOptimizer.java b/solr/core/src/test/org/apache/solr/response/TestRetrieveFieldsOptimizer.java
index 9f413673236..df8c8cb60c6 100644
--- a/solr/core/src/test/org/apache/solr/response/TestRetrieveFieldsOptimizer.java
+++ b/solr/core/src/test/org/apache/solr/response/TestRetrieveFieldsOptimizer.java
@@ -180,9 +180,9 @@ public class TestRetrieveFieldsOptimizer extends SolrTestCaseJ4 {
     String id = "str" + idx;
     sdoc.addField("str", id);
     sdoc.addField(idNotStoredDv, id);
-    fieldsExpectedVals.put(idNotStoredDv, Collections.singletonList(id));
+    fieldsExpectedVals.put(idNotStoredDv, List.of(id));
     sdoc.addField(idStoredNotDv, id);
-    fieldsExpectedVals.put(idStoredNotDv, Collections.singletonList(id));
+    fieldsExpectedVals.put(idStoredNotDv, List.of(id));
 
     for (RetrieveField field : fieldsHolder.fields.values()) {
       if (field.name.equals(idNotStoredDv) || field.name.equals(idStoredNotDv)) {
diff --git a/solr/core/src/test/org/apache/solr/response/transform/TestSubQueryTransformerDistrib.java b/solr/core/src/test/org/apache/solr/response/transform/TestSubQueryTransformerDistrib.java
index e2fd0110d4d..108196031f7 100644
--- a/solr/core/src/test/org/apache/solr/response/transform/TestSubQueryTransformerDistrib.java
+++ b/solr/core/src/test/org/apache/solr/response/transform/TestSubQueryTransformerDistrib.java
@@ -16,8 +16,6 @@
  */
 package org.apache.solr.response.transform;
 
-import static java.util.Collections.singletonList;
-import static java.util.Collections.singletonMap;
 import static org.apache.solr.security.Sha256AuthenticationProvider.getSaltedHashedValue;
 
 import java.io.ByteArrayOutputStream;
@@ -86,9 +84,9 @@ public class TestSubQueryTransformerDistrib extends SolrCloudTestCase {
                     "class",
                     RuleBasedAuthorizationPlugin.class.getName(),
                     "user-role",
-                    singletonMap(USER, "admin"),
+                    Map.of(USER, "admin"),
                     "permissions",
-                    singletonList(Map.of("name", "all", "role", "admin"))),
+                    List.of(Map.of("name", "all", "role", "admin"))),
                 "authentication",
                 Map.of(
                     "class",
@@ -96,7 +94,7 @@ public class TestSubQueryTransformerDistrib extends SolrCloudTestCase {
                     "blockUnknown",
                     true,
                     "credentials",
-                    singletonMap(USER, getSaltedHashedValue(PASS)),
+                    Map.of(USER, getSaltedHashedValue(PASS)),
                     "forwardCredentials", // forward basic auth credentials during internode
                     // requests instead of relying on PKI authentication; the test should pass
                     // regardless of the setting here, but "true" is the more interesting case that
diff --git a/solr/core/src/test/org/apache/solr/search/CurrencyRangeFacetCloudTest.java b/solr/core/src/test/org/apache/solr/search/CurrencyRangeFacetCloudTest.java
index fe24a7050ea..5df58d9e0f2 100644
--- a/solr/core/src/test/org/apache/solr/search/CurrencyRangeFacetCloudTest.java
+++ b/solr/core/src/test/org/apache/solr/search/CurrencyRangeFacetCloudTest.java
@@ -18,8 +18,8 @@ package org.apache.solr.search;
 
 import java.lang.invoke.MethodHandles;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import org.apache.lucene.tests.util.TestUtil;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
 import org.apache.solr.client.solrj.request.SolrQuery;
@@ -68,8 +68,7 @@ public class CurrencyRangeFacetCloudTest extends SolrCloudTestCase {
     assertEquals(
         0,
         (CollectionAdminRequest.createCollection(COLLECTION, CONF, numShards, numReplicas)
-                .setProperties(
-                    Collections.singletonMap(CoreAdminParams.CONFIG, "solrconfig-minimal.xml"))
+                .setProperties(Map.of(CoreAdminParams.CONFIG, "solrconfig-minimal.xml"))
                 .process(cluster.getSolrClient()))
             .getStatus());
 
diff --git a/solr/core/src/test/org/apache/solr/search/LargeFieldTest.java b/solr/core/src/test/org/apache/solr/search/LargeFieldTest.java
index 6d0a6a385be..ef3af492fdb 100644
--- a/solr/core/src/test/org/apache/solr/search/LargeFieldTest.java
+++ b/solr/core/src/test/org/apache/solr/search/LargeFieldTest.java
@@ -19,7 +19,7 @@ package org.apache.solr.search;
 
 import java.io.StringWriter;
 import java.util.Arrays;
-import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import org.apache.lucene.document.Document;
@@ -54,7 +54,7 @@ public class LargeFieldTest extends SolrTestCaseJ4 {
     IndexSchema schema = h.getCore().getLatestSchema();
     schema =
         schema.addFieldTypes(
-            Collections.singletonList(
+            List.of(
                 schema.newFieldType(
                     "textType",
                     "solr.TextField", // redundant; TODO improve api
diff --git a/solr/core/src/test/org/apache/solr/search/TestMaxScoreQueryParser.java b/solr/core/src/test/org/apache/solr/search/TestMaxScoreQueryParser.java
index 6612be6ae04..942601f81dd 100644
--- a/solr/core/src/test/org/apache/solr/search/TestMaxScoreQueryParser.java
+++ b/solr/core/src/test/org/apache/solr/search/TestMaxScoreQueryParser.java
@@ -21,7 +21,7 @@ import static org.hamcrest.Matchers.hasItem;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
+import java.util.Map;
 import java.util.stream.Collectors;
 import org.apache.lucene.index.Term;
 import org.apache.lucene.search.BooleanClause;
@@ -197,9 +197,7 @@ public class TestMaxScoreQueryParser extends SolrTestCaseJ4 {
       while (al.size() >= 2) {
         p.add(al.remove(0), al.remove(0));
       }
-      return new MaxScoreQParser(
-              q, p, new MapSolrParams(Collections.singletonMap("df", "text")), req(q))
-          .parse();
+      return new MaxScoreQParser(q, p, new MapSolrParams(Map.of("df", "text")), req(q)).parse();
     } catch (SyntaxError syntaxError) {
       fail("Failed with exception " + syntaxError.getMessage());
     }
diff --git a/solr/core/src/test/org/apache/solr/search/TestRandomCollapseQParserPlugin.java b/solr/core/src/test/org/apache/solr/search/TestRandomCollapseQParserPlugin.java
index 09f3b7008e9..ad4d7ac5b22 100644
--- a/solr/core/src/test/org/apache/solr/search/TestRandomCollapseQParserPlugin.java
+++ b/solr/core/src/test/org/apache/solr/search/TestRandomCollapseQParserPlugin.java
@@ -20,7 +20,6 @@ import static org.hamcrest.core.StringContains.containsString;
 
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 import org.apache.lucene.tests.util.TestUtil;
 import org.apache.solr.CursorPagingTest;
@@ -276,10 +275,9 @@ public class TestRandomCollapseQParserPlugin extends SolrTestCaseJ4 {
             + ", size="
             + collapseSize
             + "))";
-    List<String> expectedParsedFilterQuery = Collections.singletonList(expectedParsedFilterString);
+    List<String> expectedParsedFilterQuery = List.of(expectedParsedFilterString);
     assertEquals(expectedParsedFilterQuery, response.getDebugMap().get("parsed_filter_queries"));
-    assertEquals(
-        Collections.singletonList(filterQuery), response.getDebugMap().get("filter_queries"));
+    assertEquals(List.of(filterQuery), response.getDebugMap().get("filter_queries"));
   }
 
   public void testNullPolicy() {
diff --git a/solr/core/src/test/org/apache/solr/search/TestSolr4Spatial2.java b/solr/core/src/test/org/apache/solr/search/TestSolr4Spatial2.java
index 166d17e8e94..d5e23623bfa 100644
--- a/solr/core/src/test/org/apache/solr/search/TestSolr4Spatial2.java
+++ b/solr/core/src/test/org/apache/solr/search/TestSolr4Spatial2.java
@@ -339,7 +339,7 @@ public class TestSolr4Spatial2 extends SolrTestCaseJ4 {
 
     RetrievalCombo(String fieldName, String indexValue, String returnValue) {
       this.fieldName = fieldName;
-      this.indexValues = Collections.singletonList(indexValue);
+      this.indexValues = List.of(indexValue);
       this.expectReturnJSON = "'" + returnValue + "'";
     }
   }
diff --git a/solr/core/src/test/org/apache/solr/search/TestThinCache.java b/solr/core/src/test/org/apache/solr/search/TestThinCache.java
index e8828b57e81..fb39a019913 100644
--- a/solr/core/src/test/org/apache/solr/search/TestThinCache.java
+++ b/solr/core/src/test/org/apache/solr/search/TestThinCache.java
@@ -25,7 +25,6 @@ import io.prometheus.metrics.model.snapshots.Labels;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import org.apache.lucene.tests.util.TestUtil;
@@ -131,8 +130,7 @@ public class TestThinCache extends SolrTestCaseJ4 {
 
     NoOpRegenerator regenerator = new NoOpRegenerator();
     backing.init(params, null, null);
-    Object initObj =
-        lfuCache.init(Collections.singletonMap("autowarmCount", "25"), null, regenerator);
+    Object initObj = lfuCache.init(Map.of("autowarmCount", "25"), null, regenerator);
     lfuCache.setState(SolrCache.State.LIVE);
     for (int i = 0; i < 101; i++) {
       lfuCache.put(i + 1, Integer.toString(i + 1));
@@ -151,7 +149,7 @@ public class TestThinCache extends SolrTestCaseJ4 {
     assertNull(lfuCache.get(1)); // first item put in should be the first out
 
     // Test autowarming
-    newLFUCache.init(Collections.singletonMap("autowarmCount", "25"), initObj, regenerator);
+    newLFUCache.init(Map.of("autowarmCount", "25"), initObj, regenerator);
     newLFUCache.warm(null, lfuCache);
     newLFUCache.setState(SolrCache.State.LIVE);
 
diff --git a/solr/core/src/test/org/apache/solr/search/facet/RangeFacetCloudTest.java b/solr/core/src/test/org/apache/solr/search/facet/RangeFacetCloudTest.java
index 697a2f8b680..4bc7174eb3c 100644
--- a/solr/core/src/test/org/apache/solr/search/facet/RangeFacetCloudTest.java
+++ b/solr/core/src/test/org/apache/solr/search/facet/RangeFacetCloudTest.java
@@ -20,7 +20,6 @@ import java.lang.invoke.MethodHandles;
 import java.lang.reflect.Array;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.EnumSet;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -97,8 +96,7 @@ public class RangeFacetCloudTest extends SolrCloudTestCase {
     assertEquals(
         0,
         (CollectionAdminRequest.createCollection(COLLECTION, CONF, numShards, numReplicas)
-                .setProperties(
-                    Collections.singletonMap(CoreAdminParams.CONFIG, "solrconfig-minimal.xml"))
+                .setProperties(Map.of(CoreAdminParams.CONFIG, "solrconfig-minimal.xml"))
                 .process(cluster.getSolrClient()))
             .getStatus());
 
diff --git a/solr/core/src/test/org/apache/solr/search/facet/TestCloudJSONFacetSKGEquiv.java b/solr/core/src/test/org/apache/solr/search/facet/TestCloudJSONFacetSKGEquiv.java
index 087f2a2ec5c..deec286fd21 100644
--- a/solr/core/src/test/org/apache/solr/search/facet/TestCloudJSONFacetSKGEquiv.java
+++ b/solr/core/src/test/org/apache/solr/search/facet/TestCloudJSONFacetSKGEquiv.java
@@ -821,10 +821,7 @@ public class TestCloudJSONFacetSKGEquiv extends SolrCloudTestCase {
           // it ignores the order of the keys in each bucket...
           final String pathToMismatch =
               BaseDistributedSearchTestCase.compare(
-                  expected,
-                  actual,
-                  0,
-                  Collections.singletonMap("buckets", BaseDistributedSearchTestCase.UNORDERED));
+                  expected, actual, 0, Map.of("buckets", BaseDistributedSearchTestCase.UNORDERED));
           if (null != pathToMismatch) {
             log.error("{}: expected = {}", options, expected);
             log.error("{}: actual = {}", options, actual);
diff --git a/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java b/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java
index 41186cf4bef..ee6bd9b3543 100644
--- a/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java
+++ b/solr/core/src/test/org/apache/solr/search/facet/TestJsonFacets.java
@@ -27,6 +27,7 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Random;
+import java.util.Set;
 import java.util.concurrent.atomic.AtomicLong;
 import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.solr.JSONTestUtil;
@@ -112,7 +113,7 @@ public class TestJsonFacets extends SolrTestCaseHS {
   @ParametersFactory
   public static Iterable<Object[]> parameters() {
     if (null != TEST_ONLY_ONE_FACET_METHOD) {
-      return Collections.singleton(new Object[] {TEST_ONLY_ONE_FACET_METHOD});
+      return Set.<Object[]>of(new Object[] {TEST_ONLY_ONE_FACET_METHOD});
     } else if (TEST_NIGHTLY) {
       // wrap each enum val in an Object[] and return as Iterable
       return () ->
@@ -123,8 +124,7 @@ public class TestJsonFacets extends SolrTestCaseHS {
 
       // can't use LuceneTestCase.random() because we're not in the runner context yet
       String seed = System.getProperty("tests.seed", "");
-      return Collections.singleton(
-          new Object[] {methods[Math.abs(seed.hashCode()) % methods.length]});
+      return Set.<Object[]>of(new Object[] {methods[Math.abs(seed.hashCode()) % methods.length]});
     }
   }
 
@@ -1446,10 +1446,10 @@ public class TestJsonFacets extends SolrTestCaseHS {
 
   List<String> getAlternatives(String field) {
     int idx = field.lastIndexOf('_');
-    if (idx <= 0 || idx >= field.length()) return Collections.singletonList(field);
+    if (idx <= 0 || idx >= field.length()) return List.of(field);
     String suffix = field.substring(idx);
     String[] alternativeSuffixes = suffixMap.get(suffix);
-    if (alternativeSuffixes == null) return Collections.singletonList(field);
+    if (alternativeSuffixes == null) return List.of(field);
     String base = field.substring(0, idx);
     List<String> out = new ArrayList<>(alternativeSuffixes.length);
     for (String altS : alternativeSuffixes) {
diff --git a/solr/core/src/test/org/apache/solr/search/join/ShardToShardJoinAbstract.java b/solr/core/src/test/org/apache/solr/search/join/ShardToShardJoinAbstract.java
index 099d070bc61..682c19dbf3f 100644
--- a/solr/core/src/test/org/apache/solr/search/join/ShardToShardJoinAbstract.java
+++ b/solr/core/src/test/org/apache/solr/search/join/ShardToShardJoinAbstract.java
@@ -16,8 +16,6 @@
  */
 package org.apache.solr.search.join;
 
-import static java.util.Collections.singletonMap;
-
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.AbstractMap;
@@ -86,7 +84,7 @@ public abstract class ShardToShardJoinAbstract extends SolrCloudTestCase {
         new V2Request.Builder("/cluster/plugin")
             .forceV2(true)
             .POST()
-            .withPayload(singletonMap("add", plugin))
+            .withPayload(Map.of("add", plugin))
             .build();
     req.process(cluster.getSolrClient());
     // TODO await completion
diff --git a/solr/core/src/test/org/apache/solr/search/similarities/TestSweetSpotSimilarityFactory.java b/solr/core/src/test/org/apache/solr/search/similarities/TestSweetSpotSimilarityFactory.java
index d930cf37127..46eeb17d447 100644
--- a/solr/core/src/test/org/apache/solr/search/similarities/TestSweetSpotSimilarityFactory.java
+++ b/solr/core/src/test/org/apache/solr/search/similarities/TestSweetSpotSimilarityFactory.java
@@ -17,7 +17,7 @@
 package org.apache.solr.search.similarities;
 
 import java.io.IOException;
-import java.util.Collections;
+import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 import org.apache.lucene.document.Field.Store;
@@ -44,7 +44,7 @@ public class TestSweetSpotSimilarityFactory extends BaseSimilarityTestCase {
     String value = IntStream.range(0, length).mapToObj(i -> "a").collect(Collectors.joining(" "));
     Directory dir = newDirectory();
     IndexWriter w = new IndexWriter(dir, newIndexWriterConfig().setSimilarity(sim));
-    w.addDocument(Collections.singleton(newTextField("foo", value, Store.NO)));
+    w.addDocument(Set.of(newTextField("foo", value, Store.NO)));
     DirectoryReader reader = DirectoryReader.open(w);
     w.close();
     IndexSearcher searcher = new IndexSearcher(reader);
diff --git a/solr/core/src/test/org/apache/solr/security/AuditLoggerIntegrationTest.java b/solr/core/src/test/org/apache/solr/security/AuditLoggerIntegrationTest.java
index bf946962968..efe89a4a9b7 100644
--- a/solr/core/src/test/org/apache/solr/security/AuditLoggerIntegrationTest.java
+++ b/solr/core/src/test/org/apache/solr/security/AuditLoggerIntegrationTest.java
@@ -47,9 +47,9 @@ import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingDeque;
 import java.util.concurrent.Semaphore;
@@ -277,7 +277,7 @@ public class AuditLoggerIntegrationTest extends SolrCloudAuthTestCase {
                   .get()
                   .cluster
                   .getSolrClient()
-                  .query("test", new MapSolrParams(Collections.singletonMap("q", "a(bc")));
+                  .query("test", new MapSolrParams(Map.of("q", "a(bc")));
             });
     final List<AuditEvent> events = testHarness.get().receiver.waitForAuditEvents(3);
     assertAuditEvent(events.get(0), COMPLETED, "/admin/cores");
diff --git a/solr/core/src/test/org/apache/solr/security/AuditLoggerPluginTest.java b/solr/core/src/test/org/apache/solr/security/AuditLoggerPluginTest.java
index 3e2b3165cca..571b8a6f5fc 100644
--- a/solr/core/src/test/org/apache/solr/security/AuditLoggerPluginTest.java
+++ b/solr/core/src/test/org/apache/solr/security/AuditLoggerPluginTest.java
@@ -20,10 +20,10 @@ package org.apache.solr.security;
 import io.opentelemetry.api.common.Attributes;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.SolrException;
@@ -88,7 +88,7 @@ public class AuditLoggerPluginTest extends SolrTestCaseJ4 {
           .setHttpMethod("POST")
           .setMessage("Error occurred")
           .setDate(SAMPLE_DATE)
-          .setSolrParams(Collections.singletonMap("action", Collections.singletonList("DELETE")))
+          .setSolrParams(Map.of("action", List.of("DELETE")))
           .setResource("/admin/collections");
   protected static final AuditEvent EVENT_UPDATE =
       new AuditEvent(AuditEvent.EventType.COMPLETED)
@@ -97,7 +97,7 @@ public class AuditLoggerPluginTest extends SolrTestCaseJ4 {
           .setRequestType(AuditEvent.RequestType.UPDATE)
           .setMessage("Success")
           .setDate(SAMPLE_DATE)
-          .setCollections(Collections.singletonList("updatecoll"))
+          .setCollections(List.of("updatecoll"))
           .setRequestType(AuditEvent.RequestType.UPDATE)
           .setResource("/update");
   protected static final AuditEvent EVENT_STREAMING =
@@ -107,7 +107,7 @@ public class AuditLoggerPluginTest extends SolrTestCaseJ4 {
           .setRequestType(AuditEvent.RequestType.STREAMING)
           .setMessage("Success")
           .setDate(SAMPLE_DATE)
-          .setCollections(Collections.singletonList("streamcoll"))
+          .setCollections(List.of("streamcoll"))
           .setResource("/stream");
   protected static final AuditEvent EVENT_HEALTH_API =
       new AuditEvent(AuditEvent.EventType.COMPLETED)
@@ -152,7 +152,7 @@ public class AuditLoggerPluginTest extends SolrTestCaseJ4 {
   @Test
   public void init() {
     config = new HashMap<>();
-    config.put("eventTypes", Collections.singletonList("REJECTED"));
+    config.put("eventTypes", List.of("REJECTED"));
     config.put("async", false);
     plugin.init(config);
     assertTrue(plugin.shouldLog(EVENT_REJECTED.getEventType()));
@@ -174,7 +174,7 @@ public class AuditLoggerPluginTest extends SolrTestCaseJ4 {
 
   @Test(expected = SolrException.class)
   public void invalidMuteRule() {
-    config.put("muteRules", Collections.singletonList("foo:bar"));
+    config.put("muteRules", List.of("foo:bar"));
     plugin.init(config);
   }
 
diff --git a/solr/core/src/test/org/apache/solr/security/BaseTestRuleBasedAuthorizationPlugin.java b/solr/core/src/test/org/apache/solr/security/BaseTestRuleBasedAuthorizationPlugin.java
index 9cfa057b4df..374e3fc1e5d 100644
--- a/solr/core/src/test/org/apache/solr/security/BaseTestRuleBasedAuthorizationPlugin.java
+++ b/solr/core/src/test/org/apache/solr/security/BaseTestRuleBasedAuthorizationPlugin.java
@@ -16,8 +16,6 @@
  */
 package org.apache.solr.security;
 
-import static java.util.Collections.singletonList;
-import static java.util.Collections.singletonMap;
 import static org.apache.solr.common.util.CommandOperation.captureErrors;
 import static org.apache.solr.common.util.Utils.getObjectByPath;
 
@@ -36,6 +34,7 @@ import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.params.MapSolrParams;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.CommandOperation;
+import org.apache.solr.common.util.SuppressForbidden;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.handler.DumpRequestHandler;
 import org.apache.solr.handler.ReplicationHandler;
@@ -214,7 +213,7 @@ public class BaseTestRuleBasedAuthorizationPlugin extends SolrTestCaseJ4 {
             "handler",
             new CollectionsHandler(),
             "params",
-            new MapSolrParams(singletonMap("action", "LIST"))),
+            new MapSolrParams(Map.of("action", "LIST"))),
         STATUS_OK);
 
     checkRules(
@@ -228,7 +227,7 @@ public class BaseTestRuleBasedAuthorizationPlugin extends SolrTestCaseJ4 {
             "handler",
             new CollectionsHandler(),
             "params",
-            new MapSolrParams(singletonMap("action", "LIST"))),
+            new MapSolrParams(Map.of("action", "LIST"))),
         STATUS_OK);
 
     checkRules(
@@ -240,7 +239,7 @@ public class BaseTestRuleBasedAuthorizationPlugin extends SolrTestCaseJ4 {
             "handler",
             new CollectionsHandler(),
             "params",
-            new MapSolrParams(singletonMap("action", "CREATE"))),
+            new MapSolrParams(Map.of("action", "CREATE"))),
         PROMPT_FOR_CREDENTIALS);
 
     checkRules(
@@ -252,7 +251,7 @@ public class BaseTestRuleBasedAuthorizationPlugin extends SolrTestCaseJ4 {
             "handler",
             new CollectionsHandler(),
             "params",
-            new MapSolrParams(singletonMap("action", "RELOAD"))),
+            new MapSolrParams(Map.of("action", "RELOAD"))),
         PROMPT_FOR_CREDENTIALS);
 
     checkRules(
@@ -266,7 +265,7 @@ public class BaseTestRuleBasedAuthorizationPlugin extends SolrTestCaseJ4 {
             "handler",
             new CollectionsHandler(),
             "params",
-            new MapSolrParams(singletonMap("action", "CREATE"))),
+            new MapSolrParams(Map.of("action", "CREATE"))),
         FORBIDDEN);
 
     checkRules(
@@ -280,7 +279,7 @@ public class BaseTestRuleBasedAuthorizationPlugin extends SolrTestCaseJ4 {
             "handler",
             new CollectionsHandler(),
             "params",
-            new MapSolrParams(singletonMap("action", "CREATE"))),
+            new MapSolrParams(Map.of("action", "CREATE"))),
         STATUS_OK);
 
     checkRules(
@@ -292,7 +291,7 @@ public class BaseTestRuleBasedAuthorizationPlugin extends SolrTestCaseJ4 {
             "handler",
             new SearchHandler(),
             "collectionRequests",
-            singletonList(new CollectionRequest("mycoll")),
+            List.of(new CollectionRequest("mycoll")),
             "userPrincipal",
             "joe"),
         FORBIDDEN);
@@ -311,7 +310,7 @@ public class BaseTestRuleBasedAuthorizationPlugin extends SolrTestCaseJ4 {
             "handler",
             new ReplicationHandler(),
             "collectionRequests",
-            singletonList(new CollectionRequest("mycoll"))),
+            List.of(new CollectionRequest("mycoll"))),
         STATUS_OK); // Replication requires "READ" permission, which Tim has
 
     checkRules(
@@ -325,7 +324,7 @@ public class BaseTestRuleBasedAuthorizationPlugin extends SolrTestCaseJ4 {
             "handler",
             new ReplicationHandler(),
             "collectionRequests",
-            singletonList(new CollectionRequest("mycoll"))),
+            List.of(new CollectionRequest("mycoll"))),
         FORBIDDEN); // User cio has role 'su' which does not have 'read' permission
 
     checkRules(
@@ -339,7 +338,7 @@ public class BaseTestRuleBasedAuthorizationPlugin extends SolrTestCaseJ4 {
             "handler",
             new CollectionsHandler(),
             "params",
-            new MapSolrParams(singletonMap("action", "CREATE"))),
+            new MapSolrParams(Map.of("action", "CREATE"))),
         STATUS_OK);
   }
 
@@ -359,7 +358,7 @@ public class BaseTestRuleBasedAuthorizationPlugin extends SolrTestCaseJ4 {
             "handler",
             new CoreAdminHandler(null),
             "params",
-            new MapSolrParams(singletonMap("action", "CREATE"))),
+            new MapSolrParams(Map.of("action", "CREATE"))),
         PROMPT_FOR_CREDENTIALS);
 
     checkRules(
@@ -373,7 +372,7 @@ public class BaseTestRuleBasedAuthorizationPlugin extends SolrTestCaseJ4 {
             "handler",
             new CoreAdminHandler(null),
             "params",
-            new MapSolrParams(singletonMap("action", "CREATE"))),
+            new MapSolrParams(Map.of("action", "CREATE"))),
         FORBIDDEN);
 
     checkRules(
@@ -387,7 +386,7 @@ public class BaseTestRuleBasedAuthorizationPlugin extends SolrTestCaseJ4 {
             "handler",
             new CoreAdminHandler(null),
             "params",
-            new MapSolrParams(singletonMap("action", "STATUS"))),
+            new MapSolrParams(Map.of("action", "STATUS"))),
         STATUS_OK);
 
     checkRules(
@@ -401,7 +400,7 @@ public class BaseTestRuleBasedAuthorizationPlugin extends SolrTestCaseJ4 {
             "handler",
             new CoreAdminHandler(null),
             "params",
-            new MapSolrParams(singletonMap("action", "CREATE"))),
+            new MapSolrParams(Map.of("action", "CREATE"))),
         STATUS_OK);
   }
 
@@ -421,7 +420,7 @@ public class BaseTestRuleBasedAuthorizationPlugin extends SolrTestCaseJ4 {
             "handler",
             new DumpRequestHandler(),
             "params",
-            new MapSolrParams(singletonMap("key", "VAL1"))),
+            new MapSolrParams(Map.of("key", "VAL1"))),
         PROMPT_FOR_CREDENTIALS);
 
     checkRules(
@@ -435,7 +434,7 @@ public class BaseTestRuleBasedAuthorizationPlugin extends SolrTestCaseJ4 {
             "handler",
             new DumpRequestHandler(),
             "params",
-            new MapSolrParams(singletonMap("key", "Val1"))),
+            new MapSolrParams(Map.of("key", "Val1"))),
         PROMPT_FOR_CREDENTIALS);
 
     checkRules(
@@ -449,7 +448,7 @@ public class BaseTestRuleBasedAuthorizationPlugin extends SolrTestCaseJ4 {
             "handler",
             new DumpRequestHandler(),
             "params",
-            new MapSolrParams(singletonMap("key", "Val1"))),
+            new MapSolrParams(Map.of("key", "Val1"))),
         PROMPT_FOR_CREDENTIALS);
 
     checkRules(
@@ -465,7 +464,7 @@ public class BaseTestRuleBasedAuthorizationPlugin extends SolrTestCaseJ4 {
             "handler",
             new DumpRequestHandler(),
             "params",
-            new MapSolrParams(singletonMap("key", "Val1"))),
+            new MapSolrParams(Map.of("key", "Val1"))),
         FORBIDDEN);
 
     checkRules(
@@ -481,7 +480,7 @@ public class BaseTestRuleBasedAuthorizationPlugin extends SolrTestCaseJ4 {
             "handler",
             new DumpRequestHandler(),
             "params",
-            new MapSolrParams(singletonMap("key", "Val2"))),
+            new MapSolrParams(Map.of("key", "Val2"))),
         STATUS_OK);
 
     checkRules(
@@ -497,7 +496,7 @@ public class BaseTestRuleBasedAuthorizationPlugin extends SolrTestCaseJ4 {
             "handler",
             new DumpRequestHandler(),
             "params",
-            new MapSolrParams(singletonMap("key", "VAL2"))),
+            new MapSolrParams(Map.of("key", "VAL2"))),
         FORBIDDEN);
   }
 
@@ -524,7 +523,7 @@ public class BaseTestRuleBasedAuthorizationPlugin extends SolrTestCaseJ4 {
             "handler",
             new UpdateRequestHandler(),
             "params",
-            new MapSolrParams(singletonMap("key", "VAL2"))),
+            new MapSolrParams(Map.of("key", "VAL2"))),
         FORBIDDEN,
         customRules);
   }
@@ -554,7 +553,7 @@ public class BaseTestRuleBasedAuthorizationPlugin extends SolrTestCaseJ4 {
             "handler",
             handler,
             "params",
-            new MapSolrParams(singletonMap("key", "VAL2"))),
+            new MapSolrParams(Map.of("key", "VAL2"))),
         STATUS_OK);
 
     handler = new PropertiesRequestHandler();
@@ -601,7 +600,7 @@ public class BaseTestRuleBasedAuthorizationPlugin extends SolrTestCaseJ4 {
             "handler",
             new UpdateRequestHandler(),
             "params",
-            new MapSolrParams(singletonMap("key", "VAL2"))),
+            new MapSolrParams(Map.of("key", "VAL2"))),
         STATUS_OK);
 
     handler = new PropertiesRequestHandler();
@@ -648,7 +647,7 @@ public class BaseTestRuleBasedAuthorizationPlugin extends SolrTestCaseJ4 {
             "handler",
             new UpdateRequestHandler(),
             "params",
-            new MapSolrParams(singletonMap("key", "VAL2"))),
+            new MapSolrParams(Map.of("key", "VAL2"))),
         FORBIDDEN);
 
     handler = new PropertiesRequestHandler();
@@ -671,6 +670,7 @@ public class BaseTestRuleBasedAuthorizationPlugin extends SolrTestCaseJ4 {
   }
 
   @Test
+  @SuppressForbidden(reason = "singletonList(null) is intentional")
   public void testGetPermissionNamesForRoles() {
     // Tests the method that maps role(s) to permissions, used by SystemInfoHandler to provide UI
     // with logged-in user's permissions
@@ -689,8 +689,7 @@ public class BaseTestRuleBasedAuthorizationPlugin extends SolrTestCaseJ4 {
       assertEquals(
           Set.of("collection-admin-read"),
           plugin.getPermissionNamesForRoles(Collections.singletonList(null)));
-      assertEquals(
-          Set.of("freeforall"), plugin.getPermissionNamesForRoles(Collections.singletonList("*")));
+      assertEquals(Set.of("freeforall"), plugin.getPermissionNamesForRoles(List.of("*")));
     } catch (IOException e) {
       ; // swallow error, otherwise you have to add a _lot_ of exceptions to methods.
     }
@@ -870,7 +869,7 @@ public class BaseTestRuleBasedAuthorizationPlugin extends SolrTestCaseJ4 {
     public List<CollectionRequest> getCollectionRequests() {
       Object collectionRequests = values.get("collectionRequests");
       if (collectionRequests instanceof String) {
-        return singletonList(new CollectionRequest((String) collectionRequests));
+        return List.of(new CollectionRequest((String) collectionRequests));
       }
       return (List<CollectionRequest>) collectionRequests;
     }
diff --git a/solr/core/src/test/org/apache/solr/security/BasicAuthIntegrationTest.java b/solr/core/src/test/org/apache/solr/security/BasicAuthIntegrationTest.java
index 2ef080c6ef1..d08280c17bc 100644
--- a/solr/core/src/test/org/apache/solr/security/BasicAuthIntegrationTest.java
+++ b/solr/core/src/test/org/apache/solr/security/BasicAuthIntegrationTest.java
@@ -17,10 +17,8 @@
 package org.apache.solr.security;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.Collections.singletonMap;
 
 import java.io.IOException;
-import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Map;
@@ -63,13 +61,9 @@ import org.eclipse.jetty.client.StringRequestContent;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public class BasicAuthIntegrationTest extends SolrCloudAuthTestCase {
 
-  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-
   private static final String COLLECTION = "authCollection";
 
   @Before
@@ -191,7 +185,7 @@ public class BasicAuthIntegrationTest extends SolrCloudAuthTestCase {
         httpClient,
         baseUrl + authzPrefix,
         Utils.toJSONString(
-            singletonMap(
+            Map.of(
                 "set-permission", Map.of("collection", "x", "path", "/update/*", "role", "dev"))),
         "harry",
         "HarryIsUberCool");
@@ -204,8 +198,7 @@ public class BasicAuthIntegrationTest extends SolrCloudAuthTestCase {
         httpClient,
         baseUrl + authzPrefix,
         Utils.toJSONString(
-            singletonMap(
-                "set-permission", Map.of("name", "collection-admin-edit", "role", "admin"))),
+            Map.of("set-permission", Map.of("name", "collection-admin-edit", "role", "admin"))),
         "harry",
         "HarryIsUberCool");
     verifySecurityStatus(
@@ -298,7 +291,7 @@ public class BasicAuthIntegrationTest extends SolrCloudAuthTestCase {
       fail("Request should have failed because of missing auth");
     }
 
-    SolrParams params = new MapSolrParams(Collections.singletonMap("q", "*:*"));
+    SolrParams params = new MapSolrParams(Map.of("q", "*:*"));
     // Query that fails due to missing credentials
     exp =
         expectThrows(
@@ -372,7 +365,7 @@ public class BasicAuthIntegrationTest extends SolrCloudAuthTestCase {
         new V2Request.Builder("/cluster/plugin")
             .forceV2(true)
             .POST()
-            .withPayload(singletonMap("add", plugin))
+            .withPayload(Map.of("add", plugin))
             .build();
     v2Request.setBasicAuthCredentials("harry", "HarryIsUberCool");
     v2Request.process(cluster.getSolrClient());
diff --git a/solr/core/src/test/org/apache/solr/security/BasicAuthStandaloneTest.java b/solr/core/src/test/org/apache/solr/security/BasicAuthStandaloneTest.java
index 1f06eecd21a..63c83c13579 100644
--- a/solr/core/src/test/org/apache/solr/security/BasicAuthStandaloneTest.java
+++ b/solr/core/src/test/org/apache/solr/security/BasicAuthStandaloneTest.java
@@ -22,10 +22,9 @@ import static org.apache.solr.security.BasicAuthIntegrationTest.STD_CONF;
 import static org.apache.solr.security.BasicAuthIntegrationTest.verifySecurityStatus;
 
 import java.io.IOException;
-import java.lang.invoke.MethodHandles;
 import java.nio.file.Path;
 import java.util.Base64;
-import java.util.Collections;
+import java.util.Map;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.common.params.MapSolrParams;
@@ -38,13 +37,9 @@ import org.eclipse.jetty.client.StringRequestContent;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public class BasicAuthStandaloneTest extends SolrTestCaseJ4 {
 
-  private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-
   SecurityConfHandlerLocalForTesting securityConfHandler;
   SolrInstance instance = null;
   JettySolrRunner jetty;
@@ -124,7 +119,7 @@ public class BasicAuthStandaloneTest extends SolrTestCaseJ4 {
       command = "{\n" + "'set-permission': {'name': 'read', 'role':'solr'}\n" + "}";
       doHttpPost(httpClient, baseUrl + authzPrefix, command, "solr", "SolrRocks");
       try {
-        solrClient.query("collection1", new MapSolrParams(Collections.singletonMap("q", "foo")));
+        solrClient.query("collection1", new MapSolrParams(Map.of("q", "foo")));
         fail("Should return a 401 response");
       } catch (Exception e) {
         // Test that the second doPost request to /security/authorization went through
diff --git a/solr/core/src/test/org/apache/solr/security/PKIAuthenticationIntegrationTest.java b/solr/core/src/test/org/apache/solr/security/PKIAuthenticationIntegrationTest.java
index 5e82c858a22..402f1fa2920 100644
--- a/solr/core/src/test/org/apache/solr/security/PKIAuthenticationIntegrationTest.java
+++ b/solr/core/src/test/org/apache/solr/security/PKIAuthenticationIntegrationTest.java
@@ -16,8 +16,6 @@
  */
 package org.apache.solr.security;
 
-import static java.util.Collections.singletonMap;
-
 import jakarta.servlet.http.HttpServletRequest;
 import java.lang.invoke.MethodHandles;
 import java.security.Principal;
@@ -47,9 +45,9 @@ public class PKIAuthenticationIntegrationTest extends SolrCloudAuthTestCase {
         Utils.toJSONString(
             Map.of(
                 "authorization",
-                singletonMap("class", MockAuthorizationPlugin.class.getName()),
+                Map.of("class", MockAuthorizationPlugin.class.getName()),
                 "authentication",
-                singletonMap("class", MockAuthenticationPlugin.class.getName())));
+                Map.of("class", MockAuthenticationPlugin.class.getName())));
 
     configureCluster(2)
         .addConfig("conf", configset("cloud-minimal"))
diff --git a/solr/core/src/test/org/apache/solr/security/TestExternalRoleRuleBasedAuthorizationPlugin.java b/solr/core/src/test/org/apache/solr/security/TestExternalRoleRuleBasedAuthorizationPlugin.java
index cf0c0dc1e23..f3d2f5b815c 100644
--- a/solr/core/src/test/org/apache/solr/security/TestExternalRoleRuleBasedAuthorizationPlugin.java
+++ b/solr/core/src/test/org/apache/solr/security/TestExternalRoleRuleBasedAuthorizationPlugin.java
@@ -19,10 +19,10 @@ package org.apache.solr.security;
 
 import java.security.Principal;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * Tests {@link ExternalRoleRuleBasedAuthorizationPlugin} through simulating principals with roles
@@ -49,7 +49,7 @@ public class TestExternalRoleRuleBasedAuthorizationPlugin
 
   @Override
   protected void setUserRole(String user, String role) {
-    principals.put(user, new PrincipalWithUserRoles(user, Collections.singleton(role)));
+    principals.put(user, new PrincipalWithUserRoles(user, Set.of(role)));
   }
 
   @Override
diff --git a/solr/core/src/test/org/apache/solr/security/TestSha256AuthenticationProvider.java b/solr/core/src/test/org/apache/solr/security/TestSha256AuthenticationProvider.java
index 1646f2a772e..632fd16b35a 100644
--- a/solr/core/src/test/org/apache/solr/security/TestSha256AuthenticationProvider.java
+++ b/solr/core/src/test/org/apache/solr/security/TestSha256AuthenticationProvider.java
@@ -16,12 +16,10 @@
  */
 package org.apache.solr.security;
 
-import static java.util.Collections.singletonMap;
-
 import java.io.IOException;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.util.CommandOperation;
@@ -35,10 +33,10 @@ public class TestSha256AuthenticationProvider extends SolrTestCaseJ4 {
     String pwd = "Friendly";
     String user = "marcus";
     Map<String, Object> latestConf = createConfigMap(user, pwd);
-    Map<String, Object> params = singletonMap(user, pwd);
+    Map<String, Object> params = Map.of(user, pwd);
     Map<String, Object> result =
         zkAuthenticationProvider.edit(
-            latestConf, Collections.singletonList(new CommandOperation("set-user", params)));
+            latestConf, List.of(new CommandOperation("set-user", params)));
     zkAuthenticationProvider = new Sha256AuthenticationProvider();
     zkAuthenticationProvider.init(result);
 
@@ -54,13 +52,13 @@ public class TestSha256AuthenticationProvider extends SolrTestCaseJ4 {
       Map<String, Object> latestConf = createConfigMap("solr", "SolrRocks");
 
       CommandOperation blockUnknown =
-          new CommandOperation("set-property", singletonMap("blockUnknown", true));
-      basicAuthPlugin.edit(latestConf, Collections.singletonList(blockUnknown));
+          new CommandOperation("set-property", Map.of("blockUnknown", true));
+      basicAuthPlugin.edit(latestConf, List.of(blockUnknown));
       assertEquals(Boolean.TRUE, latestConf.get("blockUnknown"));
       basicAuthPlugin.init(latestConf);
       assertTrue(basicAuthPlugin.getBlockUnknown());
-      blockUnknown = new CommandOperation("set-property", singletonMap("blockUnknown", false));
-      basicAuthPlugin.edit(latestConf, Collections.singletonList(blockUnknown));
+      blockUnknown = new CommandOperation("set-property", Map.of("blockUnknown", false));
+      basicAuthPlugin.edit(latestConf, List.of(blockUnknown));
       assertEquals(Boolean.FALSE, latestConf.get("blockUnknown"));
       basicAuthPlugin.init(latestConf);
       assertFalse(basicAuthPlugin.getBlockUnknown());
diff --git a/solr/core/src/test/org/apache/solr/spelling/DirectSolrSpellCheckerTest.java b/solr/core/src/test/org/apache/solr/spelling/DirectSolrSpellCheckerTest.java
index e6fc2bd328e..9091f650184 100644
--- a/solr/core/src/test/org/apache/solr/spelling/DirectSolrSpellCheckerTest.java
+++ b/solr/core/src/test/org/apache/solr/spelling/DirectSolrSpellCheckerTest.java
@@ -17,7 +17,7 @@
 package org.apache.solr.spelling;
 
 import java.util.Collection;
-import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import org.apache.lucene.tests.util.LuceneTestCase.SuppressTempFileChecks;
 import org.apache.solr.SolrTestCaseJ4;
@@ -89,7 +89,7 @@ public class DirectSolrSpellCheckerTest extends SolrTestCaseJ4 {
               assertTrue("suggestions should be empty", suggestions.isEmpty());
 
               // Check empty token due to spellcheck.q = ""
-              spellOpts.tokens = Collections.singletonList(new Token("", 0, 0));
+              spellOpts.tokens = List.of(new Token("", 0, 0));
               result = checker.getSuggestions(spellOpts);
               assertNotNull("result shouldn't be null", result);
               suggestions = result.get(spellOpts.tokens.iterator().next());
diff --git a/solr/core/src/test/org/apache/solr/spelling/FileBasedSpellCheckerTest.java b/solr/core/src/test/org/apache/solr/spelling/FileBasedSpellCheckerTest.java
index 61e17dbfca8..5065e0c398a 100644
--- a/solr/core/src/test/org/apache/solr/spelling/FileBasedSpellCheckerTest.java
+++ b/solr/core/src/test/org/apache/solr/spelling/FileBasedSpellCheckerTest.java
@@ -19,7 +19,7 @@ package org.apache.solr.spelling;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Collection;
-import java.util.Collections;
+import java.util.List;
 import java.util.Map;
 import org.apache.lucene.tests.util.LuceneTestCase;
 import org.apache.lucene.tests.util.LuceneTestCase.SuppressTempFileChecks;
@@ -99,7 +99,7 @@ public class FileBasedSpellCheckerTest extends SolrTestCaseJ4 {
               assertTrue("suggestions should be empty", suggestions.isEmpty());
 
               // Check empty token due to spellcheck.q = ""
-              spellOpts.tokens = Collections.singletonList(new Token("", 0, 0));
+              spellOpts.tokens = List.of(new Token("", 0, 0));
               result = checker.getSuggestions(spellOpts);
               assertNotNull("result shouldn't be null", result);
               suggestions = result.get(spellOpts.tokens.iterator().next());
diff --git a/solr/core/src/test/org/apache/solr/spelling/IndexBasedSpellCheckerTest.java b/solr/core/src/test/org/apache/solr/spelling/IndexBasedSpellCheckerTest.java
index da25b002a7e..6ee537f814d 100644
--- a/solr/core/src/test/org/apache/solr/spelling/IndexBasedSpellCheckerTest.java
+++ b/solr/core/src/test/org/apache/solr/spelling/IndexBasedSpellCheckerTest.java
@@ -19,9 +19,9 @@ package org.apache.solr.spelling;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Comparator;
 import java.util.Date;
+import java.util.List;
 import java.util.Map;
 import org.apache.lucene.analysis.core.WhitespaceAnalyzer;
 import org.apache.lucene.document.Document;
@@ -197,7 +197,7 @@ public class IndexBasedSpellCheckerTest extends SolrTestCaseJ4 {
                   (int) entry.getValue());
 
               // Check empty token due to spellcheck.q = ""
-              spellOpts.tokens = Collections.singletonList(new Token("", 0, 0));
+              spellOpts.tokens = List.of(new Token("", 0, 0));
               result = checker.getSuggestions(spellOpts);
               assertNotNull(result);
               suggestions = result.get(spellOpts.tokens.iterator().next());
diff --git a/solr/core/src/test/org/apache/solr/uninverting/TestFieldCacheSort.java b/solr/core/src/test/org/apache/solr/uninverting/TestFieldCacheSort.java
index 31267a9be62..36b6598fd66 100644
--- a/solr/core/src/test/org/apache/solr/uninverting/TestFieldCacheSort.java
+++ b/solr/core/src/test/org/apache/solr/uninverting/TestFieldCacheSort.java
@@ -17,7 +17,6 @@
 package org.apache.solr.uninverting;
 
 import java.io.IOException;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import org.apache.lucene.document.Document;
@@ -80,8 +79,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(newStringField("value", "bar", Field.Store.YES));
     writer.addDocument(doc);
     Type type = sortType == SortField.Type.STRING ? Type.SORTED : Type.BINARY;
-    IndexReader ir =
-        UninvertingReader.wrap(writer.getReader(), Collections.singletonMap("value", type));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", type));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir);
@@ -119,8 +117,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(newStringField("value", "bar", Field.Store.YES));
     writer.addDocument(doc);
     Type type = sortType == SortField.Type.STRING ? Type.SORTED : Type.BINARY;
-    IndexReader ir =
-        UninvertingReader.wrap(writer.getReader(), Collections.singletonMap("value", type));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", type));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir);
@@ -156,8 +153,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(newStringField("value", "foo", Field.Store.YES));
     writer.addDocument(doc);
     Type type = sortType == SortField.Type.STRING ? Type.SORTED : Type.BINARY;
-    IndexReader ir =
-        UninvertingReader.wrap(writer.getReader(), Collections.singletonMap("value", type));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", type));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir);
@@ -194,8 +190,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(newStringField("value", "bar", Field.Store.YES));
     writer.addDocument(doc);
     Type type = sortType == SortField.Type.STRING ? Type.SORTED : Type.BINARY;
-    IndexReader ir =
-        UninvertingReader.wrap(writer.getReader(), Collections.singletonMap("value", type));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", type));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir);
@@ -234,8 +229,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(newStringField("value", "bar", Field.Store.YES));
     writer.addDocument(doc);
     Type type = sortType == SortField.Type.STRING ? Type.SORTED : Type.BINARY;
-    IndexReader ir =
-        UninvertingReader.wrap(writer.getReader(), Collections.singletonMap("value", type));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", type));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir);
@@ -274,8 +268,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(newStringField("value", "bar", Field.Store.YES));
     writer.addDocument(doc);
     Type type = sortType == SortField.Type.STRING ? Type.SORTED : Type.BINARY;
-    IndexReader ir =
-        UninvertingReader.wrap(writer.getReader(), Collections.singletonMap("value", type));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", type));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir);
@@ -315,8 +308,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(newStringField("value", "bar", Field.Store.YES));
     writer.addDocument(doc);
     Type type = sortType == SortField.Type.STRING ? Type.SORTED : Type.BINARY;
-    IndexReader ir =
-        UninvertingReader.wrap(writer.getReader(), Collections.singletonMap("value", type));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", type));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir);
@@ -465,8 +457,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(new StoredField("value", 4));
     writer.addDocument(doc);
     IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.INTEGER_POINT));
+        UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.INTEGER_POINT));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir, false);
@@ -498,8 +489,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(new StoredField("value", 4));
     writer.addDocument(doc);
     IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.INTEGER_POINT));
+        UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.INTEGER_POINT));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir, false);
@@ -533,8 +523,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(new StoredField("value", 4));
     writer.addDocument(doc);
     IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.INTEGER_POINT));
+        UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.INTEGER_POINT));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir, false);
@@ -570,8 +559,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(new StoredField("value", 4));
     writer.addDocument(doc);
     IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.INTEGER_POINT));
+        UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.INTEGER_POINT));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir, false);
@@ -602,8 +590,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(new LegacyIntField("value", 4, Field.Store.YES));
     writer.addDocument(doc);
     IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.LEGACY_INTEGER));
+        UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.LEGACY_INTEGER));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir);
@@ -633,8 +620,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(new LegacyIntField("value", 4, Field.Store.YES));
     writer.addDocument(doc);
     IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.LEGACY_INTEGER));
+        UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.LEGACY_INTEGER));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir);
@@ -667,8 +653,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(new LegacyIntField("value", 4, Field.Store.YES));
     writer.addDocument(doc);
     IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.LEGACY_INTEGER));
+        UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.LEGACY_INTEGER));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir);
@@ -701,8 +686,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(new LegacyIntField("value", 4, Field.Store.YES));
     writer.addDocument(doc);
     IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.LEGACY_INTEGER));
+        UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.LEGACY_INTEGER));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir);
@@ -735,9 +719,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(new LongPoint("value", 4));
     doc.add(new StoredField("value", 4));
     writer.addDocument(doc);
-    IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.LONG_POINT));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.LONG_POINT));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir, false);
@@ -768,9 +750,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(new LongPoint("value", 4));
     doc.add(new StoredField("value", 4));
     writer.addDocument(doc);
-    IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.LONG_POINT));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.LONG_POINT));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir, false);
@@ -803,9 +783,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(new LongPoint("value", 4));
     doc.add(new StoredField("value", 4));
     writer.addDocument(doc);
-    IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.LONG_POINT));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.LONG_POINT));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir, false);
@@ -840,9 +818,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(new LongPoint("value", 4));
     doc.add(new StoredField("value", 4));
     writer.addDocument(doc);
-    IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.LONG_POINT));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.LONG_POINT));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir, false);
@@ -872,9 +848,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc = new Document();
     doc.add(new LegacyLongField("value", 4, Field.Store.YES));
     writer.addDocument(doc);
-    IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.LEGACY_LONG));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.LEGACY_LONG));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir);
@@ -903,9 +877,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc = new Document();
     doc.add(new LegacyLongField("value", 4, Field.Store.YES));
     writer.addDocument(doc);
-    IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.LEGACY_LONG));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.LEGACY_LONG));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir);
@@ -937,9 +909,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc = new Document();
     doc.add(new LegacyLongField("value", 4, Field.Store.YES));
     writer.addDocument(doc);
-    IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.LEGACY_LONG));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.LEGACY_LONG));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir);
@@ -971,9 +941,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc = new Document();
     doc.add(new LegacyLongField("value", 4, Field.Store.YES));
     writer.addDocument(doc);
-    IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.LEGACY_LONG));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.LEGACY_LONG));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir);
@@ -1006,9 +974,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(new FloatPoint("value", 4.2f));
     doc.add(new StoredField("value", 4.2f));
     writer.addDocument(doc);
-    IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.FLOAT_POINT));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.FLOAT_POINT));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir, false);
@@ -1039,9 +1005,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(new FloatPoint("value", 4.2f));
     doc.add(new StoredField("value", 4.2f));
     writer.addDocument(doc);
-    IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.FLOAT_POINT));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.FLOAT_POINT));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir, false);
@@ -1074,9 +1038,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(new FloatPoint("value", 4.2f));
     doc.add(new StoredField("value", 4.2f));
     writer.addDocument(doc);
-    IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.FLOAT_POINT));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.FLOAT_POINT));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir, false);
@@ -1111,9 +1073,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(new FloatPoint("value", 4.2f));
     doc.add(new StoredField("value", 4.2f));
     writer.addDocument(doc);
-    IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.FLOAT_POINT));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.FLOAT_POINT));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir, false);
@@ -1143,9 +1103,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc = new Document();
     doc.add(new LegacyFloatField("value", 4.2f, Field.Store.YES));
     writer.addDocument(doc);
-    IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.LEGACY_FLOAT));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.LEGACY_FLOAT));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir);
@@ -1174,9 +1132,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc = new Document();
     doc.add(new LegacyFloatField("value", 4.2f, Field.Store.YES));
     writer.addDocument(doc);
-    IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.LEGACY_FLOAT));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.LEGACY_FLOAT));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir);
@@ -1208,9 +1164,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc = new Document();
     doc.add(new LegacyFloatField("value", 4.2f, Field.Store.YES));
     writer.addDocument(doc);
-    IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.LEGACY_FLOAT));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.LEGACY_FLOAT));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir);
@@ -1242,9 +1196,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc = new Document();
     doc.add(new LegacyFloatField("value", 4.2f, Field.Store.YES));
     writer.addDocument(doc);
-    IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.LEGACY_FLOAT));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.LEGACY_FLOAT));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir);
@@ -1281,9 +1233,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(new DoublePoint("value", 4.2333333333332));
     doc.add(new StoredField("value", 4.2333333333332));
     writer.addDocument(doc);
-    IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.DOUBLE_POINT));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.DOUBLE_POINT));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir, false);
@@ -1316,9 +1266,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(new StoredField("value", -0d));
     writer.addDocument(doc);
     doc = new Document();
-    IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.DOUBLE_POINT));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.DOUBLE_POINT));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir, false);
@@ -1369,9 +1317,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(new DoublePoint("value", 4.2333333333332));
     doc.add(new StoredField("value", 4.2333333333332));
     writer.addDocument(doc);
-    IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.DOUBLE_POINT));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.DOUBLE_POINT));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir, false);
@@ -1412,9 +1358,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(new DoublePoint("value", 4.2333333333332));
     doc.add(new StoredField("value", 4.2333333333332));
     writer.addDocument(doc);
-    IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.DOUBLE_POINT));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.DOUBLE_POINT));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir, false);
@@ -1456,9 +1400,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(new DoublePoint("value", 4.2333333333332));
     doc.add(new StoredField("value", 4.2333333333332));
     writer.addDocument(doc);
-    IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.DOUBLE_POINT));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.DOUBLE_POINT));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir, false);
@@ -1495,8 +1437,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(new LegacyDoubleField("value", 4.2333333333332, Field.Store.YES));
     writer.addDocument(doc);
     IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.LEGACY_DOUBLE));
+        UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.LEGACY_DOUBLE));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir);
@@ -1528,8 +1469,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     writer.addDocument(doc);
     doc = new Document();
     IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.LEGACY_DOUBLE));
+        UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.LEGACY_DOUBLE));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir);
@@ -1578,8 +1518,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(new LegacyDoubleField("value", 4.2333333333332, Field.Store.YES));
     writer.addDocument(doc);
     IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.LEGACY_DOUBLE));
+        UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.LEGACY_DOUBLE));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir);
@@ -1618,8 +1557,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(new LegacyDoubleField("value", 4.2333333333332, Field.Store.YES));
     writer.addDocument(doc);
     IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.LEGACY_DOUBLE));
+        UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.LEGACY_DOUBLE));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir);
@@ -1658,8 +1596,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(new LegacyDoubleField("value", 4.2333333333332, Field.Store.YES));
     writer.addDocument(doc);
     IndexReader ir =
-        UninvertingReader.wrap(
-            writer.getReader(), Collections.singletonMap("value", Type.LEGACY_DOUBLE));
+        UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.LEGACY_DOUBLE));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir);
@@ -1695,8 +1632,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     doc.add(newStringField("t", "1", Field.Store.NO));
     w.addDocument(doc);
 
-    IndexReader r =
-        UninvertingReader.wrap(DirectoryReader.open(w), Collections.singletonMap("f", Type.SORTED));
+    IndexReader r = UninvertingReader.wrap(DirectoryReader.open(w), Map.of("f", Type.SORTED));
     w.close();
     IndexSearcher s = newSearcher(r);
     TopDocs hits =
@@ -1731,8 +1667,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     writer.close();
     Sort sort = new Sort(new SortField("string", SortField.Type.STRING), SortField.FIELD_DOC);
     IndexReader reader =
-        UninvertingReader.wrap(
-            DirectoryReader.open(indexStore), Collections.singletonMap("string", Type.SORTED));
+        UninvertingReader.wrap(DirectoryReader.open(indexStore), Map.of("string", Type.SORTED));
     IndexSearcher searcher = new IndexSearcher(reader);
     expectThrows(
         IllegalStateException.class,
@@ -1765,8 +1700,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     }
 
     IndexReader r =
-        UninvertingReader.wrap(
-            DirectoryReader.open(w), Collections.singletonMap("id", Type.LEGACY_INTEGER));
+        UninvertingReader.wrap(DirectoryReader.open(w), Map.of("id", Type.LEGACY_INTEGER));
     w.close();
     Query q = new TermQuery(new Term("body", "text"));
     TestUtil.checkReader(r);
@@ -1815,8 +1749,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     Document doc = new Document();
     doc.add(newStringField("value", "foo", Field.Store.YES));
     writer.addDocument(doc);
-    IndexReader ir =
-        UninvertingReader.wrap(writer.getReader(), Collections.singletonMap("value", Type.SORTED));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.SORTED));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir);
@@ -1837,8 +1770,7 @@ public class TestFieldCacheSort extends SolrTestCase {
     Document doc = new Document();
     doc.add(newStringField("value", "foo", Field.Store.YES));
     writer.addDocument(doc);
-    IndexReader ir =
-        UninvertingReader.wrap(writer.getReader(), Collections.singletonMap("value", Type.SORTED));
+    IndexReader ir = UninvertingReader.wrap(writer.getReader(), Map.of("value", Type.SORTED));
     writer.close();
 
     IndexSearcher searcher = newSearcher(ir);
diff --git a/solr/core/src/test/org/apache/solr/uninverting/TestUninvertingReader.java b/solr/core/src/test/org/apache/solr/uninverting/TestUninvertingReader.java
index 1f45e10ff2a..9da8894ea37 100644
--- a/solr/core/src/test/org/apache/solr/uninverting/TestUninvertingReader.java
+++ b/solr/core/src/test/org/apache/solr/uninverting/TestUninvertingReader.java
@@ -17,7 +17,6 @@
 package org.apache.solr.uninverting;
 
 import java.io.IOException;
-import java.util.Collections;
 import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
@@ -78,8 +77,7 @@ public class TestUninvertingReader extends SolrTestCase {
     iw.close();
 
     DirectoryReader ir =
-        UninvertingReader.wrap(
-            DirectoryReader.open(dir), Collections.singletonMap("foo", Type.SORTED_SET_INTEGER));
+        UninvertingReader.wrap(DirectoryReader.open(dir), Map.of("foo", Type.SORTED_SET_INTEGER));
     LeafReader ar = ir.leaves().get(0).reader();
     SortedSetDocValues v = ar.getSortedSetDocValues("foo");
     assertEquals(2, v.getValueCount());
@@ -120,8 +118,7 @@ public class TestUninvertingReader extends SolrTestCase {
     iw.close();
 
     DirectoryReader ir =
-        UninvertingReader.wrap(
-            DirectoryReader.open(dir), Collections.singletonMap("foo", Type.SORTED_SET_FLOAT));
+        UninvertingReader.wrap(DirectoryReader.open(dir), Map.of("foo", Type.SORTED_SET_FLOAT));
     LeafReader ar = ir.leaves().get(0).reader();
 
     SortedSetDocValues v = ar.getSortedSetDocValues("foo");
@@ -163,8 +160,7 @@ public class TestUninvertingReader extends SolrTestCase {
     iw.close();
 
     DirectoryReader ir =
-        UninvertingReader.wrap(
-            DirectoryReader.open(dir), Collections.singletonMap("foo", Type.SORTED_SET_LONG));
+        UninvertingReader.wrap(DirectoryReader.open(dir), Map.of("foo", Type.SORTED_SET_LONG));
     LeafReader ar = ir.leaves().get(0).reader();
     SortedSetDocValues v = ar.getSortedSetDocValues("foo");
     assertEquals(2, v.getValueCount());
@@ -205,8 +201,7 @@ public class TestUninvertingReader extends SolrTestCase {
     iw.close();
 
     DirectoryReader ir =
-        UninvertingReader.wrap(
-            DirectoryReader.open(dir), Collections.singletonMap("foo", Type.SORTED_SET_DOUBLE));
+        UninvertingReader.wrap(DirectoryReader.open(dir), Map.of("foo", Type.SORTED_SET_DOUBLE));
     LeafReader ar = ir.leaves().get(0).reader();
     SortedSetDocValues v = ar.getSortedSetDocValues("foo");
     assertEquals(2, v.getValueCount());
diff --git a/solr/core/src/test/org/apache/solr/update/AddBlockUpdateTest.java b/solr/core/src/test/org/apache/solr/update/AddBlockUpdateTest.java
index 963796a1b27..2612ab71e92 100644
--- a/solr/core/src/test/org/apache/solr/update/AddBlockUpdateTest.java
+++ b/solr/core/src/test/org/apache/solr/update/AddBlockUpdateTest.java
@@ -32,6 +32,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Locale;
+import java.util.Set;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
@@ -615,7 +616,7 @@ public class AddBlockUpdateTest extends SolrTestCaseJ4 {
                         "child_s",
                         "b",
                         "grandChild",
-                        Collections.singleton(sdoc("id", "7", "child_s", "d"))),
+                        Set.of(sdoc("id", "7", "child_s", "d"))),
                     sdoc("id", "6", "child_s", "c")))
             .toString());
   }
diff --git a/solr/core/src/test/org/apache/solr/update/DeleteByIdWithRouterFieldTest.java b/solr/core/src/test/org/apache/solr/update/DeleteByIdWithRouterFieldTest.java
index cf5ead4b685..ff9ff482e53 100644
--- a/solr/core/src/test/org/apache/solr/update/DeleteByIdWithRouterFieldTest.java
+++ b/solr/core/src/test/org/apache/solr/update/DeleteByIdWithRouterFieldTest.java
@@ -18,7 +18,6 @@
 package org.apache.solr.update;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -304,9 +303,7 @@ public class DeleteByIdWithRouterFieldTest extends SolrCloudTestCase {
     final Map<String, List<String>> urlMap =
         docCol.getActiveSlices().stream()
             .collect(
-                Collectors.toMap(
-                    s -> s.getName(),
-                    s -> Collections.singletonList(fakeSolrUrlForShard(s.getName()))));
+                Collectors.toMap(s -> s.getName(), s -> List.of(fakeSolrUrlForShard(s.getName()))));
 
     // simplified rote info we'll build up with the shards for each delete (after sanity checking
     // they have routing info at all)...
diff --git a/solr/core/src/test/org/apache/solr/update/PeerSyncTest.java b/solr/core/src/test/org/apache/solr/update/PeerSyncTest.java
index 0b7a3f3c2a0..ebb46d43e81 100644
--- a/solr/core/src/test/org/apache/solr/update/PeerSyncTest.java
+++ b/solr/core/src/test/org/apache/solr/update/PeerSyncTest.java
@@ -22,7 +22,6 @@ import static org.hamcrest.core.StringContains.containsString;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
@@ -457,7 +456,7 @@ public class PeerSyncTest extends BaseDistributedSearchTestCase {
     // no other, solitary us
     for (boolean completeList : new boolean[] {false, true}) {
       List<Long> otherVersions = List.of();
-      List<Long> ourUpdates = Collections.singletonList(42L);
+      List<Long> ourUpdates = List.of(42L);
       assertEquals(1, ourUpdates.size());
       long ourLowThreshold = ourUpdates.get(0);
       MissedUpdatesRequest mur =
@@ -471,8 +470,8 @@ public class PeerSyncTest extends BaseDistributedSearchTestCase {
 
   private static void testHandleVersionsWithRangesSameOne() {
     for (boolean completeList : new boolean[] {false, true}) {
-      List<Long> otherVersions = Collections.singletonList(42L);
-      List<Long> ourUpdates = Collections.singletonList(42L);
+      List<Long> otherVersions = List.of(42L);
+      List<Long> ourUpdates = List.of(42L);
       assertEquals(1, ourUpdates.size());
       long ourLowThreshold = ourUpdates.get(0);
       MissedUpdatesRequest mur =
diff --git a/solr/core/src/test/org/apache/solr/update/SolrCmdDistributorTest.java b/solr/core/src/test/org/apache/solr/update/SolrCmdDistributorTest.java
index a237ac49c97..59f28f3409e 100644
--- a/solr/core/src/test/org/apache/solr/update/SolrCmdDistributorTest.java
+++ b/solr/core/src/test/org/apache/solr/update/SolrCmdDistributorTest.java
@@ -21,7 +21,6 @@ import java.io.IOException;
 import java.net.SocketException;
 import java.nio.file.Path;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -213,7 +212,7 @@ public class SolrCmdDistributorTest extends BaseDistributedSearchTestCase {
 
       params = new ModifiableSolrParams();
       params.set(DistributedUpdateProcessor.COMMIT_END_POINT, true);
-      cmdDistrib.distribAdd(cmd3, Collections.singletonList(nodes.get(1)), params);
+      cmdDistrib.distribAdd(cmd3, List.of(nodes.get(1)), params);
 
       params = new ModifiableSolrParams();
       params.set(DistributedUpdateProcessor.COMMIT_END_POINT, true);
diff --git a/solr/core/src/test/org/apache/solr/update/TestInPlaceUpdatesDistrib.java b/solr/core/src/test/org/apache/solr/update/TestInPlaceUpdatesDistrib.java
index 011bad9e556..084f94aa964 100644
--- a/solr/core/src/test/org/apache/solr/update/TestInPlaceUpdatesDistrib.java
+++ b/solr/core/src/test/org/apache/solr/update/TestInPlaceUpdatesDistrib.java
@@ -1223,7 +1223,7 @@ public class TestInPlaceUpdatesDistrib extends AbstractFullDistribZkTestBase {
     commit();
 
     float inplace_updatable_float = 1F;
-    buildRandomIndex(inplace_updatable_float, Collections.singletonList(1));
+    buildRandomIndex(inplace_updatable_float, List.of(1));
 
     float newinplace_updatable_float = 100F;
     List<UpdateRequest> updates = new ArrayList<>();
@@ -1631,7 +1631,7 @@ public class TestInPlaceUpdatesDistrib extends AbstractFullDistribZkTestBase {
     commit();
 
     float inplace_updatable_float = 1F;
-    buildRandomIndex(inplace_updatable_float, Collections.singletonList(1));
+    buildRandomIndex(inplace_updatable_float, List.of(1));
 
     List<UpdateRequest> updates = new ArrayList<>();
     updates.add(
diff --git a/solr/core/src/test/org/apache/solr/update/TestInPlaceUpdatesStandalone.java b/solr/core/src/test/org/apache/solr/update/TestInPlaceUpdatesStandalone.java
index 42d3d41c121..a589eafdf4c 100644
--- a/solr/core/src/test/org/apache/solr/update/TestInPlaceUpdatesStandalone.java
+++ b/solr/core/src/test/org/apache/solr/update/TestInPlaceUpdatesStandalone.java
@@ -167,7 +167,7 @@ public class TestInPlaceUpdatesStandalone extends SolrTestCaseJ4 {
                     "id",
                     "1",
                     "inplace_updatable_float",
-                    map("inc", new ArrayList<>(Collections.singletonList(123)))));
+                    map("inc", new ArrayList<>(List.of(123)))));
     assertEquals(SolrException.ErrorCode.BAD_REQUEST.code, e.code());
     assertThat(
         e.getMessage(), containsString("Invalid input '[123]' for field inplace_updatable_float"));
diff --git a/solr/core/src/test/org/apache/solr/update/processor/AddSchemaFieldsUpdateProcessorFactoryTest.java b/solr/core/src/test/org/apache/solr/update/processor/AddSchemaFieldsUpdateProcessorFactoryTest.java
index ef470d5e3fc..c556070e2bf 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/AddSchemaFieldsUpdateProcessorFactoryTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/AddSchemaFieldsUpdateProcessorFactoryTest.java
@@ -22,9 +22,9 @@ import java.time.Instant;
 import java.time.LocalDateTime;
 import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
-import java.util.Collections;
 import java.util.Date;
 import java.util.Locale;
+import java.util.Set;
 import org.apache.commons.io.file.PathUtils;
 import org.apache.lucene.tests.mockfile.FilterPath;
 import org.apache.solr.common.SolrInputDocument;
@@ -134,8 +134,7 @@ public class AddSchemaFieldsUpdateProcessorFactoryTest extends UpdateProcessorTe
     schema = h.getCore().getLatestSchema();
     assertNotNull(schema.getFieldOrNull(fieldName));
     assertEquals("text", schema.getFieldType(fieldName).getTypeName());
-    assertEquals(
-        0, schema.getCopyFieldProperties(true, Collections.singleton(fieldName), null).size());
+    assertEquals(0, schema.getCopyFieldProperties(true, Set.of(fieldName), null).size());
     assertU(commit());
     assertQ(
         req("id:4"),
@@ -159,8 +158,7 @@ public class AddSchemaFieldsUpdateProcessorFactoryTest extends UpdateProcessorTe
     schema = h.getCore().getLatestSchema();
     assertNotNull(schema.getFieldOrNull(fieldName));
     assertEquals("text", schema.getFieldType(fieldName).getTypeName());
-    assertEquals(
-        1, schema.getCopyFieldProperties(true, Collections.singleton(fieldName), null).size());
+    assertEquals(1, schema.getCopyFieldProperties(true, Set.of(fieldName), null).size());
     assertU(commit());
     assertQ(
         req("id:4"),
@@ -278,11 +276,7 @@ public class AddSchemaFieldsUpdateProcessorFactoryTest extends UpdateProcessorTe
     assertNotNull(schema.getFieldOrNull(strFieldName));
     assertEquals("text", schema.getFieldType(fieldName).getTypeName());
     assertEquals(
-        1,
-        schema
-            .getCopyFieldProperties(
-                true, Collections.singleton(fieldName), Collections.singleton(strFieldName))
-            .size());
+        1, schema.getCopyFieldProperties(true, Set.of(fieldName), Set.of(strFieldName)).size());
   }
 
   public void testStringWithCopyFieldAndMaxChars() throws Exception {
@@ -301,30 +295,26 @@ public class AddSchemaFieldsUpdateProcessorFactoryTest extends UpdateProcessorTe
     assertNotNull(schema.getFieldOrNull(strFieldName));
     assertEquals("text", schema.getFieldType(fieldName).getTypeName());
     // We have three copyFields, one with maxChars 10 and two with maxChars 20
-    assertEquals(
-        3, schema.getCopyFieldProperties(true, Collections.singleton(fieldName), null).size());
+    assertEquals(3, schema.getCopyFieldProperties(true, Set.of(fieldName), null).size());
     assertEquals(
         "The configured maxChars cutoff does not exist on the copyField",
         10,
         schema
-            .getCopyFieldProperties(
-                true, Collections.singleton(fieldName), Collections.singleton(strFieldName))
+            .getCopyFieldProperties(true, Set.of(fieldName), Set.of(strFieldName))
             .get(0)
             .get("maxChars"));
     assertEquals(
         "The configured maxChars cutoff does not exist on the copyField",
         20,
         schema
-            .getCopyFieldProperties(
-                true, Collections.singleton(fieldName), Collections.singleton(fieldName + "_t"))
+            .getCopyFieldProperties(true, Set.of(fieldName), Set.of(fieldName + "_t"))
             .get(0)
             .get("maxChars"));
     assertEquals(
         "The configured maxChars cutoff does not exist on the copyField",
         20,
         schema
-            .getCopyFieldProperties(
-                true, Collections.singleton(fieldName), Collections.singleton(fieldName + "2_t"))
+            .getCopyFieldProperties(true, Set.of(fieldName), Set.of(fieldName + "2_t"))
             .get(0)
             .get("maxChars"));
   }
diff --git a/solr/core/src/test/org/apache/solr/update/processor/NestedAtomicUpdateTest.java b/solr/core/src/test/org/apache/solr/update/processor/NestedAtomicUpdateTest.java
index 01852b9d8fd..ec4f00775c2 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/NestedAtomicUpdateTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/NestedAtomicUpdateTest.java
@@ -27,6 +27,7 @@ import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 import org.apache.lucene.util.BytesRef;
@@ -34,6 +35,7 @@ import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.SolrInputField;
+import org.apache.solr.common.util.SuppressForbidden;
 import org.apache.solr.core.SolrCore;
 import org.apache.solr.handler.component.RealTimeGetComponent;
 import org.apache.solr.util.RandomNoReverseMergePolicyFactory;
@@ -65,13 +67,7 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
   public void testMergeChildDoc() {
     SolrInputDocument newChildDoc = sdoc("id", "3", "cat_ss", "child");
     SolrInputDocument addedDoc =
-        sdoc(
-            "id",
-            "1",
-            "cat_ss",
-            Collections.singletonMap("add", "bbb"),
-            "child",
-            Collections.singletonMap("add", sdocs(newChildDoc)));
+        sdoc("id", "1", "cat_ss", Map.of("add", "bbb"), "child", Map.of("add", sdocs(newChildDoc)));
 
     SolrInputDocument dummyBlock =
         sdoc(
@@ -95,9 +91,7 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
     assertDocContainsSubset(preMergeDoc, dummyBlock);
     assertDocContainsSubset(addedDoc, dummyBlock);
     final List<SolrInputDocument> children =
-        dummyBlock.getFieldValues("child").stream()
-            .map(SolrInputDocument.class::cast)
-            .collect(Collectors.toList());
+        dummyBlock.getFieldValues("child").stream().map(SolrInputDocument.class::cast).toList();
     assertDocContainsSubset(newChildDoc, children.get(1));
     assertEquals(dummyBlock.getFieldValue("id"), dummyBlock.getFieldValue("id"));
   }
@@ -122,10 +116,9 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
             "id",
             "1",
             "cat_ss",
-            Collections.singletonMap("add", "bbb"), // add value to collection on parent
+            Map.of("add", "bbb"), // add value to collection on parent
             "child",
-            Collections.singletonMap(
-                "add", sdocs(updatedChildDoc))); // child with same id and updated "cat_ss" field
+            Map.of("add", sdocs(updatedChildDoc))); // child with same id and updated "cat_ss" field
 
     SolrInputDocument preMergeDoc = new SolrInputDocument(existingDoc);
     AtomicUpdateDocumentMerger docMerger = new AtomicUpdateDocumentMerger(req());
@@ -155,16 +148,15 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
             "child",
             new ArrayList<>(sdocs(existingChild)));
 
-    SolrInputDocument updatedChildDoc =
-        sdoc("id", "2", "cat_ss", Collections.singletonMap("set", "updated child"));
+    SolrInputDocument updatedChildDoc = sdoc("id", "2", "cat_ss", Map.of("set", "updated child"));
     SolrInputDocument updateDoc =
         sdoc(
             "id",
             "1",
             "cat_ss",
-            Collections.singletonMap("add", "bbb"), // add value to collection on parent
+            Map.of("add", "bbb"), // add value to collection on parent
             "child",
-            Collections.singletonMap(
+            Map.of(
                 "add",
                 sdocs(updatedChildDoc))); // child with same id and nested set on "cat_ss" field
 
@@ -204,10 +196,9 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
             "id",
             "1",
             "cat_ss",
-            Collections.singletonMap("add", "bbb"), // add value to collection on parent
+            Map.of("add", "bbb"), // add value to collection on parent
             "child",
-            Collections.singletonMap(
-                "add", sdocs(updatedChildDoc))); // child with same id and updated "cat_ss" field
+            Map.of("add", sdocs(updatedChildDoc))); // child with same id and updated "cat_ss" field
 
     SolrInputDocument preMergeDoc = new SolrInputDocument(existingDoc);
     AtomicUpdateDocumentMerger docMerger = new AtomicUpdateDocumentMerger(req());
@@ -242,8 +233,7 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
             "id",
             "1",
             "child_ss",
-            Collections.singletonMap(
-                "add", sdoc("id", "3", "cat_ss", Map.of("set", "child2")))); // an atomic update
+            Map.of("add", sdoc("id", "3", "cat_ss", Map.of("set", "child2")))); // an atomic update
 
     AtomicUpdateDocumentMerger docMerger = new AtomicUpdateDocumentMerger(req());
 
@@ -274,7 +264,7 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
                     sdoc(
                         "id", String.valueOf(x), "string_s", "child", "inplace_updatable_int", "0"))
             .collect(Collectors.toList());
-    doc = sdoc("id", "1", "_root_", "1", "children", Collections.singletonMap("add", docs));
+    doc = sdoc("id", "1", "_root_", "1", "children", Map.of("add", docs));
     addAndGetVersion(doc, null);
 
     assertU(commit());
@@ -288,26 +278,14 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
 
     for (int i = 10; i < 20; ++i) {
       doc =
-          sdoc(
-              "id",
-              String.valueOf(i),
-              "_root_",
-              "1",
-              "inplace_updatable_int",
-              Collections.singletonMap("inc", "1"));
+          sdoc("id", String.valueOf(i), "_root_", "1", "inplace_updatable_int", Map.of("inc", "1"));
       addAndGetVersion(doc, null);
       assertU(commit());
     }
 
     for (int i = 10; i < 20; ++i) {
       doc =
-          sdoc(
-              "id",
-              String.valueOf(i),
-              "_root_",
-              "1",
-              "inplace_updatable_int",
-              Collections.singletonMap("inc", "1"));
+          sdoc("id", String.valueOf(i), "_root_", "1", "inplace_updatable_int", Map.of("inc", "1"));
       addAndGetVersion(doc, null);
       assertU(commit());
     }
@@ -317,28 +295,15 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
       docs =
           IntStream.range(i * 10, (i * 10) + 5)
               .mapToObj(x -> sdoc("id", String.valueOf(x), "string_s", "grandChild"))
-              .collect(Collectors.toList());
-      doc =
-          sdoc(
-              "id",
-              String.valueOf(i),
-              "_root_",
-              "1",
-              "grandChildren",
-              Collections.singletonMap("add", docs));
+              .toList();
+      doc = sdoc("id", String.valueOf(i), "_root_", "1", "grandChildren", Map.of("add", docs));
       addAndGetVersion(doc, null);
       assertU(commit());
     }
 
     for (int i = 10; i < 20; ++i) {
       doc =
-          sdoc(
-              "id",
-              String.valueOf(i),
-              "_root_",
-              "1",
-              "inplace_updatable_int",
-              Collections.singletonMap("inc", "1"));
+          sdoc("id", String.valueOf(i), "_root_", "1", "inplace_updatable_int", Map.of("inc", "1"));
       addAndGetVersion(doc, null);
       assertU(commit());
     }
@@ -375,7 +340,7 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
         IntStream.range(10, 20)
             .mapToObj(x -> sdoc("id", String.valueOf(x), "string_s", "child"))
             .collect(Collectors.toList());
-    doc = sdoc("id", "1", "children", Collections.singletonMap("add", docs));
+    doc = sdoc("id", "1", "children", Map.of("add", docs));
     addAndGetVersion(doc, null);
 
     assertU(commit());
@@ -392,15 +357,8 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
       docs =
           IntStream.range(i * 10, (i * 10) + 5)
               .mapToObj(x -> sdoc("id", String.valueOf(x), "string_s", "grandChild"))
-              .collect(Collectors.toList());
-      doc =
-          sdoc(
-              "id",
-              String.valueOf(i),
-              "_root_",
-              "1",
-              "grandChildren",
-              Collections.singletonMap("add", docs));
+              .toList();
+      doc = sdoc("id", String.valueOf(i), "_root_", "1", "grandChildren", Map.of("add", docs));
       addAndGetVersion(doc, null);
       assertU(commit());
     }
@@ -429,12 +387,7 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
         "/response/docs/[0]/child1/[0]/id=='2'",
         "/response/docs/[0]/child1/[0]/child_s=='child'");
 
-    doc =
-        sdoc(
-            "id",
-            "1",
-            "child1",
-            Collections.singletonMap("add", sdocs(sdoc("id", "3", "child_s", "child"))));
+    doc = sdoc("id", "1", "child1", Map.of("add", sdocs(sdoc("id", "3", "child_s", "child"))));
     addAndGetVersion(doc, null);
 
     assertU(commit());
@@ -454,7 +407,7 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
             "_root_",
             "1",
             "grandChild",
-            Collections.singletonMap(
+            Map.of(
                 "add",
                 sdocs(
                     sdoc("id", "4", "child_s", "grandChild"),
@@ -474,12 +427,7 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
         "/response/docs/[0]/child1/[0]/grandChild/[0]/id=='4'",
         "/response/docs/[0]/child1/[0]/grandChild/[0]/child_s=='grandChild'");
 
-    doc =
-        sdoc(
-            "id",
-            "1",
-            "child2",
-            Collections.singletonMap("add", sdocs(sdoc("id", "8", "child_s", "child"))));
+    doc = sdoc("id", "1", "child2", Map.of("add", sdocs(sdoc("id", "8", "child_s", "child"))));
     addAndGetVersion(doc, null);
 
     assertU(commit());
@@ -497,7 +445,7 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
         "/response/docs/[0]/child2/[0]/id=='8'",
         "/response/docs/[0]/child2/[0]/child_s=='child'");
 
-    doc = sdoc("id", "1", "new_s", Collections.singletonMap("add", "new string"));
+    doc = sdoc("id", "1", "new_s", Map.of("add", "new string"));
     addAndGetVersion(doc, null);
 
     assertU(commit());
@@ -554,9 +502,9 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
             "id",
             "1",
             "cat_ss",
-            Collections.singletonMap("add", "bbb"),
+            Map.of("add", "bbb"),
             "child2",
-            Collections.singletonMap("add", sdoc("id", "3", "cat_ss", "child")));
+            Map.of("add", sdoc("id", "3", "cat_ss", "child")));
     addAndGetVersion(doc, null);
 
     assertJQ(
@@ -586,7 +534,7 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
             "_root_",
             "1",
             "child3",
-            Collections.singletonMap("add", sdoc("id", "4", "cat_ss", "grandChild")));
+            Map.of("add", sdoc("id", "4", "cat_ss", "grandChild")));
     addAndGetVersion(doc, null);
 
     assertJQ(
@@ -611,7 +559,7 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
             "_root_",
             "1",
             "child4",
-            Collections.singletonMap("add", sdoc("id", "5", "cat_ss", "greatGrandChild")));
+            Map.of("add", sdoc("id", "5", "cat_ss", "greatGrandChild")));
     addAndGetVersion(doc, null);
 
     assertJQ(
@@ -636,7 +584,7 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
             "_root_",
             "1",
             "child4",
-            Collections.singletonMap("add", sdoc("id", "6", "cat_ss", "greatGrandChild")));
+            Map.of("add", sdoc("id", "6", "cat_ss", "greatGrandChild")));
     addAndGetVersion(doc, null);
 
     assertU(commit());
@@ -653,14 +601,14 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
             "id",
             "1",
             "child5",
-            Collections.singletonMap(
+            Map.of(
                 "add",
                 sdocs(sdoc("id", "7", "cat_ss", "child"), sdoc("id", "8", "cat_ss", "child"))));
     addAndGetVersion(doc, null);
 
     assertU(commit());
 
-    doc = sdoc("id", "1", "new_s", Collections.singletonMap("add", "new string"));
+    doc = sdoc("id", "1", "new_s", Map.of("add", "new string"));
     addAndGetVersion(doc, null);
 
     assertU(commit());
@@ -694,13 +642,7 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
   public void testBlockAtomicSet() throws Exception {
     SolrInputDocument sdoc2 = sdoc("id", "2", "cat_ss", "child");
     SolrInputDocument doc =
-        sdoc(
-            "id",
-            "1",
-            "cat_ss",
-            new String[] {"aaa", "ccc"},
-            "child1",
-            Collections.singleton(sdoc2));
+        sdoc("id", "1", "cat_ss", new String[] {"aaa", "ccc"}, "child1", Set.of(sdoc2));
     assertU(adoc(doc));
 
     BytesRef rootDocId = new BytesRef("1");
@@ -746,9 +688,9 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
             "_root_",
             "1",
             "cat_ss",
-            Collections.singletonMap("set", Arrays.asList("aaa", "bbb")),
+            Map.of("set", Arrays.asList("aaa", "bbb")),
             "child1",
-            Collections.singletonMap("set", sdoc("id", "3", "cat_ss", "child")));
+            Map.of("set", sdoc("id", "3", "cat_ss", "child")));
     addAndGetVersion(doc, null);
 
     assertJQ(
@@ -769,13 +711,7 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
             + "       }}");
 
     doc =
-        sdoc(
-            "id",
-            "3",
-            "_root_",
-            "1",
-            "child2",
-            Collections.singletonMap("set", sdoc("id", "4", "cat_ss", "child")));
+        sdoc("id", "3", "_root_", "1", "child2", Map.of("set", sdoc("id", "4", "cat_ss", "child")));
     addAndGetVersion(doc, null);
 
     assertJQ(
@@ -821,12 +757,7 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
         "/response/docs/[0]/cat_ss/[0]==\"aaa\"",
         "/response/docs/[0]/cat_ss/[1]==\"bbb\"");
 
-    doc =
-        sdoc(
-            "id",
-            "1",
-            "child1",
-            Collections.singletonMap("add", sdoc("id", "2", "cat_ss", "child")));
+    doc = sdoc("id", "1", "child1", Map.of("add", sdoc("id", "2", "cat_ss", "child")));
     addAndGetVersion(doc, null);
 
     // commit the changes
@@ -893,12 +824,7 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
             + ", cat_ss:[\"aaa\",\"ccc\"], child1:[{\"id\":\"2\",\"cat_ss\":[\"child\"]}, {\"id\":\"3\",\"cat_ss\":[\"child\"]}]"
             + "       }}");
 
-    doc =
-        sdoc(
-            "id",
-            "1",
-            "child1",
-            Collections.singletonMap("remove", sdoc("id", "3", "cat_ss", "child")));
+    doc = sdoc("id", "1", "child1", Map.of("remove", sdoc("id", "3", "cat_ss", "child")));
     addAndGetVersion(doc, null);
 
     assertJQ(
@@ -939,6 +865,7 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
     testBlockAtomicSetToNullOrEmpty(true);
   }
 
+  @SuppressForbidden(reason = "singletonMap with null value is intentional")
   private void testBlockAtomicSetToNullOrEmpty(boolean empty) throws Exception {
     // latlon field is included to ensure reading from LatLonDocValuesField is working due to atomic
     // update. See SOLR-13966 for further details.
@@ -1027,9 +954,7 @@ public class NestedAtomicUpdateTest extends SolrTestCaseJ4 {
         expectThrows(
             SolrException.class,
             () -> {
-              addAndGetVersion(
-                  sdoc("id", "2", "grandchild", Collections.singletonMap("set", sdoc("id", "3"))),
-                  null);
+              addAndGetVersion(sdoc("id", "2", "grandchild", Map.of("set", sdoc("id", "3"))), null);
             });
     assertTrue(
         e.toString(),
diff --git a/solr/core/src/test/org/apache/solr/update/processor/SignatureUpdateProcessorFactoryTest.java b/solr/core/src/test/org/apache/solr/update/processor/SignatureUpdateProcessorFactoryTest.java
index a492d60be4e..05487931e06 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/SignatureUpdateProcessorFactoryTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/SignatureUpdateProcessorFactoryTest.java
@@ -17,8 +17,8 @@
 package org.apache.solr.update.processor;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import org.apache.lucene.util.Constants;
 import org.apache.solr.SolrTestCaseJ4;
@@ -294,8 +294,7 @@ public class SignatureUpdateProcessorFactoryTest extends SolrTestCaseJ4 {
 
     SolrQueryRequestBase req = new SolrQueryRequestBase(h.getCore(), mmparams);
     try {
-      req.setContentStreams(
-          Collections.singletonList(ContentStreamBase.create(new JavaBinRequestWriter(), ureq)));
+      req.setContentStreams(List.of(ContentStreamBase.create(new JavaBinRequestWriter(), ureq)));
       UpdateRequestHandler h = new UpdateRequestHandler();
       h.init(new NamedList<>());
       h.handleRequestBody(req, new SolrQueryResponse());
diff --git a/solr/core/src/test/org/apache/solr/update/processor/TimeRoutedAliasUpdateProcessorTest.java b/solr/core/src/test/org/apache/solr/update/processor/TimeRoutedAliasUpdateProcessorTest.java
index d9028e99578..b0d0097b6d3 100644
--- a/solr/core/src/test/org/apache/solr/update/processor/TimeRoutedAliasUpdateProcessorTest.java
+++ b/solr/core/src/test/org/apache/solr/update/processor/TimeRoutedAliasUpdateProcessorTest.java
@@ -488,7 +488,7 @@ public class TimeRoutedAliasUpdateProcessorTest extends RoutedAliasUpdateProcess
     assertUpdateResponse(
         add(
             alias,
-            Collections.singletonList(
+            List.of(
                 sdoc(
                     "id",
                     "8",
@@ -579,8 +579,7 @@ public class TimeRoutedAliasUpdateProcessorTest extends RoutedAliasUpdateProcess
     assertUpdateResponse(
         add(
             alias,
-            Collections.singletonList(
-                sdoc("id", "13", "timestamp_dt", "2017-10-30T23:03:00Z")), // lucky?
+            List.of(sdoc("id", "13", "timestamp_dt", "2017-10-30T23:03:00Z")), // lucky?
             params));
     assertUpdateResponse(solrClient.commit(alias));
     waitColAndAlias(alias, TRA, "2017-10-30", numShards);
@@ -619,7 +618,7 @@ public class TimeRoutedAliasUpdateProcessorTest extends RoutedAliasUpdateProcess
     assertUpdateResponse(
         add(
             alias,
-            Collections.singletonList(
+            List.of(
                 sdoc(
                     "id",
                     "14",
@@ -631,7 +630,7 @@ public class TimeRoutedAliasUpdateProcessorTest extends RoutedAliasUpdateProcess
     assertUpdateResponse(
         add(
             alias,
-            Collections.singletonList(
+            List.of(
                 sdoc(
                     "id",
                     "15",
@@ -643,7 +642,7 @@ public class TimeRoutedAliasUpdateProcessorTest extends RoutedAliasUpdateProcess
     assertUpdateResponse(
         add(
             alias,
-            Collections.singletonList(
+            List.of(
                 sdoc(
                     "id",
                     "16",
@@ -655,7 +654,7 @@ public class TimeRoutedAliasUpdateProcessorTest extends RoutedAliasUpdateProcess
     assertUpdateResponse(
         add(
             alias,
-            Collections.singletonList(
+            List.of(
                 sdoc(
                     "id",
                     "17",
@@ -670,7 +669,7 @@ public class TimeRoutedAliasUpdateProcessorTest extends RoutedAliasUpdateProcess
     assertUpdateResponse(
         add(
             alias,
-            Collections.singletonList(
+            List.of(
                 sdoc(
                     "id",
                     "18",
@@ -724,7 +723,7 @@ public class TimeRoutedAliasUpdateProcessorTest extends RoutedAliasUpdateProcess
     assertUpdateResponse(
         add(
             alias,
-            Collections.singletonList(
+            List.of(
                 sdoc(
                     "id",
                     "6",
diff --git a/solr/core/src/test/org/apache/solr/util/SolrPluginUtilsTest.java b/solr/core/src/test/org/apache/solr/util/SolrPluginUtilsTest.java
index 97b80a7cd45..819585acc22 100644
--- a/solr/core/src/test/org/apache/solr/util/SolrPluginUtilsTest.java
+++ b/solr/core/src/test/org/apache/solr/util/SolrPluginUtilsTest.java
@@ -18,11 +18,11 @@ package org.apache.solr.util;
 
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import org.apache.lucene.index.Term;
 import org.apache.lucene.search.BooleanClause;
 import org.apache.lucene.search.BooleanClause.Occur;
@@ -377,9 +377,7 @@ public class SolrPluginUtilsTest extends SolrTestCaseJ4 {
 
     /* Simulate stopwords through uneven disjuncts */
     q = new BooleanQuery.Builder();
-    q.add(
-        new DisjunctionMaxQuery(Collections.singleton(new TermQuery(new Term("a", "foo"))), 0.0f),
-        Occur.SHOULD);
+    q.add(new DisjunctionMaxQuery(Set.of(new TermQuery(new Term("a", "foo"))), 0.0f), Occur.SHOULD);
     DisjunctionMaxQuery dmq =
         new DisjunctionMaxQuery(
             Arrays.asList(new TermQuery(new Term("a", "foo")), new TermQuery(new Term("b", "foo"))),
diff --git a/solr/core/src/test/org/apache/solr/util/TestUtils.java b/solr/core/src/test/org/apache/solr/util/TestUtils.java
index 3e18f8e766c..1228ff0c8bd 100644
--- a/solr/core/src/test/org/apache/solr/util/TestUtils.java
+++ b/solr/core/src/test/org/apache/solr/util/TestUtils.java
@@ -27,11 +27,11 @@ import static org.apache.solr.common.util.Utils.fromJSONString;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.StringReader;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.common.MapWriter;
 import org.apache.solr.common.util.CommandOperation;
@@ -138,8 +138,7 @@ public class TestUtils extends SolrTestCaseJ4 {
     ContentStream stream =
         new ContentStreamBase.ByteArrayStream(baos.toByteArray(), null, "application/javabin");
     List<CommandOperation> commands =
-        CommandOperation.readCommands(
-            Collections.singletonList(stream), new NamedList<>(), Collections.singleton("single"));
+        CommandOperation.readCommands(List.of(stream), new NamedList<>(), Set.of("single"));
 
     assertEquals(5, commands.size());
   }
diff --git a/solr/cross-dc-manager/src/java/org/apache/solr/crossdc/manager/consumer/KafkaCrossDcConsumer.java b/solr/cross-dc-manager/src/java/org/apache/solr/crossdc/manager/consumer/KafkaCrossDcConsumer.java
index 5e1af44d35c..c3b5bdb3a70 100644
--- a/solr/cross-dc-manager/src/java/org/apache/solr/crossdc/manager/consumer/KafkaCrossDcConsumer.java
+++ b/solr/cross-dc-manager/src/java/org/apache/solr/crossdc/manager/consumer/KafkaCrossDcConsumer.java
@@ -20,7 +20,6 @@ import java.lang.invoke.MethodHandles;
 import java.time.Duration;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
 import java.util.Properties;
@@ -126,9 +125,7 @@ public class KafkaCrossDcConsumer extends Consumer.CrossDcConsumer {
 
     protected CloudSolrClient createSolrClient() {
       log.debug("Creating new SolrClient...");
-      return new CloudSolrClient.Builder(
-              Collections.singletonList(zkConnectString), Optional.empty())
-          .build();
+      return new CloudSolrClient.Builder(List.of(zkConnectString), Optional.empty()).build();
     }
 
     @Override
diff --git a/solr/cross-dc-manager/src/java/org/apache/solr/crossdc/manager/consumer/PartitionManager.java b/solr/cross-dc-manager/src/java/org/apache/solr/crossdc/manager/consumer/PartitionManager.java
index 1d16b6cca58..c1004528ab6 100644
--- a/solr/cross-dc-manager/src/java/org/apache/solr/crossdc/manager/consumer/PartitionManager.java
+++ b/solr/cross-dc-manager/src/java/org/apache/solr/crossdc/manager/consumer/PartitionManager.java
@@ -18,9 +18,9 @@ package org.apache.solr.crossdc.manager.consumer;
 
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayDeque;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Queue;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
@@ -146,7 +146,7 @@ public class PartitionManager {
           nextOffset);
     }
 
-    consumer.commitSync(Collections.singletonMap(partition, new OffsetAndMetadata(nextOffset)));
+    consumer.commitSync(Map.of(partition, new OffsetAndMetadata(nextOffset)));
   }
 
   static long getOffsetForPartition(
diff --git a/solr/cross-dc-manager/src/test/org/apache/solr/crossdc/manager/consumer/KafkaCrossDcConsumerTest.java b/solr/cross-dc-manager/src/test/org/apache/solr/crossdc/manager/consumer/KafkaCrossDcConsumerTest.java
index b576f074b32..fcbd2edd84d 100644
--- a/solr/cross-dc-manager/src/test/org/apache/solr/crossdc/manager/consumer/KafkaCrossDcConsumerTest.java
+++ b/solr/cross-dc-manager/src/test/org/apache/solr/crossdc/manager/consumer/KafkaCrossDcConsumerTest.java
@@ -35,7 +35,6 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -161,7 +160,7 @@ public class KafkaCrossDcConsumerTest {
     List<ConsumerRecord<String, MirroredSolrRequest<?>>> recordsList = new ArrayList<>();
     recordsList.add(
         new ConsumerRecord<>("sample-topic", 0, 0, "key", createSampleMirroredSolrRequest()));
-    return new ConsumerRecords<>(Collections.singletonMap(topicPartition, recordsList));
+    return new ConsumerRecords<>(Map.of(topicPartition, recordsList));
   }
 
   private MirroredSolrRequest<?> createSampleMirroredSolrRequest() {
@@ -309,8 +308,7 @@ public class KafkaCrossDcConsumerTest {
     ConsumerRecord<String, MirroredSolrRequest<?>> record =
         new ConsumerRecord<>("test-topic", 0, 0, "key", new MirroredSolrRequest<>(validRequest));
     ConsumerRecords<String, MirroredSolrRequest<?>> records =
-        new ConsumerRecords<>(
-            Collections.singletonMap(new TopicPartition("test-topic", 0), List.of(record)));
+        new ConsumerRecords<>(Map.of(new TopicPartition("test-topic", 0), List.of(record)));
 
     when(mockConsumer.poll(any())).thenReturn(records).thenThrow(new WakeupException());
 
@@ -358,8 +356,7 @@ public class KafkaCrossDcConsumerTest {
             new MirroredSolrRequest<>(MirroredSolrRequest.Type.UPDATE, new UpdateRequest()));
     ConsumerRecords<String, MirroredSolrRequest<?>> records =
         new ConsumerRecords<>(
-            Collections.singletonMap(
-                new TopicPartition("test-topic", 0), List.of(record1, record2)));
+            Map.of(new TopicPartition("test-topic", 0), List.of(record1, record2)));
 
     when(mockConsumer.poll(any())).thenReturn(records).thenThrow(new WakeupException());
 
@@ -436,8 +433,7 @@ public class KafkaCrossDcConsumerTest {
       records.add(record);
     }
     ConsumerRecords<String, MirroredSolrRequest<?>> consumerRecords =
-        new ConsumerRecords<>(
-            Collections.singletonMap(new TopicPartition("test-topic", 0), records));
+        new ConsumerRecords<>(Map.of(new TopicPartition("test-topic", 0), records));
 
     when(mockConsumer.poll(any())).thenReturn(consumerRecords).thenThrow(new WakeupException());
 
@@ -483,8 +479,7 @@ public class KafkaCrossDcConsumerTest {
     ConsumerRecord<String, MirroredSolrRequest<?>> record =
         new ConsumerRecord<>("test-topic", 0, 0, "key", new MirroredSolrRequest<>(invalidRequest));
     ConsumerRecords<String, MirroredSolrRequest<?>> records =
-        new ConsumerRecords<>(
-            Collections.singletonMap(new TopicPartition("test-topic", 0), List.of(record)));
+        new ConsumerRecords<>(Map.of(new TopicPartition("test-topic", 0), List.of(record)));
 
     when(mockConsumer.poll(any())).thenReturn(records).thenThrow(new WakeupException());
 
diff --git a/solr/cross-dc-manager/src/test/org/apache/solr/crossdc/manager/consumer/PartitionManagerTest.java b/solr/cross-dc-manager/src/test/org/apache/solr/crossdc/manager/consumer/PartitionManagerTest.java
index 3f3cbcb6f68..91902f5f896 100644
--- a/solr/cross-dc-manager/src/test/org/apache/solr/crossdc/manager/consumer/PartitionManagerTest.java
+++ b/solr/cross-dc-manager/src/test/org/apache/solr/crossdc/manager/consumer/PartitionManagerTest.java
@@ -25,7 +25,7 @@ import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import java.util.Collections;
+import java.util.Map;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
@@ -125,8 +125,7 @@ public class PartitionManagerTest {
 
     // Verify that the consumer.commitSync() method was called with the correct parameters
     verify(consumer, times(1))
-        .commitSync(
-            Collections.singletonMap(partition, new OffsetAndMetadata(workUnit.nextOffset)));
+        .commitSync(Map.of(partition, new OffsetAndMetadata(workUnit.nextOffset)));
 
     // Verify that the partitionQueue is empty after processing
     assertTrue(partitionWork.partitionQueue.isEmpty());
@@ -178,10 +177,8 @@ public class PartitionManagerTest {
 
     // Verify that the updateOffset method was called for each partition
     verify(mockConsumer, times(1))
-        .commitSync(
-            Collections.singletonMap(partition1, new OffsetAndMetadata(workUnit1.nextOffset)));
+        .commitSync(Map.of(partition1, new OffsetAndMetadata(workUnit1.nextOffset)));
     verify(mockConsumer, times(1))
-        .commitSync(
-            Collections.singletonMap(partition2, new OffsetAndMetadata(workUnit2.nextOffset)));
+        .commitSync(Map.of(partition2, new OffsetAndMetadata(workUnit2.nextOffset)));
   }
 }
diff --git a/solr/modules/analysis-extras/src/java/org/apache/solr/schema/ICUCollationField.java b/solr/modules/analysis-extras/src/java/org/apache/solr/schema/ICUCollationField.java
index 9d72b88ee38..277bbfc214a 100644
--- a/solr/modules/analysis-extras/src/java/org/apache/solr/schema/ICUCollationField.java
+++ b/solr/modules/analysis-extras/src/java/org/apache/solr/schema/ICUCollationField.java
@@ -25,7 +25,6 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import org.apache.lucene.analysis.Analyzer;
@@ -333,7 +332,7 @@ public class ICUCollationField extends FieldType {
       }
       return fields;
     } else {
-      return Collections.singletonList(createField(field, value));
+      return List.of(createField(field, value));
     }
   }
 
diff --git a/solr/modules/analysis-extras/src/java/org/apache/solr/update/processor/DocumentCategorizerUpdateProcessorFactory.java b/solr/modules/analysis-extras/src/java/org/apache/solr/update/processor/DocumentCategorizerUpdateProcessorFactory.java
index 27e673a8423..b045c28ac77 100644
--- a/solr/modules/analysis-extras/src/java/org/apache/solr/update/processor/DocumentCategorizerUpdateProcessorFactory.java
+++ b/solr/modules/analysis-extras/src/java/org/apache/solr/update/processor/DocumentCategorizerUpdateProcessorFactory.java
@@ -26,7 +26,6 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -274,7 +273,7 @@ public class DocumentCategorizerUpdateProcessorFactory extends UpdateRequestProc
           pe);
     }
     srcInclusions = new SelectorParams();
-    srcInclusions.fieldRegex = Collections.singletonList(this.pattern);
+    srcInclusions.fieldRegex = List.of(this.pattern);
   }
 
   /**
diff --git a/solr/modules/analysis-extras/src/java/org/apache/solr/update/processor/OpenNLPExtractNamedEntitiesUpdateProcessorFactory.java b/solr/modules/analysis-extras/src/java/org/apache/solr/update/processor/OpenNLPExtractNamedEntitiesUpdateProcessorFactory.java
index 575368372c0..6c2b57b12a9 100644
--- a/solr/modules/analysis-extras/src/java/org/apache/solr/update/processor/OpenNLPExtractNamedEntitiesUpdateProcessorFactory.java
+++ b/solr/modules/analysis-extras/src/java/org/apache/solr/update/processor/OpenNLPExtractNamedEntitiesUpdateProcessorFactory.java
@@ -23,7 +23,6 @@ import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -344,7 +343,7 @@ public class OpenNLPExtractNamedEntitiesUpdateProcessorFactory extends UpdateReq
           pe);
     }
     srcInclusions = new SelectorParams();
-    srcInclusions.fieldRegex = Collections.singletonList(this.pattern);
+    srcInclusions.fieldRegex = List.of(this.pattern);
   }
 
   /**
diff --git a/solr/modules/clustering/src/java/org/apache/solr/handler/clustering/ClusteringComponent.java b/solr/modules/clustering/src/java/org/apache/solr/handler/clustering/ClusteringComponent.java
index 6dce932476f..e418d269fca 100644
--- a/solr/modules/clustering/src/java/org/apache/solr/handler/clustering/ClusteringComponent.java
+++ b/solr/modules/clustering/src/java/org/apache/solr/handler/clustering/ClusteringComponent.java
@@ -20,7 +20,6 @@ import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.List;
@@ -156,7 +155,7 @@ public class ClusteringComponent extends SearchComponent implements SolrCoreAwar
         NamedList<Object> cluster = new SimpleOrderedMap<>();
         result.add(cluster);
         cluster.add(ClusteringResponse.IS_OTHER_TOPICS, true);
-        cluster.add(ClusteringResponse.LABELS_NODE, Collections.singletonList("Other topics"));
+        cluster.add(ClusteringResponse.LABELS_NODE, List.of("Other topics"));
         cluster.add(ClusteringResponse.SCORE_NODE, 0d);
         cluster.add(
             ClusteringResponse.DOCS_NODE,
diff --git a/solr/modules/jwt-auth/src/java/org/apache/solr/security/jwt/JWTAuthPlugin.java b/solr/modules/jwt-auth/src/java/org/apache/solr/security/jwt/JWTAuthPlugin.java
index 439de70d0d4..3e60cd71898 100644
--- a/solr/modules/jwt-auth/src/java/org/apache/solr/security/jwt/JWTAuthPlugin.java
+++ b/solr/modules/jwt-auth/src/java/org/apache/solr/security/jwt/JWTAuthPlugin.java
@@ -32,7 +32,6 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Base64;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -260,7 +259,7 @@ public class JWTAuthPlugin extends AuthenticationPlugin
       redirectUris = List.of();
       if (redirectUrisObj != null) {
         if (redirectUrisObj instanceof String) {
-          redirectUris = Collections.singletonList((String) redirectUrisObj);
+          redirectUris = List.of((String) redirectUrisObj);
         } else if (redirectUrisObj instanceof List) {
           redirectUris = (List<String>) redirectUrisObj;
         }
diff --git a/solr/modules/jwt-auth/src/java/org/apache/solr/security/jwt/JWTIssuerConfig.java b/solr/modules/jwt-auth/src/java/org/apache/solr/security/jwt/JWTIssuerConfig.java
index c0e074888a8..d8a6934317a 100644
--- a/solr/modules/jwt-auth/src/java/org/apache/solr/security/jwt/JWTIssuerConfig.java
+++ b/solr/modules/jwt-auth/src/java/org/apache/solr/security/jwt/JWTIssuerConfig.java
@@ -31,7 +31,6 @@ import java.nio.charset.StandardCharsets;
 import java.security.cert.X509Certificate;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -129,7 +128,7 @@ public class JWTIssuerConfig {
         iss = wellKnownDiscoveryConfig.getIssuer();
       }
       if (jwksUrl == null) {
-        jwksUrl = Collections.singletonList(wellKnownDiscoveryConfig.getJwksUrl());
+        jwksUrl = List.of(wellKnownDiscoveryConfig.getJwksUrl());
       }
       if (authorizationEndpoint == null) {
         authorizationEndpoint = wellKnownDiscoveryConfig.getAuthorizationEndpoint();
@@ -265,8 +264,7 @@ public class JWTIssuerConfig {
    */
   @SuppressWarnings("unchecked")
   public JWTIssuerConfig setJwksUrl(Object jwksUrlListOrString) {
-    if (jwksUrlListOrString instanceof String)
-      this.jwksUrl = Collections.singletonList((String) jwksUrlListOrString);
+    if (jwksUrlListOrString instanceof String) this.jwksUrl = List.of((String) jwksUrlListOrString);
     else if (jwksUrlListOrString instanceof List) this.jwksUrl = (List<String>) jwksUrlListOrString;
     else if (jwksUrlListOrString != null)
       throw new SolrException(
diff --git a/solr/modules/jwt-auth/src/test/org/apache/solr/security/jwt/JWTAuthPluginTest.java b/solr/modules/jwt-auth/src/test/org/apache/solr/security/jwt/JWTAuthPluginTest.java
index 7b9ace8084b..3d4dce30729 100644
--- a/solr/modules/jwt-auth/src/test/org/apache/solr/security/jwt/JWTAuthPluginTest.java
+++ b/solr/modules/jwt-auth/src/test/org/apache/solr/security/jwt/JWTAuthPluginTest.java
@@ -36,7 +36,6 @@ import java.security.cert.X509Certificate;
 import java.util.Arrays;
 import java.util.Base64;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -608,7 +607,7 @@ public class JWTAuthPluginTest extends SolrTestCaseJ4 {
             .setIss("1")
             .setAud("aud1")
             .setJwksUrl("https://127.0.0.1:9999/foo.jwk");
-    authConf.put("issuers", Collections.singletonList(iss1.asConfig()));
+    authConf.put("issuers", List.of(iss1.asConfig()));
     authConf.put("aud", "aud2");
     authConf.put(
         "jwksUrl",
diff --git a/solr/modules/ltr/src/java/org/apache/solr/ltr/feature/FieldValueFeature.java b/solr/modules/ltr/src/java/org/apache/solr/ltr/feature/FieldValueFeature.java
index 7a41916f29a..4e50dbd0c79 100644
--- a/solr/modules/ltr/src/java/org/apache/solr/ltr/feature/FieldValueFeature.java
+++ b/solr/modules/ltr/src/java/org/apache/solr/ltr/feature/FieldValueFeature.java
@@ -17,7 +17,6 @@
 package org.apache.solr.ltr.feature;
 
 import java.io.IOException;
-import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Set;
@@ -82,7 +81,7 @@ public class FieldValueFeature extends Feature {
 
   public void setField(String field) {
     this.field = field;
-    fieldAsSet = Collections.singleton(field);
+    fieldAsSet = Set.of(field);
   }
 
   @Override
diff --git a/solr/modules/ltr/src/test/org/apache/solr/ltr/model/TestWrapperModel.java b/solr/modules/ltr/src/test/org/apache/solr/ltr/model/TestWrapperModel.java
index 80e2b1b3101..3d93c443c83 100644
--- a/solr/modules/ltr/src/test/org/apache/solr/ltr/model/TestWrapperModel.java
+++ b/solr/modules/ltr/src/test/org/apache/solr/ltr/model/TestWrapperModel.java
@@ -20,7 +20,6 @@ package org.apache.solr.ltr.model;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import org.apache.solr.ltr.TestRerankBase;
@@ -66,15 +65,13 @@ public class TestWrapperModel extends TestRerankBase {
 
     // wrapper model with features
     WrapperModel wrapperModelWithFeatures =
-        new StubWrapperModel(
-            "testModel", Collections.singletonList(new ValueFeature("val", Map.of())), List.of());
+        new StubWrapperModel("testModel", List.of(new ValueFeature("val", Map.of())), List.of());
     ModelException e = expectThrows(ModelException.class, wrapperModelWithFeatures::validate);
     assertEquals("features must be empty for the wrapper model testModel", e.getMessage());
 
     // wrapper model with norms
     WrapperModel wrapperModelWithNorms =
-        new StubWrapperModel(
-            "testModel", List.of(), Collections.singletonList(IdentityNormalizer.INSTANCE));
+        new StubWrapperModel("testModel", List.of(), List.of(IdentityNormalizer.INSTANCE));
     e = expectThrows(ModelException.class, wrapperModelWithNorms::validate);
     assertEquals("norms must be empty for the wrapper model testModel", e.getMessage());
 
diff --git a/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/PerReplicaStatesOps.java b/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/PerReplicaStatesOps.java
index d37a55ca7ec..2e28d0350af 100644
--- a/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/PerReplicaStatesOps.java
+++ b/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/PerReplicaStatesOps.java
@@ -17,8 +17,6 @@
 
 package org.apache.solr.common.cloud;
 
-import static java.util.Collections.singletonList;
-
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -306,7 +304,7 @@ public class PerReplicaStatesOps {
       String replica, Replica.State state, boolean isLeader, PerReplicaStates rs) {
     return new PerReplicaStatesOps(
             perReplicaStates ->
-                singletonList(
+                List.of(
                     new PerReplicaStates.Operation(
                         PerReplicaStates.Operation.Type.ADD,
                         new PerReplicaStates.State(replica, state, isLeader, 0))))
diff --git a/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/ZkStateReader.java b/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/ZkStateReader.java
index 2b5a4695129..101d2ea983f 100644
--- a/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/ZkStateReader.java
+++ b/solr/solrj-zookeeper/src/java/org/apache/solr/common/cloud/ZkStateReader.java
@@ -506,7 +506,7 @@ public class ZkStateReader implements SolrCloseable {
           // What do you know, it exists!
           log.debug("Adding lazily-loaded reference for collection {}", collection);
           lazyCollectionStates.putIfAbsent(collection, tryLazyCollection);
-          constructState(Collections.singleton(collection));
+          constructState(Set.of(collection));
         }
       } else if (ref.isLazilyLoaded()) {
         log.debug("Refreshing lazily-loaded state for collection {}", collection);
@@ -518,7 +518,7 @@ public class ZkStateReader implements SolrCloseable {
         log.debug("Forcing refresh of watched collection state for {}", collection);
         DocCollection newState = fetchCollectionState(collection, null);
         if (collectionWatches.updateDocCollection(collection, newState)) {
-          constructState(Collections.singleton(collection));
+          constructState(Set.of(collection));
         }
       } else {
         log.error("Collection {} is not lazy nor watched!", collection);
@@ -543,7 +543,7 @@ public class ZkStateReader implements SolrCloseable {
       if (nu.getZNodeVersion() > collection.getZNodeVersion()) {
         if (collectionWatches.updateDocCollection(coll, nu)) {
           synchronized (getUpdateLock()) {
-            constructState(Collections.singleton(coll));
+            constructState(Set.of(coll));
           }
         }
         collection = nu;
@@ -1302,7 +1302,7 @@ public class ZkStateReader implements SolrCloseable {
         DocCollection newState = fetchCollectionState(coll, this);
         collectionWatches.updateDocCollection(coll, newState);
         synchronized (getUpdateLock()) {
-          constructState(Collections.singleton(coll));
+          constructState(Set.of(coll));
         }
 
       } catch (KeeperException.SessionExpiredException
@@ -1331,7 +1331,7 @@ public class ZkStateReader implements SolrCloseable {
                 : fetchCollectionState(coll, null);
         collectionWatches.updateDocCollection(coll, newState);
         synchronized (getUpdateLock()) {
-          constructState(Collections.singleton(coll));
+          constructState(Set.of(coll));
         }
         if (log.isDebugEnabled()) {
           log.debug(
diff --git a/solr/solrj-zookeeper/src/test/org/apache/solr/client/solrj/impl/NodeValueFetcherTest.java b/solr/solrj-zookeeper/src/test/org/apache/solr/client/solrj/impl/NodeValueFetcherTest.java
index 59d38f64f2c..2d07fd82964 100644
--- a/solr/solrj-zookeeper/src/test/org/apache/solr/client/solrj/impl/NodeValueFetcherTest.java
+++ b/solr/solrj-zookeeper/src/test/org/apache/solr/client/solrj/impl/NodeValueFetcherTest.java
@@ -16,7 +16,7 @@
  */
 package org.apache.solr.client.solrj.impl;
 
-import java.util.Collections;
+import java.util.List;
 import java.util.Optional;
 import java.util.Set;
 import org.apache.solr.client.solrj.impl.SolrClientNodeStateProvider.RemoteCallCtx;
@@ -66,8 +66,7 @@ public class NodeValueFetcherTest extends SolrCloudTestCase {
   @Test
   public void testGetTags() throws Exception {
     try (var cloudSolrClient =
-        new CloudSolrClient.Builder(
-                Collections.singletonList(cluster.getZkServer().getZkAddress()), Optional.empty())
+        new CloudSolrClient.Builder(List.of(cluster.getZkServer().getZkAddress()), Optional.empty())
             .build()) {
       int totalCores = 0;
 
diff --git a/solr/solrj-zookeeper/src/test/org/apache/solr/common/cloud/SolrZkClientTest.java b/solr/solrj-zookeeper/src/test/org/apache/solr/common/cloud/SolrZkClientTest.java
index 7a0fa5283cb..de5a38e00ec 100644
--- a/solr/solrj-zookeeper/src/test/org/apache/solr/common/cloud/SolrZkClientTest.java
+++ b/solr/solrj-zookeeper/src/test/org/apache/solr/common/cloud/SolrZkClientTest.java
@@ -21,7 +21,6 @@ import java.nio.charset.StandardCharsets;
 import java.nio.file.Path;
 import java.security.NoSuchAlgorithmException;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
 import java.util.concurrent.Semaphore;
@@ -68,7 +67,7 @@ public class SolrZkClientTest extends SolrCloudTestCase {
     configureCluster(1).addConfig("_default", ExternalPaths.DEFAULT_CONFIGSET).configure();
     solrClient =
         new RandomizingCloudSolrClientBuilder(
-                Collections.singletonList(cluster.getZkServer().getZkAddress()), Optional.empty())
+                List.of(cluster.getZkServer().getZkAddress()), Optional.empty())
             .build();
 
     final String SCHEME = "digest";
@@ -123,8 +122,7 @@ public class SolrZkClientTest extends SolrCloudTestCase {
           @Override
           protected ZkCredentialsProvider createZkCredentialsToAddAutomatically() {
             return new DefaultZkCredentialsProvider(
-                Collections.singletonList(
-                    new AuthInfo(SCHEME, AUTH.getBytes(StandardCharsets.UTF_8))));
+                List.of(new AuthInfo(SCHEME, AUTH.getBytes(StandardCharsets.UTF_8))));
           }
         };
   }
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/RemoteSolrException.java b/solr/solrj/src/java/org/apache/solr/client/solrj/RemoteSolrException.java
index 94bbca5ebb8..4552fe0cd9d 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/RemoteSolrException.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/RemoteSolrException.java
@@ -16,7 +16,6 @@
  */
 package org.apache.solr.client.solrj;
 
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import org.apache.solr.common.SolrErrorWrappingException;
@@ -71,8 +70,7 @@ public final class RemoteSolrException extends SolrException {
         this.remoteErrorMessageSuffix = remoteErrorMessageSuffix;
       }
 
-      Object metadataObj =
-          Utils.getObjectByPath(remoteError, false, Collections.singletonList("metadata"));
+      Object metadataObj = Utils.getObjectByPath(remoteError, false, List.of("metadata"));
       if (metadataObj instanceof NamedList) {
         setMetadata((NamedList<String>) metadataObj);
       } else if (metadataObj instanceof List) {
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/SolrClient.java b/solr/solrj/src/java/org/apache/solr/client/solrj/SolrClient.java
index 5b21d582d45..4512eaaa7d8 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/SolrClient.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/SolrClient.java
@@ -21,7 +21,6 @@ import java.io.IOException;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import org.apache.solr.client.solrj.SolrRequest.METHOD;
@@ -1072,7 +1071,7 @@ public abstract class SolrClient implements Serializable, Closeable {
    */
   public SolrDocument getById(String collection, String id, SolrParams params)
       throws SolrServerException, IOException {
-    SolrDocumentList docs = getById(collection, Collections.singletonList(id), params);
+    SolrDocumentList docs = getById(collection, List.of(id), params);
     if (!docs.isEmpty()) {
       return docs.get(0);
     }
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/beans/DocumentObjectBinder.java b/solr/solrj/src/java/org/apache/solr/client/solrj/beans/DocumentObjectBinder.java
index 86ecd6590d1..e22ada013c7 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/beans/DocumentObjectBinder.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/beans/DocumentObjectBinder.java
@@ -28,7 +28,6 @@ import java.security.PrivilegedAction;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
@@ -476,7 +475,7 @@ public class DocumentObjectBinder {
         } else if (val instanceof List) {
           list = (List<?>) val;
         } else {
-          list = Collections.singletonList(val);
+          list = List.of(val);
         }
         set(obj, list.toArray((Object[]) Array.newInstance(type, list.size())));
       } else if (isList && !isContainedInMap) {
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 3f79b11801c..8eb4733ecac 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
@@ -753,8 +753,7 @@ public abstract class CloudSolrClient extends SolrClient {
 
     // Check to see if the collection is an alias. Updates to multi-collection aliases are ok as
     // long as they are routed aliases
-    List<String> aliasedCollections =
-        new ArrayList<>(resolveAliases(Collections.singletonList(collection)));
+    List<String> aliasedCollections = new ArrayList<>(resolveAliases(List.of(collection)));
     if (aliasedCollections.size() == 1 || getClusterStateProvider().isRoutedAlias(collection)) {
       collection = aliasedCollections.get(0); // pick 1st (consistent with HttpSolrCall behavior)
     } else {
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/DelegatingClusterStateProvider.java b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/DelegatingClusterStateProvider.java
index 48030c79c7c..6ffd111e761 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/impl/DelegatingClusterStateProvider.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/impl/DelegatingClusterStateProvider.java
@@ -17,7 +17,6 @@
 package org.apache.solr.client.solrj.impl;
 
 import java.io.IOException;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -55,7 +54,7 @@ public class DelegatingClusterStateProvider implements ClusterStateProvider {
     if (delegate != null) {
       return delegate.resolveAlias(alias);
     } else {
-      return Collections.singletonList(alias);
+      return List.of(alias);
     }
   }
 
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/request/ConfigSetAdminRequest.java b/solr/solrj/src/java/org/apache/solr/client/solrj/request/ConfigSetAdminRequest.java
index f11da334c47..e0b0a708e3f 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/request/ConfigSetAdminRequest.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/request/ConfigSetAdminRequest.java
@@ -22,7 +22,6 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.nio.file.Path;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Map;
 import java.util.Properties;
 import org.apache.solr.client.solrj.SolrRequest;
@@ -207,7 +206,7 @@ public abstract class ConfigSetAdminRequest<
 
     @Override
     public Collection<ContentStream> getContentStreams() throws IOException {
-      return Collections.singletonList(stream);
+      return java.util.List.of(stream);
     }
 
     @Override
diff --git a/solr/solrj/src/java/org/apache/solr/client/solrj/routing/NodePreferenceRulesComparator.java b/solr/solrj/src/java/org/apache/solr/client/solrj/routing/NodePreferenceRulesComparator.java
index b6cd6df90c8..e2e4ad4cd2a 100644
--- a/solr/solrj/src/java/org/apache/solr/client/solrj/routing/NodePreferenceRulesComparator.java
+++ b/solr/solrj/src/java/org/apache/solr/client/solrj/routing/NodePreferenceRulesComparator.java
@@ -18,7 +18,6 @@
 package org.apache.solr.client.solrj.routing;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
@@ -219,7 +218,7 @@ public class NodePreferenceRulesComparator {
               // For SolrJ clients, which do not have Solr sysProps, this preference won't be used
               yield null;
             }
-            Collection<String> tags = Collections.singletonList(preferenceRule.value);
+            Collection<String> tags = List.of(preferenceRule.value);
             Map<String, Object> currentNodeMetric = sysProps.getSysProps(nodeName, tags);
             yield Comparator.comparing(
                 r -> currentNodeMetric.equals(sysProps.getSysProps(r.getNodeName(), tags)));
diff --git a/solr/solrj/src/java/org/apache/solr/common/SolrInputField.java b/solr/solrj/src/java/org/apache/solr/common/SolrInputField.java
index 281d9817d07..e42935083cb 100644
--- a/solr/solrj/src/java/org/apache/solr/common/SolrInputField.java
+++ b/solr/solrj/src/java/org/apache/solr/common/SolrInputField.java
@@ -21,6 +21,7 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
+import java.util.Set;
 
 /**
  * @since solr 1.3
@@ -161,7 +162,7 @@ public class SolrInputField implements Iterable<Object>, Serializable {
     } else if (value instanceof Collection) {
       return ((Collection<Object>) value).iterator();
     }
-    return Collections.singleton(value).iterator();
+    return Set.of(value).iterator();
   }
 
   @Override
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/Aliases.java b/solr/solrj/src/java/org/apache/solr/common/cloud/Aliases.java
index 1e383fd91ae..f09622c3b01 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/Aliases.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/Aliases.java
@@ -276,7 +276,7 @@ public class Aliases {
     // Due to another level of indirection, this is more complicated...
     List<String> level1 = collectionAliasListMap.get(aliasName);
     if (level1 == null) {
-      return Collections.singletonList(aliasName); // is a collection
+      return List.of(aliasName); // is a collection
     }
     // avoid allocating objects if possible
     LinkedHashSet<String> uniqueResult = null;
@@ -410,7 +410,7 @@ public class Aliases {
       }
     }
     if (level1 == null) { // create an alias that points to the collection
-      newColAliases.put(after, Collections.singletonList(before));
+      newColAliases.put(after, List.of(before));
     }
     return new Aliases(newColAliases, newColProperties, zNodeVersion);
   }
@@ -430,8 +430,11 @@ public class Aliases {
    */
   public Aliases cloneWithCollectionAliasProperties(
       String alias, String propertiesKey, String propertiesValue) {
-    return cloneWithCollectionAliasProperties(
-        alias, Collections.singletonMap(propertiesKey, propertiesValue));
+    // Use a HashMap to allow null propertiesValue (null means remove the key in the map-based
+    // overload)
+    Map<String, String> props = new LinkedHashMap<>();
+    props.put(propertiesKey, propertiesValue);
+    return cloneWithCollectionAliasProperties(alias, props);
   }
 
   /**
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/CompositeIdRouter.java b/solr/solrj/src/java/org/apache/solr/common/cloud/CompositeIdRouter.java
index 39adeef1a52..fede4e6b453 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/CompositeIdRouter.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/CompositeIdRouter.java
@@ -18,7 +18,6 @@ package org.apache.solr.common.cloud;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrInputDocument;
@@ -218,8 +217,7 @@ public class CompositeIdRouter extends HashBasedRouter {
 
     if (shardKey.indexOf(SEPARATOR) < 0) {
       // shardKey is a simple id, so don't do a range
-      return Collections.singletonList(
-          hashToSlice(Hash.murmurhash3_x86_32(id, 0, id.length(), 0), collection));
+      return List.of(hashToSlice(Hash.murmurhash3_x86_32(id, 0, id.length(), 0), collection));
     }
 
     Range completeRange = new KeyParser(id).getRange();
@@ -255,7 +253,7 @@ public class CompositeIdRouter extends HashBasedRouter {
       throw new IllegalArgumentException("Key range does not overlap given range");
     }
     if (keyRange.equals(range)) {
-      return Collections.singletonList(keyRange);
+      return List.of(keyRange);
     } else if (keyRange.isSubsetOf(range)) {
       result.add(new Range(range.min, keyRange.min - 1));
       result.add(keyRange);
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/HashBasedRouter.java b/solr/solrj/src/java/org/apache/solr/common/cloud/HashBasedRouter.java
index 2dd6fae7d48..9d38c3e95c4 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/HashBasedRouter.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/HashBasedRouter.java
@@ -19,7 +19,6 @@ package org.apache.solr.common.cloud;
 import static org.apache.solr.common.params.CommonParams.ID;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrInputDocument;
@@ -94,6 +93,6 @@ public abstract class HashBasedRouter extends DocRouter {
 
     // use the shardKey as an id for plain hashing
     Slice slice = getTargetSlice(shardKey, null, null, params, collection);
-    return slice == null ? List.of() : Collections.singletonList(slice);
+    return slice == null ? List.of() : List.of(slice);
   }
 }
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/ImplicitDocRouter.java b/solr/solrj/src/java/org/apache/solr/common/cloud/ImplicitDocRouter.java
index ca2f4277a59..724c03109fb 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/ImplicitDocRouter.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/ImplicitDocRouter.java
@@ -19,8 +19,8 @@ package org.apache.solr.common.cloud;
 import static org.apache.solr.common.params.ShardParams._ROUTE_;
 
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 import org.apache.solr.common.SolrException;
 import org.apache.solr.common.SolrInputDocument;
 import org.apache.solr.common.params.SolrParams;
@@ -111,7 +111,7 @@ public class ImplicitDocRouter extends DocRouter {
               + collection.getName());
     }
 
-    return Collections.singleton(slice);
+    return Set.of(slice);
   }
 
   @Override
diff --git a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java
index 1e44d700342..72ba3949b0e 100644
--- a/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java
+++ b/solr/solrj/src/java/org/apache/solr/common/cloud/ZkNodeProps.java
@@ -19,7 +19,6 @@ package org.apache.solr.common.cloud;
 import static org.apache.solr.common.util.Utils.toJSONString;
 
 import java.io.IOException;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.Map;
@@ -47,7 +46,7 @@ public class ZkNodeProps implements MapWriter {
   }
 
   public ZkNodeProps plus(String key, Object val) {
-    return plus(Collections.singletonMap(key, val));
+    return plus(Map.of(key, val));
   }
 
   public ZkNodeProps plus(Map<String, Object> newVals) {
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 97e45a7e588..7598e90fcbb 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
@@ -16,8 +16,6 @@
  */
 package org.apache.solr.common.util;
 
-import static java.util.Collections.singletonList;
-import static java.util.Collections.singletonMap;
 import static org.apache.solr.common.util.StrUtils.formatString;
 import static org.apache.solr.common.util.Utils.toJSON;
 
@@ -26,7 +24,6 @@ import java.io.InputStream;
 import java.io.Reader;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -145,7 +142,7 @@ public class CommandOperation {
         if (l.isEmpty()) return def;
         return l;
       } else {
-        return singletonList(String.valueOf(v));
+        return List.of(String.valueOf(v));
       }
     }
   }
@@ -228,7 +225,7 @@ public class CommandOperation {
             if (value instanceof List && !singletonCommands.contains(key)) {
               vals = (List<?>) value;
             } else {
-              vals = Collections.singletonList(value);
+              vals = List.of(value);
             }
             for (Object val : vals) {
               operations.add(new CommandOperation(String.valueOf(key), val));
@@ -315,7 +312,7 @@ public class CommandOperation {
 
   @Override
   public String toString() {
-    return new String(toJSON(singletonMap(name, commandData)), StandardCharsets.UTF_8);
+    return new String(toJSON(Map.of(name, commandData)), StandardCharsets.UTF_8);
   }
 
   public static List<CommandOperation> readCommands(
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 9988ff94c46..9d19c35b8ac 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
@@ -19,7 +19,6 @@ package org.apache.solr.common.util;
 
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -271,7 +270,7 @@ class RequiredValidator extends Validator<List<String>> {
             return false;
           }
           String subprop = requiredProp.substring(requiredProp.indexOf('.') + 1);
-          if (!validate(((Map) o).get(requiredProp), errs, Collections.singleton(subprop))) {
+          if (!validate(((Map) o).get(requiredProp), errs, Set.of(subprop))) {
             return false;
           }
         } else {
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/RetryUtil.java b/solr/solrj/src/java/org/apache/solr/common/util/RetryUtil.java
index 7c6c7c5dc55..f6fd50d2ada 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/RetryUtil.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/RetryUtil.java
@@ -17,7 +17,6 @@
 package org.apache.solr.common.util;
 
 import java.lang.invoke.MethodHandles;
-import java.util.Collections;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Predicate;
@@ -75,7 +74,7 @@ public class RetryUtil {
   public static void retryOnException(
       Class<? extends Exception> clazz, long timeoutms, long intervalms, RetryCmd cmd)
       throws Exception {
-    retryOnException(Collections.singleton(clazz), timeoutms, intervalms, cmd);
+    retryOnException(Set.of(clazz), timeoutms, intervalms, cmd);
   }
 
   /**
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 164ae8ae7b0..ddae531d3f5 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
@@ -17,7 +17,6 @@
 package org.apache.solr.common.util;
 
 import static java.nio.charset.StandardCharsets.UTF_8;
-import static java.util.Collections.singletonList;
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
 import static org.apache.solr.common.SolrException.ErrorCode.SERVER_ERROR;
 
@@ -441,8 +440,11 @@ public class Utils {
     }
   }
 
+  @SuppressForbidden(
+      reason = "singletonList(null) is intentional — null is a sentinel path element")
   public static Object getObjectByPath(Object root, boolean onlyPrimitive, String hierarchy) {
-    if (hierarchy == null) return getObjectByPath(root, onlyPrimitive, singletonList(null));
+    if (hierarchy == null)
+      return getObjectByPath(root, onlyPrimitive, Collections.singletonList(null));
     List<String> parts = StrUtils.splitSmart(hierarchy, '/', true);
     return getObjectByPath(root, onlyPrimitive, parts);
   }
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientBuilderTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientBuilderTest.java
index cd9b4d20096..62be902fa67 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientBuilderTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientBuilderTest.java
@@ -25,7 +25,6 @@ import static org.mockito.Mockito.when;
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
 import java.util.concurrent.TimeUnit;
@@ -56,8 +55,7 @@ public class CloudHttp2SolrClientBuilderTest extends SolrCloudTestCase {
   @Test
   public void testSingleZkHostSpecified() throws IOException {
     try (CloudSolrClient createdClient =
-        new CloudSolrClient.Builder(Collections.singletonList(ANY_ZK_HOST), Optional.of(ANY_CHROOT))
-            .build()) {
+        new CloudSolrClient.Builder(List.of(ANY_ZK_HOST), Optional.of(ANY_CHROOT)).build()) {
       try (ZkClientClusterStateProvider zkClientClusterStateProvider =
           ZkClientClusterStateProvider.from(createdClient)) {
         final String clientZkHost = zkClientClusterStateProvider.getZkHost();
@@ -104,8 +102,7 @@ public class CloudHttp2SolrClientBuilderTest extends SolrCloudTestCase {
   @Test
   public void testByDefaultConfiguresClientToSendUpdatesOnlyToShardLeaders() throws IOException {
     try (CloudSolrClient createdClient =
-        new CloudSolrClient.Builder(Collections.singletonList(ANY_ZK_HOST), Optional.of(ANY_CHROOT))
-            .build()) {
+        new CloudSolrClient.Builder(List.of(ANY_ZK_HOST), Optional.of(ANY_CHROOT)).build()) {
       assertTrue(createdClient.isUpdatesToLeaders());
     }
   }
@@ -113,8 +110,7 @@ public class CloudHttp2SolrClientBuilderTest extends SolrCloudTestCase {
   @Test
   public void testIsDirectUpdatesToLeadersOnlyDefault() throws IOException {
     try (CloudSolrClient createdClient =
-        new CloudSolrClient.Builder(Collections.singletonList(ANY_ZK_HOST), Optional.of(ANY_CHROOT))
-            .build()) {
+        new CloudSolrClient.Builder(List.of(ANY_ZK_HOST), Optional.of(ANY_CHROOT)).build()) {
       assertFalse(createdClient.isDirectUpdatesToLeadersOnly());
     }
   }
@@ -124,16 +120,14 @@ public class CloudHttp2SolrClientBuilderTest extends SolrCloudTestCase {
     expectThrows(
         IllegalStateException.class,
         () ->
-            new CloudSolrClient.Builder(
-                    Collections.singletonList(ANY_ZK_HOST), Optional.of(ANY_CHROOT))
+            new CloudSolrClient.Builder(List.of(ANY_ZK_HOST), Optional.of(ANY_CHROOT))
                 .withHttpClient(mock(HttpJettySolrClient.class))
                 .withHttpClientBuilder(mock(HttpJettySolrClient.Builder.class))
                 .build());
     expectThrows(
         IllegalStateException.class,
         () ->
-            new CloudSolrClient.Builder(
-                    Collections.singletonList(ANY_ZK_HOST), Optional.of(ANY_CHROOT))
+            new CloudSolrClient.Builder(List.of(ANY_ZK_HOST), Optional.of(ANY_CHROOT))
                 .withHttpClientBuilder(mock(HttpJettySolrClient.Builder.class))
                 .withHttpClient(mock(HttpJettySolrClient.class))
                 .build());
@@ -145,7 +139,7 @@ public class CloudHttp2SolrClientBuilderTest extends SolrCloudTestCase {
     HttpJettySolrClient.Builder http2ClientBuilder = mock(HttpJettySolrClient.Builder.class);
     when(http2ClientBuilder.build()).thenReturn(http2Client);
     CloudSolrClient.Builder clientBuilder =
-        new CloudSolrClient.Builder(Collections.singletonList(ANY_ZK_HOST), Optional.of(ANY_CHROOT))
+        new CloudSolrClient.Builder(List.of(ANY_ZK_HOST), Optional.of(ANY_CHROOT))
             .withHttpClientBuilder(http2ClientBuilder);
     verify(http2ClientBuilder, never()).build();
     try (CloudHttp2SolrClient client = clientBuilder.build()) {
@@ -163,7 +157,7 @@ public class CloudHttp2SolrClientBuilderTest extends SolrCloudTestCase {
     HttpJdkSolrClient.Builder http2ClientBuilder = mock(HttpJdkSolrClient.Builder.class);
     when(http2ClientBuilder.build()).thenReturn(http2Client);
     CloudSolrClient.Builder clientBuilder =
-        new CloudSolrClient.Builder(Collections.singletonList(ANY_ZK_HOST), Optional.of(ANY_CHROOT))
+        new CloudSolrClient.Builder(List.of(ANY_ZK_HOST), Optional.of(ANY_CHROOT))
             .withHttpClientBuilder(http2ClientBuilder);
     verify(http2ClientBuilder, never()).build();
     try (CloudHttp2SolrClient client = clientBuilder.build()) {
@@ -179,7 +173,7 @@ public class CloudHttp2SolrClientBuilderTest extends SolrCloudTestCase {
   public void testProvideExternalJettyClient() throws IOException {
     HttpJettySolrClient http2Client = mock(HttpJettySolrClient.class);
     CloudSolrClient.Builder clientBuilder =
-        new CloudSolrClient.Builder(Collections.singletonList(ANY_ZK_HOST), Optional.of(ANY_CHROOT))
+        new CloudSolrClient.Builder(List.of(ANY_ZK_HOST), Optional.of(ANY_CHROOT))
             .withHttpClient(http2Client);
     try (CloudHttp2SolrClient client = clientBuilder.build()) {
       assertEquals(http2Client, client.getHttpClient());
@@ -192,7 +186,7 @@ public class CloudHttp2SolrClientBuilderTest extends SolrCloudTestCase {
   public void testProvideExternalJdkClient() throws IOException {
     HttpJdkSolrClient http2Client = mock(HttpJdkSolrClient.class);
     CloudSolrClient.Builder clientBuilder =
-        new CloudSolrClient.Builder(Collections.singletonList(ANY_ZK_HOST), Optional.of(ANY_CHROOT))
+        new CloudSolrClient.Builder(List.of(ANY_ZK_HOST), Optional.of(ANY_CHROOT))
             .withHttpClient(http2Client);
     try (CloudHttp2SolrClient client = clientBuilder.build()) {
       assertEquals(http2Client, client.getHttpClient());
@@ -204,8 +198,7 @@ public class CloudHttp2SolrClientBuilderTest extends SolrCloudTestCase {
   @Test
   public void testDefaultClientUsesJetty() throws IOException {
     try (CloudHttp2SolrClient createdClient =
-        new CloudSolrClient.Builder(Collections.singletonList(ANY_ZK_HOST), Optional.of(ANY_CHROOT))
-            .build()) {
+        new CloudSolrClient.Builder(List.of(ANY_ZK_HOST), Optional.of(ANY_CHROOT)).build()) {
       assertTrue(createdClient.getHttpClient() instanceof HttpJettySolrClient);
       assertTrue(createdClient.getLbClient().getClient(null) instanceof HttpJettySolrClient);
     }
@@ -214,7 +207,7 @@ public class CloudHttp2SolrClientBuilderTest extends SolrCloudTestCase {
   @Test
   public void testDefaultCollectionPassedFromBuilderToClient() throws IOException {
     try (CloudHttp2SolrClient createdClient =
-        new CloudSolrClient.Builder(Collections.singletonList(ANY_ZK_HOST), Optional.of(ANY_CHROOT))
+        new CloudSolrClient.Builder(List.of(ANY_ZK_HOST), Optional.of(ANY_CHROOT))
             .withDefaultCollection("aCollection")
             .build()) {
       assertEquals("aCollection", createdClient.getDefaultCollection());
@@ -277,7 +270,7 @@ public class CloudHttp2SolrClientBuilderTest extends SolrCloudTestCase {
   @SuppressWarnings({"try"})
   public void test0Timeouts() throws IOException {
     try (CloudSolrClient createdClient =
-        new CloudSolrClient.Builder(Collections.singletonList(ANY_ZK_HOST), Optional.empty())
+        new CloudSolrClient.Builder(List.of(ANY_ZK_HOST), Optional.empty())
             .withZkConnectTimeout(0, TimeUnit.MILLISECONDS)
             .withZkClientTimeout(0, TimeUnit.MILLISECONDS)
             .build()) {
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientRetryTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientRetryTest.java
index 9584ffc65cc..c5f52ccaa61 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientRetryTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientRetryTest.java
@@ -19,7 +19,7 @@ package org.apache.solr.client.solrj.impl;
 
 import static org.apache.solr.util.SolrJMetricTestUtils.getPrometheusMetricValue;
 
-import java.util.Collections;
+import java.util.List;
 import java.util.Optional;
 import org.apache.solr.client.solrj.jetty.HttpJettySolrClient;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
@@ -61,7 +61,7 @@ public class CloudHttp2SolrClientRetryTest extends SolrCloudTestCase {
 
     var cloudSolrclientBuilder =
         new CloudSolrClient.Builder(
-            Collections.singletonList(cluster.getZkServer().getZkAddress()), Optional.empty());
+            List.of(cluster.getZkServer().getZkAddress()), Optional.empty());
     cloudSolrclientBuilder.withHttpClientBuilder(
         random().nextBoolean() ? jettyClientBuilder : jdkClientBuilder);
 
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientTest.java
index 317fc48dbed..3d2f32fc2a7 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudHttp2SolrClientTest.java
@@ -26,7 +26,6 @@ import java.net.URI;
 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;
@@ -155,8 +154,7 @@ public class CloudHttp2SolrClientTest extends SolrCloudTestCase {
             instanceof HttpJdkSolrClient);
 
     zkBasedCloudSolrClient =
-        new CloudSolrClient.Builder(
-                Collections.singletonList(cluster.getZkServer().getZkAddress()), Optional.empty())
+        new CloudSolrClient.Builder(List.of(cluster.getZkServer().getZkAddress()), Optional.empty())
             .build();
     assertTrue(zkBasedCloudSolrClient.getHttpClient() instanceof HttpJettySolrClient);
     assertTrue(
@@ -432,7 +430,7 @@ public class CloudHttp2SolrClientTest extends SolrCloudTestCase {
     // Test Multi-Threaded routed updates for UpdateRequest
     try (CloudSolrClient threadedClient =
         new RandomizingCloudSolrClientBuilder(
-                Collections.singletonList(cluster.getZkServer().getZkAddress()), Optional.empty())
+                List.of(cluster.getZkServer().getZkAddress()), Optional.empty())
             .sendUpdatesOnlyToShardLeaders()
             .withParallelUpdates(true)
             .withDefaultCollection("routing_collection")
@@ -717,7 +715,7 @@ public class CloudHttp2SolrClientTest extends SolrCloudTestCase {
 
     try (CloudSolrClient client =
         new RandomizingCloudSolrClientBuilder(
-                Collections.singletonList(cluster.getZkServer().getZkAddress()), Optional.empty())
+                List.of(cluster.getZkServer().getZkAddress()), Optional.empty())
             .withDefaultCollection("foo")
             .build()) {
       // important to have one replica on each node
@@ -792,7 +790,7 @@ public class CloudHttp2SolrClientTest extends SolrCloudTestCase {
   public void checkCollectionParameters() throws Exception {
     try (CloudSolrClient client =
         new RandomizingCloudSolrClientBuilder(
-                Collections.singletonList(cluster.getZkServer().getZkAddress()), Optional.empty())
+                List.of(cluster.getZkServer().getZkAddress()), Optional.empty())
             .withDefaultCollection("multicollection1")
             .build()) {
 
@@ -912,9 +910,7 @@ public class CloudHttp2SolrClientTest extends SolrCloudTestCase {
   @Test
   public void testShutdown() throws IOException {
     try (CloudSolrClient client =
-        new RandomizingCloudSolrClientBuilder(
-                Collections.singletonList(DEAD_HOST_1), Optional.empty())
-            .build()) {
+        new RandomizingCloudSolrClientBuilder(List.of(DEAD_HOST_1), Optional.empty()).build()) {
       try (ZkClientClusterStateProvider zkClientClusterStateProvider =
           ZkClientClusterStateProvider.from(client)) {
         zkClientClusterStateProvider.setZkConnectTimeout(100);
@@ -928,8 +924,7 @@ public class CloudHttp2SolrClientTest extends SolrCloudTestCase {
   public void testWrongZkChrootTest() throws IOException {
     try (CloudSolrClient client =
         new RandomizingCloudSolrClientBuilder(
-                Collections.singletonList(cluster.getZkServer().getZkAddress() + "/xyz/foo"),
-                Optional.empty())
+                List.of(cluster.getZkServer().getZkAddress() + "/xyz/foo"), Optional.empty())
             .build()) {
       try (ZkClientClusterStateProvider zkClientClusterStateProvider =
           ZkClientClusterStateProvider.from(client)) {
@@ -948,9 +943,7 @@ public class CloudHttp2SolrClientTest extends SolrCloudTestCase {
     String baseUrl = cluster.getJettySolrRunners().get(0).getBaseUrl().toString();
     try (HttpJettySolrClient httpClient = new HttpJettySolrClient.Builder(baseUrl).build()) {
       try (CloudSolrClient cloudClient =
-          new CloudJettySolrClient.Builder(Collections.singletonList(baseUrl))
-              .withHttpClient(httpClient)
-              .build()) {
+          new CloudJettySolrClient.Builder(List.of(baseUrl)).withHttpClient(httpClient).build()) {
         // Verify the CloudJettySolrClient uses the provided HttpJettySolrClient
         assertSame(((CloudJettySolrClient) cloudClient).getHttpClient(), httpClient);
       }
@@ -1064,7 +1057,7 @@ public class CloudHttp2SolrClientTest extends SolrCloudTestCase {
     // NOTE: creating our own CloudSolrClient whose settings we can muck with...
     try (CloudSolrClient stale_client =
         new RandomizingCloudSolrClientBuilder(
-                Collections.singletonList(cluster.getZkServer().getZkAddress()), Optional.empty())
+                List.of(cluster.getZkServer().getZkAddress()), Optional.empty())
             .withParallelUpdates(true)
             .sendDirectUpdatesToAnyShardReplica()
             .withDefaultCollection(COL)
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientCacheTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientCacheTest.java
index 521bfd0f0be..8d279ea773b 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientCacheTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientCacheTest.java
@@ -93,7 +93,7 @@ public class CloudSolrClientCacheTest extends SolrTestCaseJ4 {
     }
     Map<String, Function<?, ?>> responses = new HashMap<>();
     NamedList<Object> okResponse = new NamedList<>();
-    okResponse.add("responseHeader", new NamedList<>(Collections.singletonMap("status", 0)));
+    okResponse.add("responseHeader", new NamedList<>(Map.of("status", 0)));
 
     LBHttpSolrClient mockLbclient = getMockLbHttpSolrClient(responses);
     AtomicInteger lbhttpRequestCount = new AtomicInteger();
@@ -332,7 +332,7 @@ public class CloudSolrClientCacheTest extends SolrTestCaseJ4 {
 
       @Override
       public List<String> resolveAlias(String collection) {
-        return Collections.singletonList(collection);
+        return List.of(collection);
       }
 
       @Override
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientRoutingTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientRoutingTest.java
index a2693167833..69bc456885f 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientRoutingTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/CloudSolrClientRoutingTest.java
@@ -18,7 +18,6 @@ package org.apache.solr.client.solrj.impl;
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
 import org.apache.lucene.tests.util.TestUtil;
@@ -149,8 +148,7 @@ public final class CloudSolrClientRoutingTest extends SolrCloudTestCase {
     cluster.waitForActiveCollection(collectionName, 2, 2);
 
     try (CloudSolrClient client =
-        new CloudSolrClient.Builder(
-                Collections.singletonList(cluster.getZkServer().getZkAddress()), Optional.empty())
+        new CloudSolrClient.Builder(List.of(cluster.getZkServer().getZkAddress()), Optional.empty())
             .withDefaultCollection(collectionName)
             .sendUpdatesOnlyToShardLeaders()
             .sendDirectUpdatesToShardLeadersOnly()
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpClusterStateSSLTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpClusterStateSSLTest.java
index 529b95373f6..5ae877eda0a 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpClusterStateSSLTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpClusterStateSSLTest.java
@@ -18,7 +18,6 @@
 package org.apache.solr.client.solrj.impl;
 
 import java.net.URL;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import org.apache.solr.client.solrj.request.CollectionAdminRequest;
@@ -81,7 +80,7 @@ public class HttpClusterStateSSLTest extends SolrCloudTestCase {
 
     // verify the http derived cluster state (on the client side) agrees with what the server stored
     try (CloudSolrClient httpBasedCloudSolrClient =
-        new CloudSolrClient.Builder(Collections.singletonList(url0.toExternalForm())).build()) {
+        new CloudSolrClient.Builder(List.of(url0.toExternalForm())).build()) {
       ClusterStateProvider csp = httpBasedCloudSolrClient.getClusterStateProvider();
       assertTrue(csp instanceof HttpClusterStateProvider);
       verifyUrlSchemeInClusterState(csp.getCollection(collectionId), expectedReplicas);
@@ -89,7 +88,7 @@ public class HttpClusterStateSSLTest extends SolrCloudTestCase {
 
     // http2
     try (CloudSolrClient http2BasedClient =
-        new CloudSolrClient.Builder(Collections.singletonList(url0.toExternalForm())).build()) {
+        new CloudSolrClient.Builder(List.of(url0.toExternalForm())).build()) {
       ClusterStateProvider csp = http2BasedClient.getClusterStateProvider();
       assertTrue(csp instanceof HttpClusterStateProvider);
       verifyUrlSchemeInClusterState(csp.getCollection(collectionId), expectedReplicas);
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpJdkSolrClientTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpJdkSolrClientTest.java
index 1c99a2caa4d..707e665d97a 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpJdkSolrClientTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpJdkSolrClientTest.java
@@ -24,7 +24,7 @@ import java.net.URI;
 import java.net.URISyntaxException;
 import java.net.http.HttpClient;
 import java.util.Arrays;
-import java.util.Collections;
+import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
@@ -533,7 +533,7 @@ public class HttpJdkSolrClientTest extends HttpSolrClientTestBase {
    * @param client the client
    */
   private void queryToHelpJdkReleaseThreads(HttpJdkSolrClient client) throws Exception {
-    client.query("collection1", new MapSolrParams(Collections.singletonMap("q", "*:*")));
+    client.query("collection1", new MapSolrParams(Map.of("q", "*:*")));
   }
 
   private void assertNoHeadRequestWithSsl(HttpJdkSolrClient client) {
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpSolrClientTestBase.java b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpSolrClientTestBase.java
index ad122866273..771e6e1db58 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpSolrClientTestBase.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/HttpSolrClientTestBase.java
@@ -27,10 +27,10 @@ import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Base64;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 import java.util.Properties;
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
@@ -237,7 +237,7 @@ public abstract class HttpSolrClientTestBase extends SolrTestCaseJ4 {
 
   public void testGetById(HttpSolrClientBase client) throws Exception {
     DebugServlet.clear();
-    Collection<String> ids = Collections.singletonList("a");
+    Collection<String> ids = List.of("a");
     try {
       client.getById("a");
     } catch (RemoteSolrException ignored) {
@@ -577,9 +577,7 @@ public abstract class HttpSolrClientTestBase extends SolrTestCaseJ4 {
       client.commit(DEFAULT_COLLECTION);
       QueryResponse qr =
           client.query(
-              DEFAULT_COLLECTION,
-              new MapSolrParams(Collections.singletonMap("q", "*:*")),
-              SolrRequest.METHOD.POST);
+              DEFAULT_COLLECTION, new MapSolrParams(Map.of("q", "*:*")), SolrRequest.METHOD.POST);
       assertEquals(0, qr.getResults().getNumFound());
 
       for (int i = 0; i < limit; i++) {
@@ -595,9 +593,7 @@ public abstract class HttpSolrClientTestBase extends SolrTestCaseJ4 {
       // check that the correct number of documents were added
       qr =
           client.query(
-              DEFAULT_COLLECTION,
-              new MapSolrParams(Collections.singletonMap("q", "*:*")),
-              SolrRequest.METHOD.POST);
+              DEFAULT_COLLECTION, new MapSolrParams(Map.of("q", "*:*")), SolrRequest.METHOD.POST);
       assertEquals(limit, qr.getResults().getNumFound());
 
       // clean up
@@ -620,8 +616,7 @@ public abstract class HttpSolrClientTestBase extends SolrTestCaseJ4 {
             "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<response><result name=\"response\" numFound=\"2\" start=\"1\" numFoundExact=\"true\"><doc><str name=\"id\">KEY-"
                 + i
                 + "</str></doc></result></response>");
-        QueryRequest query =
-            new QueryRequest(new MapSolrParams(Collections.singletonMap("id", "KEY-" + i)));
+        QueryRequest query = new QueryRequest(new MapSolrParams(Map.of("id", "KEY-" + i)));
         query.setMethod(SolrRequest.METHOD.GET);
         futures.add(client.requestAsync(query));
       }
@@ -649,7 +644,7 @@ public abstract class HttpSolrClientTestBase extends SolrTestCaseJ4 {
         builder(url, DEFAULT_CONNECTION_TIMEOUT, DEFAULT_CONNECTION_TIMEOUT).withResponseParser(rp);
 
     try (HttpSolrClientBase client = b.build()) {
-      QueryRequest query = new QueryRequest(new MapSolrParams(Collections.singletonMap("id", "1")));
+      QueryRequest query = new QueryRequest(new MapSolrParams(Map.of("id", "1")));
       CompletableFuture<NamedList<Object>> future = client.requestAsync(query, DEFAULT_COLLECTION);
       ExecutionException ee = null;
       try {
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/LBAsyncSolrClientTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/LBAsyncSolrClientTest.java
index 9388b9aa86c..1bc6b662ed1 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/LBAsyncSolrClientTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/LBAsyncSolrClientTest.java
@@ -18,7 +18,6 @@ package org.apache.solr.client.solrj.impl;
 
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
@@ -320,7 +319,7 @@ public class LBAsyncSolrClientTest extends SolrTestCase {
 
     private NamedList<Object> generateResponse(SolrRequest<?> solrRequest) {
       String id = solrRequest.getParams().get("q");
-      return new NamedList<>(Collections.singletonMap("response", id));
+      return new NamedList<>(Map.of("response", id));
     }
   }
 }
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/SendUpdatesToLeadersOverrideTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/SendUpdatesToLeadersOverrideTest.java
index 8c9f8a60245..5d31f782379 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/impl/SendUpdatesToLeadersOverrideTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/impl/SendUpdatesToLeadersOverrideTest.java
@@ -24,7 +24,6 @@ import static org.hamcrest.Matchers.not;
 
 import java.lang.invoke.MethodHandles;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -210,13 +209,12 @@ public class SendUpdatesToLeadersOverrideTest extends SolrCloudTestCase {
   public void testBuilderImplicitBehavior() throws Exception {
     try (CloudSolrClient client =
         new CloudLegacySolrClient.Builder(
-                Collections.singletonList(cluster.getZkServer().getZkAddress()), Optional.empty())
+                List.of(cluster.getZkServer().getZkAddress()), Optional.empty())
             .build()) {
       assertTrue(client.isUpdatesToLeaders());
     }
     try (CloudSolrClient client =
-        new CloudSolrClient.Builder(
-                Collections.singletonList(cluster.getZkServer().getZkAddress()), Optional.empty())
+        new CloudSolrClient.Builder(List.of(cluster.getZkServer().getZkAddress()), Optional.empty())
             .build()) {
       assertTrue(client.isUpdatesToLeaders());
     }
@@ -225,7 +223,7 @@ public class SendUpdatesToLeadersOverrideTest extends SolrCloudTestCase {
   public void testLegacyClientThatDefaultsToLeaders() throws Exception {
     try (CloudSolrClient client =
         new CloudLegacySolrClient.Builder(
-                Collections.singletonList(cluster.getZkServer().getZkAddress()), Optional.empty())
+                List.of(cluster.getZkServer().getZkAddress()), Optional.empty())
             .sendUpdatesOnlyToShardLeaders()
             .build()) {
       checkUpdatesDefaultToLeaders(client);
@@ -236,7 +234,7 @@ public class SendUpdatesToLeadersOverrideTest extends SolrCloudTestCase {
   public void testLegacyClientThatDoesNotDefaultToLeaders() throws Exception {
     try (CloudSolrClient client =
         new CloudLegacySolrClient.Builder(
-                Collections.singletonList(cluster.getZkServer().getZkAddress()), Optional.empty())
+                List.of(cluster.getZkServer().getZkAddress()), Optional.empty())
             .sendUpdatesToAnyReplica()
             .build()) {
       checkUpdatesWithShardsPrefPull(client);
@@ -246,8 +244,7 @@ public class SendUpdatesToLeadersOverrideTest extends SolrCloudTestCase {
 
   public void testHttp2ClientThatDefaultsToLeaders() throws Exception {
     try (CloudSolrClient client =
-        new CloudSolrClient.Builder(
-                Collections.singletonList(cluster.getZkServer().getZkAddress()), Optional.empty())
+        new CloudSolrClient.Builder(List.of(cluster.getZkServer().getZkAddress()), Optional.empty())
             .sendUpdatesOnlyToShardLeaders()
             .build()) {
       checkUpdatesDefaultToLeaders(client);
@@ -257,8 +254,7 @@ public class SendUpdatesToLeadersOverrideTest extends SolrCloudTestCase {
 
   public void testHttp2ClientThatDoesNotDefaultToLeaders() throws Exception {
     try (CloudSolrClient client =
-        new CloudSolrClient.Builder(
-                Collections.singletonList(cluster.getZkServer().getZkAddress()), Optional.empty())
+        new CloudSolrClient.Builder(List.of(cluster.getZkServer().getZkAddress()), Optional.empty())
             .sendUpdatesToAnyReplica()
             .build()) {
       checkUpdatesWithShardsPrefPull(client);
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/request/SchemaTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/request/SchemaTest.java
index 72f6640a3a2..6d5cb25ad48 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/request/SchemaTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/request/SchemaTest.java
@@ -24,7 +24,6 @@ import static org.hamcrest.CoreMatchers.is;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Locale;
@@ -520,14 +519,14 @@ public class SchemaTest extends RestTestBase {
     charFilterAttributes.put("class", "solr.PatternReplaceCharFilterFactory");
     charFilterAttributes.put("replacement", "$1$1");
     charFilterAttributes.put("pattern", "([a-zA-Z])\\\\1+");
-    analyzerDefinition.setCharFilters(Collections.singletonList(charFilterAttributes));
+    analyzerDefinition.setCharFilters(List.of(charFilterAttributes));
     Map<String, Object> tokenizerAttributes = new LinkedHashMap<>();
     tokenizerAttributes.put("class", "solr.WhitespaceTokenizerFactory");
     analyzerDefinition.setTokenizer(tokenizerAttributes);
     Map<String, Object> filterAttributes = new LinkedHashMap<>();
     filterAttributes.put("class", "solr.WordDelimiterGraphFilterFactory");
     filterAttributes.put("preserveOriginal", "0");
-    analyzerDefinition.setFilters(Collections.singletonList(filterAttributes));
+    analyzerDefinition.setFilters(List.of(filterAttributes));
     fieldTypeDefinition.setAnalyzer(analyzerDefinition);
 
     SchemaRequest.AddFieldType addFieldTypeRequest =
@@ -587,7 +586,7 @@ public class SchemaTest extends RestTestBase {
     charFilterAttributes.put("class", "solr.PatternReplaceCharFilterFactory");
     charFilterAttributes.put("replacement", "$1$1");
     charFilterAttributes.put("pattern", "([a-zA-Z])\\\\1+");
-    analyzerDefinition.setCharFilters(Collections.singletonList(charFilterAttributes));
+    analyzerDefinition.setCharFilters(List.of(charFilterAttributes));
     Map<String, Object> tokenizerAttributes = new LinkedHashMap<>();
     tokenizerAttributes.put("class", "solr.WhitespaceTokenizerFactory");
     analyzerDefinition.setTokenizer(tokenizerAttributes);
diff --git a/solr/solrj/src/test/org/apache/solr/client/solrj/response/NestableJsonFacetTest.java b/solr/solrj/src/test/org/apache/solr/client/solrj/response/NestableJsonFacetTest.java
index 9a3d32d3186..e9230c358e0 100644
--- a/solr/solrj/src/test/org/apache/solr/client/solrj/response/NestableJsonFacetTest.java
+++ b/solr/solrj/src/test/org/apache/solr/client/solrj/response/NestableJsonFacetTest.java
@@ -17,7 +17,7 @@
 
 package org.apache.solr.client.solrj.response;
 
-import java.util.Collections;
+import java.util.List;
 import org.apache.solr.SolrTestCaseJ4;
 import org.apache.solr.client.solrj.response.json.NestableJsonFacet;
 import org.apache.solr.common.util.NamedList;
@@ -69,7 +69,7 @@ public class NestableJsonFacetTest extends SolrTestCaseJ4 {
                 });
           }
         };
-    vals.add("buckets", Collections.singletonList(buckets));
+    vals.add("buckets", List.of(buckets));
     list.add("test", vals);
     NestableJsonFacet facet = new NestableJsonFacet(list);
 
@@ -118,7 +118,7 @@ public class NestableJsonFacetTest extends SolrTestCaseJ4 {
                 });
           }
         };
-    vals.add("buckets", Collections.singletonList(buckets));
+    vals.add("buckets", List.of(buckets));
     list.add("test", vals);
     facet = new NestableJsonFacet(list);
     assertEquals(12L, facet.getCount());
diff --git a/solr/solrj/src/test/org/apache/solr/common/cloud/PerReplicaStatesIntegrationTest.java b/solr/solrj/src/test/org/apache/solr/common/cloud/PerReplicaStatesIntegrationTest.java
index 595b2025f3b..e996c111a46 100644
--- a/solr/solrj/src/test/org/apache/solr/common/cloud/PerReplicaStatesIntegrationTest.java
+++ b/solr/solrj/src/test/org/apache/solr/common/cloud/PerReplicaStatesIntegrationTest.java
@@ -21,7 +21,7 @@ import static org.apache.solr.client.solrj.SolrRequest.METHOD.POST;
 import static org.apache.solr.common.params.CollectionAdminParams.PER_REPLICA_STATE;
 
 import java.lang.invoke.MethodHandles;
-import java.util.Collections;
+import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import org.apache.solr.client.solrj.SolrClient;
@@ -245,8 +245,7 @@ public class PerReplicaStatesIntegrationTest extends SolrCloudTestCase {
               DocCollection.getCollectionPath(COLL), cluster.getZkClient(), null);
       log.info("prs1 : {}", prs1);
 
-      CollectionAdminRequest.modifyCollection(
-              COLL, Collections.singletonMap(PER_REPLICA_STATE, "false"))
+      CollectionAdminRequest.modifyCollection(COLL, Map.of(PER_REPLICA_STATE, "false"))
           .process(cluster.getSolrClient());
       waitForState(
           "Waiting for PRS property",
@@ -255,8 +254,7 @@ public class PerReplicaStatesIntegrationTest extends SolrCloudTestCase {
           TimeUnit.SECONDS,
           collectionState ->
               "false".equals(collectionState.getProperties().get(PER_REPLICA_STATE)));
-      CollectionAdminRequest.modifyCollection(
-              COLL, Collections.singletonMap(PER_REPLICA_STATE, "true"))
+      CollectionAdminRequest.modifyCollection(COLL, Map.of(PER_REPLICA_STATE, "true"))
           .process(cluster.getSolrClient());
       waitForState(
           "Waiting for PRS property",
diff --git a/solr/solrj/src/test/org/apache/solr/common/util/TestJsonRecordReader.java b/solr/solrj/src/test/org/apache/solr/common/util/TestJsonRecordReader.java
index 6c2280c273c..026c7e6b5ce 100644
--- a/solr/solrj/src/test/org/apache/solr/common/util/TestJsonRecordReader.java
+++ b/solr/solrj/src/test/org/apache/solr/common/util/TestJsonRecordReader.java
@@ -20,7 +20,6 @@ import java.io.IOException;
 import java.io.StringReader;
 import java.lang.ref.WeakReference;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicReference;
@@ -178,7 +177,7 @@ public class TestJsonRecordReader extends SolrTestCaseJ4 {
     JsonRecordReader streamer;
     List<Map<String, Object>> records;
 
-    streamer = JsonRecordReader.getInst("/b", Collections.singletonList("/b/**"));
+    streamer = JsonRecordReader.getInst("/b", List.of("/b/**"));
     records = streamer.getAllRecords(new StringReader(json));
     assertEquals(3, records.size());
     assertEquals("records " + records, 3l, ((Map) records.get(0)).get("t"));
@@ -190,7 +189,7 @@ public class TestJsonRecordReader extends SolrTestCaseJ4 {
       assertNotNull("records " + records, record.get("d"));
     }
 
-    streamer = JsonRecordReader.getInst("/", Collections.singletonList("/**"));
+    streamer = JsonRecordReader.getInst("/", List.of("/**"));
     records = streamer.getAllRecords(new StringReader(json));
     assertEquals(1, records.size());
     assertEquals(3, ((List) ((Map) records.get(0)).get("c")).size());
@@ -222,7 +221,7 @@ public class TestJsonRecordReader extends SolrTestCaseJ4 {
     JsonRecordReader streamer;
     List<Map<String, Object>> records;
 
-    streamer = JsonRecordReader.getInst("/exams", Collections.singletonList("/**"));
+    streamer = JsonRecordReader.getInst("/exams", List.of("/**"));
     records = streamer.getAllRecords(new StringReader(json));
     assertEquals(2, records.size());
     for (Map<String, Object> record : records) {
@@ -232,7 +231,7 @@ public class TestJsonRecordReader extends SolrTestCaseJ4 {
       assertTrue(record.containsKey("marks"));
     }
 
-    streamer = JsonRecordReader.getInst("/exams", Collections.singletonList("$FQN:/**"));
+    streamer = JsonRecordReader.getInst("/exams", List.of("$FQN:/**"));
     records = streamer.getAllRecords(new StringReader(json));
     assertEquals(2, records.size());
     for (Map<String, Object> record : records) {
@@ -242,7 +241,7 @@ public class TestJsonRecordReader extends SolrTestCaseJ4 {
       assertTrue(record.containsKey("exams.marks"));
     }
 
-    streamer = JsonRecordReader.getInst("/", Collections.singletonList("txt:/**"));
+    streamer = JsonRecordReader.getInst("/", List.of("txt:/**"));
     records = streamer.getAllRecords(new StringReader(json));
     assertEquals(1, records.size());
     assertEquals(9, ((List) records.get(0).get("txt")).size());
@@ -307,7 +306,7 @@ public class TestJsonRecordReader extends SolrTestCaseJ4 {
     JsonRecordReader streamer;
     List<Map<String, Object>> records;
 
-    streamer = JsonRecordReader.getInst("/a/b", Collections.singletonList("title_s:/a/b/title"));
+    streamer = JsonRecordReader.getInst("/a/b", List.of("title_s:/a/b/title"));
     records = streamer.getAllRecords(new StringReader(json));
     assertEquals(2, records.size());
   }
@@ -335,7 +334,7 @@ public class TestJsonRecordReader extends SolrTestCaseJ4 {
     JsonRecordReader streamer;
     List<Map<String, Object>> records;
 
-    streamer = JsonRecordReader.getInst("/exams", Collections.singletonList("/**"));
+    streamer = JsonRecordReader.getInst("/exams", List.of("/**"));
     records = streamer.getAllRecords(new StringReader(json));
     assertEquals(4, records.size());
 
@@ -352,7 +351,7 @@ public class TestJsonRecordReader extends SolrTestCaseJ4 {
     List<Map<String, Object>> records;
 
     final AtomicReference<WeakReference<String>> ref = new AtomicReference<>();
-    streamer = JsonRecordReader.getInst("/", Collections.singletonList("$FQN:/**"));
+    streamer = JsonRecordReader.getInst("/", List.of("$FQN:/**"));
     streamer.streamRecords(
         new StringReader(json),
         (record, path) -> {
@@ -706,7 +705,7 @@ public class TestJsonRecordReader extends SolrTestCaseJ4 {
             + "               }}]}}]";
 
     RecordingJSONParser parser = new RecordingJSONParser(new StringReader(json));
-    JsonRecordReader recordReader = JsonRecordReader.getInst("/", Collections.singletonList("/**"));
+    JsonRecordReader recordReader = JsonRecordReader.getInst("/", List.of("/**"));
     try {
       recordReader.streamRecords(parser, (record, path) -> {}); /*don't care*/
     } catch (RuntimeException e) {
diff --git a/solr/solrj/src/test/org/apache/solr/common/util/TestPathTrie.java b/solr/solrj/src/test/org/apache/solr/common/util/TestPathTrie.java
index 1fbe1bcad14..08b77833ce6 100644
--- a/solr/solrj/src/test/org/apache/solr/common/util/TestPathTrie.java
+++ b/solr/solrj/src/test/org/apache/solr/common/util/TestPathTrie.java
@@ -17,7 +17,6 @@
 
 package org.apache.solr.common.util;
 
-import static java.util.Collections.singletonMap;
 import static org.apache.solr.api.ApiBag.HANDLER_NAME;
 
 import java.util.HashMap;
@@ -33,7 +32,7 @@ public class TestPathTrie extends SolrTestCaseJ4 {
     pathTrie.insert("/", Map.of(), "R");
     pathTrie.insert("/aa", Map.of(), "d");
     pathTrie.insert("/aa/bb/{cc}/dd", Map.of(), "a");
-    pathTrie.insert("/$handlerName/{cc}/dd", singletonMap(HANDLER_NAME, "test"), "test");
+    pathTrie.insert("/$handlerName/{cc}/dd", Map.of(HANDLER_NAME, "test"), "test");
     pathTrie.insert("/aa/bb/{cc}/{xx}", Map.of(), "b");
     pathTrie.insert("/aa/bb", Map.of(), "c");
 
diff --git a/solr/test-framework/src/java/org/apache/solr/client/solrj/apache/HttpSolrClient.java b/solr/test-framework/src/java/org/apache/solr/client/solrj/apache/HttpSolrClient.java
index e2a849cd4cf..04f58e00a61 100644
--- a/solr/test-framework/src/java/org/apache/solr/client/solrj/apache/HttpSolrClient.java
+++ b/solr/test-framework/src/java/org/apache/solr/client/solrj/apache/HttpSolrClient.java
@@ -33,7 +33,6 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Base64;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
@@ -105,7 +104,7 @@ public class HttpSolrClient extends SolrClient {
   private static final Charset FALLBACK_CHARSET = StandardCharsets.UTF_8;
   private static final long serialVersionUID = -946812319974801896L;
 
-  protected static final Set<Integer> UNMATCHED_ACCEPTED_ERROR_CODES = Collections.singleton(429);
+  protected static final Set<Integer> UNMATCHED_ACCEPTED_ERROR_CODES = Set.of(429);
 
   static final String USER_AGENT =
       "Solr[" + MethodHandles.lookup().lookupClass().getName() + "] " + SolrVersion.LATEST_STRING;
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
index 7f452aa4e61..d4b81d99ea6 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/AbstractFullDistribZkTestBase.java
@@ -295,7 +295,7 @@ public abstract class AbstractFullDistribZkTestBase extends BaseDistributedSearc
               .getZkClient()
               .create(
                   ZkStateReader.CLUSTER_PROPS,
-                  Utils.toJSON(Collections.singletonMap(URL_SCHEME, HTTPS)),
+                  Utils.toJSON(Map.of(URL_SCHEME, HTTPS)),
                   CreateMode.PERSISTENT);
         } catch (KeeperException.NodeExistsException e) {
           ZkNodeProps props =
@@ -2440,7 +2440,7 @@ public abstract class AbstractFullDistribZkTestBase extends BaseDistributedSearc
       int connectionTimeoutMillis,
       int socketTimeoutMillis) {
     RandomizingCloudSolrClientBuilder builder =
-        new RandomizingCloudSolrClientBuilder(Collections.singletonList(zkHost), Optional.empty());
+        new RandomizingCloudSolrClientBuilder(List.of(zkHost), Optional.empty());
     if (shardLeadersOnly) {
       builder.sendUpdatesOnlyToShardLeaders();
     } else {
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/MiniSolrCloudCluster.java b/solr/test-framework/src/java/org/apache/solr/cloud/MiniSolrCloudCluster.java
index f2bbfb87f9b..62470e6913d 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/MiniSolrCloudCluster.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/MiniSolrCloudCluster.java
@@ -699,8 +699,7 @@ public class MiniSolrCloudCluster implements SolrBackend {
         collectionName,
         k -> {
           CloudSolrClient solrClient =
-              new CloudLegacySolrClient.Builder(
-                      Collections.singletonList(zkServer.getZkAddress()), Optional.empty())
+              new CloudLegacySolrClient.Builder(List.of(zkServer.getZkAddress()), Optional.empty())
                   .withDefaultCollection(collectionName)
                   .withSocketTimeout(90000)
                   .withConnectionTimeout(15000)
@@ -721,7 +720,7 @@ public class MiniSolrCloudCluster implements SolrBackend {
   @Override // SolrBackend
   public CloudSolrClient newSolrClient(String collection) {
     return new CloudLegacySolrClient.Builder(
-            Collections.singletonList(getZkServer().getZkAddress()), Optional.empty())
+            List.of(getZkServer().getZkAddress()), Optional.empty())
         .withSocketTimeout(90000, TimeUnit.MILLISECONDS)
         .withConnectionTimeout(15000, TimeUnit.MILLISECONDS)
         .withDefaultCollection(collection)
diff --git a/solr/test-framework/src/java/org/apache/solr/cloud/SolrCloudAuthTestCase.java b/solr/test-framework/src/java/org/apache/solr/cloud/SolrCloudAuthTestCase.java
index afbe6becb8c..8ee2e5032c1 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/SolrCloudAuthTestCase.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/SolrCloudAuthTestCase.java
@@ -28,7 +28,6 @@ import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Base64;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -66,7 +65,7 @@ public class SolrCloudAuthTestCase extends SolrCloudTestCase {
   private static final List<String> AUTH_METRICS_METER_KEYS =
       Arrays.asList("solr_authentication_errors", "count");
   private static final List<String> AUTH_METRICS_TIMER_KEYS =
-      Collections.singletonList("solr_authentication_request_times_nanoseconds");
+      List.of("solr_authentication_request_times_nanoseconds");
 
   @SuppressWarnings({"rawtypes"})
   public static final Predicate NOT_NULL_PREDICATE = o -> o != null;
diff --git a/solr/test-framework/src/java/org/apache/solr/handler/component/DummyCustomParamSpellChecker.java b/solr/test-framework/src/java/org/apache/solr/handler/component/DummyCustomParamSpellChecker.java
index aa647814aa5..4c36106fd42 100644
--- a/solr/test-framework/src/java/org/apache/solr/handler/component/DummyCustomParamSpellChecker.java
+++ b/solr/test-framework/src/java/org/apache/solr/handler/component/DummyCustomParamSpellChecker.java
@@ -54,7 +54,7 @@ public class DummyCustomParamSpellChecker extends SolrSpellChecker {
     int i = 0;
     for (String name : lst) {
       String value = options.customParams.get(name);
-      result.add(new Token(name, i, i + 1), Collections.singletonList(value));
+      result.add(new Token(name, i, i + 1), List.of(value));
       i += 2;
     }
     return result;
diff --git a/solr/test-framework/src/java/org/apache/solr/schema/SortableBinaryField.java b/solr/test-framework/src/java/org/apache/solr/schema/SortableBinaryField.java
index 28edf725d14..430fa658aa9 100644
--- a/solr/test-framework/src/java/org/apache/solr/schema/SortableBinaryField.java
+++ b/solr/test-framework/src/java/org/apache/solr/schema/SortableBinaryField.java
@@ -18,7 +18,6 @@ package org.apache.solr.schema;
 
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import org.apache.lucene.document.SortedDocValuesField;
 import org.apache.lucene.document.SortedSetDocValuesField;
@@ -60,7 +59,7 @@ public class SortableBinaryField extends BinaryField {
       }
       return fields;
     } else {
-      return Collections.singletonList(createField(field, value));
+      return List.of(createField(field, value));
     }
   }
 
diff --git a/solr/test-framework/src/java/org/apache/solr/util/SecurityJson.java b/solr/test-framework/src/java/org/apache/solr/util/SecurityJson.java
index 2b73b8fde19..3ee0e1b6662 100644
--- a/solr/test-framework/src/java/org/apache/solr/util/SecurityJson.java
+++ b/solr/test-framework/src/java/org/apache/solr/util/SecurityJson.java
@@ -16,10 +16,9 @@
  */
 package org.apache.solr.util;
 
-import static java.util.Collections.singletonList;
-import static java.util.Collections.singletonMap;
 import static org.apache.solr.security.Sha256AuthenticationProvider.getSaltedHashedValue;
 
+import java.util.List;
 import java.util.Map;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.security.BasicAuthPlugin;
@@ -48,9 +47,9 @@ public final class SecurityJson {
                   "class",
                   RuleBasedAuthorizationPlugin.class.getName(),
                   "user-role",
-                  singletonMap(USER, "admin"),
+                  Map.of(USER, "admin"),
                   "permissions",
-                  singletonList(Map.of("name", "all", "role", "admin"))),
+                  List.of(Map.of("name", "all", "role", "admin"))),
               "authentication",
               Map.of(
                   "class",
@@ -58,5 +57,5 @@ public final class SecurityJson {
                   "blockUnknown",
                   true,
                   "credentials",
-                  singletonMap(USER, getSaltedHashedValue(PASS)))));
+                  Map.of(USER, getSaltedHashedValue(PASS)))));
 }