Avoid resizing of fixed-size HashSet/LinkedHashSet variants
Add helpers to CollectionUtils for building HashSets and LinkedHashSets that can hold an expected number of elements without needing to resize/rehash. Closes gh-32291
This commit is contained in:
committed by
Sam Brannen
parent
6383a0d7ca
commit
e1a32d4ba9
@@ -17,11 +17,11 @@
|
||||
package org.springframework.cache.interceptor;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
/**
|
||||
* Base class for cache operations.
|
||||
@@ -158,7 +158,7 @@ public abstract class CacheOperation implements BasicOperation {
|
||||
}
|
||||
|
||||
public void setCacheNames(String... cacheNames) {
|
||||
this.cacheNames = new LinkedHashSet<>(cacheNames.length);
|
||||
this.cacheNames = CollectionUtils.newLinkedHashSet(cacheNames.length);
|
||||
for (String cacheName : cacheNames) {
|
||||
Assert.hasText(cacheName, "Cache name must be non-empty if specified");
|
||||
this.cacheNames.add(cacheName);
|
||||
|
||||
@@ -27,6 +27,7 @@ import org.springframework.beans.factory.InitializingBean;
|
||||
import org.springframework.cache.Cache;
|
||||
import org.springframework.cache.CacheManager;
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
/**
|
||||
* Abstract base class implementing the common {@link CacheManager} methods.
|
||||
@@ -64,7 +65,7 @@ public abstract class AbstractCacheManager implements CacheManager, Initializing
|
||||
synchronized (this.cacheMap) {
|
||||
this.cacheNames = Collections.emptySet();
|
||||
this.cacheMap.clear();
|
||||
Set<String> cacheNames = new LinkedHashSet<>(caches.size());
|
||||
Set<String> cacheNames = CollectionUtils.newLinkedHashSet(caches.size());
|
||||
for (Cache cache : caches) {
|
||||
String name = cache.getName();
|
||||
this.cacheMap.put(name, decorateCache(cache));
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
package org.springframework.context.annotation;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.Set;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
@@ -38,6 +37,7 @@ import org.springframework.core.type.AnnotatedTypeMetadata;
|
||||
import org.springframework.core.type.AnnotationMetadata;
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.util.ClassUtils;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
|
||||
/**
|
||||
* Utility class that allows for convenient registration of common
|
||||
@@ -154,7 +154,7 @@ public abstract class AnnotationConfigUtils {
|
||||
}
|
||||
}
|
||||
|
||||
Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<>(8);
|
||||
Set<BeanDefinitionHolder> beanDefs = CollectionUtils.newLinkedHashSet(6);
|
||||
|
||||
if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {
|
||||
RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);
|
||||
|
||||
@@ -71,6 +71,7 @@ import org.springframework.jndi.support.SimpleJndiBeanFactory;
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.ClassUtils;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.ObjectUtils;
|
||||
import org.springframework.util.ReflectionUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
@@ -148,7 +149,7 @@ public class CommonAnnotationBeanPostProcessor extends InitDestroyAnnotationBean
|
||||
private static final boolean jndiPresent = ClassUtils.isPresent(
|
||||
"javax.naming.InitialContext", CommonAnnotationBeanPostProcessor.class.getClassLoader());
|
||||
|
||||
private static final Set<Class<? extends Annotation>> resourceAnnotationTypes = new LinkedHashSet<>(4);
|
||||
private static final Set<Class<? extends Annotation>> resourceAnnotationTypes = CollectionUtils.newLinkedHashSet(3);
|
||||
|
||||
@Nullable
|
||||
private static final Class<? extends Annotation> jakartaResourceType;
|
||||
|
||||
@@ -437,7 +437,7 @@ class ConfigurationClassParser {
|
||||
Set<MethodMetadata> asmMethods = asm.getAnnotatedMethods(Bean.class.getName());
|
||||
if (asmMethods.size() >= beanMethods.size()) {
|
||||
Set<MethodMetadata> candidateMethods = new LinkedHashSet<>(beanMethods);
|
||||
Set<MethodMetadata> selectedMethods = new LinkedHashSet<>(asmMethods.size());
|
||||
Set<MethodMetadata> selectedMethods = CollectionUtils.newLinkedHashSet(asmMethods.size());
|
||||
for (MethodMetadata asmMethod : asmMethods) {
|
||||
for (Iterator<MethodMetadata> it = candidateMethods.iterator(); it.hasNext();) {
|
||||
MethodMetadata beanMethod = it.next();
|
||||
|
||||
@@ -410,7 +410,7 @@ public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPo
|
||||
this.resourceLoader, this.componentScanBeanNameGenerator, registry);
|
||||
|
||||
Set<BeanDefinitionHolder> candidates = new LinkedHashSet<>(configCandidates);
|
||||
Set<ConfigurationClass> alreadyParsed = new HashSet<>(configCandidates.size());
|
||||
Set<ConfigurationClass> alreadyParsed = CollectionUtils.newHashSet(configCandidates.size());
|
||||
do {
|
||||
StartupStep processConfig = this.applicationStartup.start("spring.context.config-classes.parse");
|
||||
parser.parse(candidates);
|
||||
@@ -433,7 +433,7 @@ public class ConfigurationClassPostProcessor implements BeanDefinitionRegistryPo
|
||||
if (registry.getBeanDefinitionCount() > candidateNames.length) {
|
||||
String[] newCandidateNames = registry.getBeanDefinitionNames();
|
||||
Set<String> oldCandidateNames = Set.of(candidateNames);
|
||||
Set<String> alreadyParsedClasses = new HashSet<>();
|
||||
Set<String> alreadyParsedClasses = CollectionUtils.newHashSet(alreadyParsed.size());
|
||||
for (ConfigurationClass configurationClass : alreadyParsed) {
|
||||
alreadyParsedClasses.add(configurationClass.getMetadata().getClassName());
|
||||
}
|
||||
|
||||
@@ -21,7 +21,6 @@ import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
@@ -883,7 +882,7 @@ public class MBeanExporter extends MBeanRegistrationSupport implements MBeanExpo
|
||||
*/
|
||||
private void autodetect(Map<String, Object> beans, AutodetectCallback callback) {
|
||||
Assert.state(this.beanFactory != null, "No BeanFactory set");
|
||||
Set<String> beanNames = new LinkedHashSet<>(this.beanFactory.getBeanDefinitionCount());
|
||||
Set<String> beanNames = CollectionUtils.newLinkedHashSet(this.beanFactory.getBeanDefinitionCount());
|
||||
Collections.addAll(beanNames, this.beanFactory.getBeanDefinitionNames());
|
||||
if (this.beanFactory instanceof ConfigurableBeanFactory cbf) {
|
||||
Collections.addAll(beanNames, cbf.getSingletonNames());
|
||||
|
||||
@@ -18,7 +18,6 @@ package org.springframework.scheduling.annotation;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.function.Supplier;
|
||||
@@ -35,6 +34,7 @@ import org.springframework.beans.factory.BeanFactoryAware;
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.util.ClassUtils;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
import org.springframework.util.function.SingletonSupplier;
|
||||
|
||||
/**
|
||||
@@ -94,7 +94,7 @@ public class AsyncAnnotationAdvisor extends AbstractPointcutAdvisor implements B
|
||||
public AsyncAnnotationAdvisor(
|
||||
@Nullable Supplier<Executor> executor, @Nullable Supplier<AsyncUncaughtExceptionHandler> exceptionHandler) {
|
||||
|
||||
Set<Class<? extends Annotation>> asyncAnnotationTypes = new LinkedHashSet<>(2);
|
||||
Set<Class<? extends Annotation>> asyncAnnotationTypes = CollectionUtils.newLinkedHashSet(2);
|
||||
asyncAnnotationTypes.add(Async.class);
|
||||
|
||||
ClassLoader classLoader = AsyncAnnotationAdvisor.class.getClassLoader();
|
||||
|
||||
Reference in New Issue
Block a user