Browse Source

Initialize pre-filled HashMaps with large enough capacity

Empty Maps are preferably initialized without capacity (not initializing them at all or lazily initializing with default capacity when needed).

Issue: SPR-17105
pull/1910/head
Juergen Hoeller 8 years ago
parent
commit
4a147d26fc
  1. 2
      spring-beans/src/main/java/org/springframework/beans/factory/config/ConstructorArgumentValues.java
  2. 2
      spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanDefinition.java
  3. 2
      spring-context/src/main/java/org/springframework/cache/interceptor/CacheAspectSupport.java
  4. 10
      spring-context/src/main/java/org/springframework/scheduling/concurrent/ConcurrentTaskExecutor.java
  5. 4
      spring-context/src/main/java/org/springframework/validation/AbstractBindingResult.java
  6. 2
      spring-core/src/main/java/org/springframework/core/AttributeAccessorSupport.java
  7. 4
      spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/AbstractJdbcInsert.java
  8. 2
      spring-messaging/src/main/java/org/springframework/messaging/MessageHeaders.java
  9. 4
      spring-messaging/src/main/java/org/springframework/messaging/simp/broker/AbstractSubscriptionRegistry.java
  10. 2
      spring-messaging/src/main/java/org/springframework/messaging/simp/config/AbstractMessageBrokerConfiguration.java
  11. 2
      spring-messaging/src/main/java/org/springframework/messaging/simp/user/MultiServerUserRegistry.java
  12. 2
      spring-web/src/main/java/org/springframework/http/HttpHeaders.java
  13. 4
      spring-web/src/main/java/org/springframework/http/HttpMethod.java
  14. 2
      spring-web/src/main/java/org/springframework/http/server/DefaultPathContainer.java
  15. 14
      spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java
  16. 2
      spring-web/src/main/java/org/springframework/web/util/HtmlCharacterEntityReferences.java
  17. 2
      spring-web/src/main/java/org/springframework/web/util/OpaqueUriComponents.java
  18. 2
      spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java
  19. 15
      spring-webflux/src/main/java/org/springframework/web/reactive/socket/adapter/NettyWebSocketSessionSupport.java

2
spring-beans/src/main/java/org/springframework/beans/factory/config/ConstructorArgumentValues.java

@ -43,7 +43,7 @@ import org.springframework.util.ObjectUtils;
*/ */
public class ConstructorArgumentValues { public class ConstructorArgumentValues {
private final Map<Integer, ValueHolder> indexedArgumentValues = new LinkedHashMap<>(0); private final Map<Integer, ValueHolder> indexedArgumentValues = new LinkedHashMap<>();
private final List<ValueHolder> genericArgumentValues = new ArrayList<>(); private final List<ValueHolder> genericArgumentValues = new ArrayList<>();

2
spring-beans/src/main/java/org/springframework/beans/factory/support/AbstractBeanDefinition.java

@ -158,7 +158,7 @@ public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccess
private boolean primary = false; private boolean primary = false;
private final Map<String, AutowireCandidateQualifier> qualifiers = new LinkedHashMap<>(0); private final Map<String, AutowireCandidateQualifier> qualifiers = new LinkedHashMap<>();
@Nullable @Nullable
private Supplier<?> instanceSupplier; private Supplier<?> instanceSupplier;

2
spring-context/src/main/java/org/springframework/cache/interceptor/CacheAspectSupport.java vendored

@ -410,7 +410,7 @@ public abstract class CacheAspectSupport extends AbstractCacheInvoker
Object cacheValue; Object cacheValue;
Object returnValue; Object returnValue;
if (cacheHit != null && cachePutRequests.isEmpty() && !hasCachePut(contexts)) { if (cacheHit != null && !hasCachePut(contexts)) {
// If there are no put requests, just use the cache hit // If there are no put requests, just use the cache hit
cacheValue = cacheHit.get(); cacheValue = cacheHit.get();
returnValue = wrapCacheValue(method, cacheValue); returnValue = wrapCacheValue(method, cacheValue);

10
spring-context/src/main/java/org/springframework/scheduling/concurrent/ConcurrentTaskExecutor.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2017 the original author or authors. * Copyright 2002-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -230,17 +230,21 @@ public class ConcurrentTaskExecutor implements AsyncListenableTaskExecutor, Sche
protected static class ManagedTaskBuilder { protected static class ManagedTaskBuilder {
public static Runnable buildManagedTask(Runnable task, String identityName) { public static Runnable buildManagedTask(Runnable task, String identityName) {
Map<String, String> properties = new HashMap<>(2); Map<String, String> properties;
if (task instanceof SchedulingAwareRunnable) { if (task instanceof SchedulingAwareRunnable) {
properties = new HashMap<>(4);
properties.put(ManagedTask.LONGRUNNING_HINT, properties.put(ManagedTask.LONGRUNNING_HINT,
Boolean.toString(((SchedulingAwareRunnable) task).isLongLived())); Boolean.toString(((SchedulingAwareRunnable) task).isLongLived()));
} }
else {
properties = new HashMap<>(2);
}
properties.put(ManagedTask.IDENTITY_NAME, identityName); properties.put(ManagedTask.IDENTITY_NAME, identityName);
return ManagedExecutors.managedTask(task, properties, null); return ManagedExecutors.managedTask(task, properties, null);
} }
public static <T> Callable<T> buildManagedTask(Callable<T> task, String identityName) { public static <T> Callable<T> buildManagedTask(Callable<T> task, String identityName) {
Map<String, String> properties = new HashMap<>(1); Map<String, String> properties = new HashMap<>(2);
properties.put(ManagedTask.IDENTITY_NAME, identityName); properties.put(ManagedTask.IDENTITY_NAME, identityName);
return ManagedExecutors.managedTask(task, properties, null); return ManagedExecutors.managedTask(task, properties, null);
} }

4
spring-context/src/main/java/org/springframework/validation/AbstractBindingResult.java

@ -52,9 +52,9 @@ public abstract class AbstractBindingResult extends AbstractErrors implements Bi
private final List<ObjectError> errors = new LinkedList<>(); private final List<ObjectError> errors = new LinkedList<>();
private final Map<String, Class<?>> fieldTypes = new HashMap<>(0); private final Map<String, Class<?>> fieldTypes = new HashMap<>();
private final Map<String, Object> fieldValues = new HashMap<>(0); private final Map<String, Object> fieldValues = new HashMap<>();
private final Set<String> suppressedFields = new HashSet<>(); private final Set<String> suppressedFields = new HashSet<>();

2
spring-core/src/main/java/org/springframework/core/AttributeAccessorSupport.java

@ -38,7 +38,7 @@ import org.springframework.util.StringUtils;
public abstract class AttributeAccessorSupport implements AttributeAccessor, Serializable { public abstract class AttributeAccessorSupport implements AttributeAccessor, Serializable {
/** Map with String keys and Object values. */ /** Map with String keys and Object values. */
private final Map<String, Object> attributes = new LinkedHashMap<>(0); private final Map<String, Object> attributes = new LinkedHashMap<>();
@Override @Override

4
spring-jdbc/src/main/java/org/springframework/jdbc/core/simple/AbstractJdbcInsert.java

@ -465,7 +465,7 @@ public abstract class AbstractJdbcInsert {
if (keyQuery.toUpperCase().startsWith("RETURNING")) { if (keyQuery.toUpperCase().startsWith("RETURNING")) {
Long key = getJdbcTemplate().queryForObject( Long key = getJdbcTemplate().queryForObject(
getInsertString() + " " + keyQuery, values.toArray(), Long.class); getInsertString() + " " + keyQuery, values.toArray(), Long.class);
Map<String, Object> keys = new HashMap<>(1); Map<String, Object> keys = new HashMap<>(2);
keys.put(getGeneratedKeyNames()[0], key); keys.put(getGeneratedKeyNames()[0], key);
keyHolder.getKeyList().add(keys); keyHolder.getKeyList().add(keys);
} }
@ -484,7 +484,7 @@ public abstract class AbstractJdbcInsert {
//Get the key //Get the key
Statement keyStmt = null; Statement keyStmt = null;
ResultSet rs = null; ResultSet rs = null;
Map<String, Object> keys = new HashMap<>(1); Map<String, Object> keys = new HashMap<>(2);
try { try {
keyStmt = con.createStatement(); keyStmt = con.createStatement();
rs = keyStmt.executeQuery(keyQuery); rs = keyStmt.executeQuery(keyQuery);

2
spring-messaging/src/main/java/org/springframework/messaging/MessageHeaders.java

@ -164,7 +164,7 @@ public class MessageHeaders implements Map<String, Object>, Serializable {
* @param keysToIgnore the keys of the entries to ignore * @param keysToIgnore the keys of the entries to ignore
*/ */
private MessageHeaders(MessageHeaders original, Set<String> keysToIgnore) { private MessageHeaders(MessageHeaders original, Set<String> keysToIgnore) {
this.headers = new HashMap<>(original.headers.size() - keysToIgnore.size()); this.headers = new HashMap<>(original.headers.size());
original.headers.forEach((key, value) -> { original.headers.forEach((key, value) -> {
if (!keysToIgnore.contains(key)) { if (!keysToIgnore.contains(key)) {
this.headers.put(key, value); this.headers.put(key, value);

4
spring-messaging/src/main/java/org/springframework/messaging/simp/broker/AbstractSubscriptionRegistry.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2017 the original author or authors. * Copyright 2002-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -38,7 +38,7 @@ import org.springframework.util.MultiValueMap;
public abstract class AbstractSubscriptionRegistry implements SubscriptionRegistry { public abstract class AbstractSubscriptionRegistry implements SubscriptionRegistry {
private static final MultiValueMap<String, String> EMPTY_MAP = private static final MultiValueMap<String, String> EMPTY_MAP =
CollectionUtils.unmodifiableMultiValueMap(new LinkedMultiValueMap<>(0)); CollectionUtils.unmodifiableMultiValueMap(new LinkedMultiValueMap<>());
protected final Log logger = SimpLogging.forLogName(getClass()); protected final Log logger = SimpLogging.forLogName(getClass());

2
spring-messaging/src/main/java/org/springframework/messaging/simp/config/AbstractMessageBrokerConfiguration.java

@ -317,7 +317,7 @@ public abstract class AbstractMessageBrokerConfiguration implements ApplicationC
if (handler == null) { if (handler == null) {
return null; return null;
} }
Map<String, MessageHandler> subscriptions = new HashMap<>(1); Map<String, MessageHandler> subscriptions = new HashMap<>(4);
String destination = getBrokerRegistry().getUserDestinationBroadcast(); String destination = getBrokerRegistry().getUserDestinationBroadcast();
if (destination != null) { if (destination != null) {
subscriptions.put(destination, userDestinationMessageHandler()); subscriptions.put(destination, userDestinationMessageHandler());

2
spring-messaging/src/main/java/org/springframework/messaging/simp/user/MultiServerUserRegistry.java

@ -545,7 +545,7 @@ public class MultiServerUserRegistry implements SimpUserRegistry, SmartApplicati
private class SessionLookup { private class SessionLookup {
public Map<String, SimpSession> findSessions(String userName) { public Map<String, SimpSession> findSessions(String userName) {
Map<String, SimpSession> map = new HashMap<>(1); Map<String, SimpSession> map = new HashMap<>(4);
SimpUser user = localRegistry.getUser(userName); SimpUser user = localRegistry.getUser(userName);
if (user != null) { if (user != null) {
for (SimpSession session : user.getSessions()) { for (SimpSession session : user.getSessions()) {

2
spring-web/src/main/java/org/springframework/http/HttpHeaders.java

@ -78,7 +78,7 @@ public class HttpHeaders implements MultiValueMap<String, String>, Serializable
/** /**
* The empty {@code HttpHeaders} instance (immutable). * The empty {@code HttpHeaders} instance (immutable).
*/ */
public static final HttpHeaders EMPTY = new HttpHeaders(new LinkedHashMap<>(0), true); public static final HttpHeaders EMPTY = new HttpHeaders(new LinkedHashMap<>(), true);
/** /**
* The HTTP {@code Accept} header field name. * The HTTP {@code Accept} header field name.
* @see <a href="http://tools.ietf.org/html/rfc7231#section-5.3.2">Section 5.3.2 of RFC 7231</a> * @see <a href="http://tools.ietf.org/html/rfc7231#section-5.3.2">Section 5.3.2 of RFC 7231</a>

4
spring-web/src/main/java/org/springframework/http/HttpMethod.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2016 the original author or authors. * Copyright 2002-2018 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -35,7 +35,7 @@ public enum HttpMethod {
GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE; GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE;
private static final Map<String, HttpMethod> mappings = new HashMap<>(8); private static final Map<String, HttpMethod> mappings = new HashMap<>(16);
static { static {
for (HttpMethod httpMethod : values()) { for (HttpMethod httpMethod : values()) {

2
spring-web/src/main/java/org/springframework/http/server/DefaultPathContainer.java

@ -38,7 +38,7 @@ import org.springframework.util.StringUtils;
*/ */
final class DefaultPathContainer implements PathContainer { final class DefaultPathContainer implements PathContainer {
private static final MultiValueMap<String, String> EMPTY_MAP = new LinkedMultiValueMap<>(0); private static final MultiValueMap<String, String> EMPTY_MAP = new LinkedMultiValueMap<>();
private static final PathContainer EMPTY_PATH = new DefaultPathContainer("", Collections.emptyList()); private static final PathContainer EMPTY_PATH = new DefaultPathContainer("", Collections.emptyList());

14
spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java

@ -55,54 +55,46 @@ final class HierarchicalUriComponents extends UriComponents {
private static final String PATH_DELIMITER_STRING = "/"; private static final String PATH_DELIMITER_STRING = "/";
private static final MultiValueMap<String, String> EMPTY_QUERY_PARAMS =
CollectionUtils.unmodifiableMultiValueMap(new LinkedMultiValueMap<>());
/** /**
* Represents an empty path. * Represents an empty path.
*/ */
static final PathComponent NULL_PATH_COMPONENT = new PathComponent() { static final PathComponent NULL_PATH_COMPONENT = new PathComponent() {
@Override @Override
public String getPath() { public String getPath() {
return ""; return "";
} }
@Override @Override
public List<String> getPathSegments() { public List<String> getPathSegments() {
return Collections.emptyList(); return Collections.emptyList();
} }
@Override @Override
public PathComponent encode(BiFunction<String, Type, String> encoder) { public PathComponent encode(BiFunction<String, Type, String> encoder) {
return this; return this;
} }
@Override @Override
public void verify() { public void verify() {
} }
@Override @Override
public PathComponent expand(UriTemplateVariables uriVariables, @Nullable UnaryOperator<String> encoder) { public PathComponent expand(UriTemplateVariables uriVariables, @Nullable UnaryOperator<String> encoder) {
return this; return this;
} }
@Override @Override
public void copyToUriComponentsBuilder(UriComponentsBuilder builder) { public void copyToUriComponentsBuilder(UriComponentsBuilder builder) {
} }
@Override @Override
public boolean equals(Object other) { public boolean equals(Object other) {
return (this == other); return (this == other);
} }
@Override @Override
public int hashCode() { public int hashCode() {
return getClass().hashCode(); return getClass().hashCode();
} }
}; };
private static final MultiValueMap<String, String> EMPTY_QUERY_PARAMS =
CollectionUtils.unmodifiableMultiValueMap(new LinkedMultiValueMap<>(0));
@Nullable @Nullable
private final String userInfo; private final String userInfo;

2
spring-web/src/main/java/org/springframework/web/util/HtmlCharacterEntityReferences.java

@ -55,7 +55,7 @@ class HtmlCharacterEntityReferences {
private final String[] characterToEntityReferenceMap = new String[3000]; private final String[] characterToEntityReferenceMap = new String[3000];
private final Map<String, Character> entityReferenceToCharacterMap = new HashMap<>(252); private final Map<String, Character> entityReferenceToCharacterMap = new HashMap<>(512);
/** /**

2
spring-web/src/main/java/org/springframework/web/util/OpaqueUriComponents.java

@ -38,7 +38,7 @@ import org.springframework.util.ObjectUtils;
@SuppressWarnings("serial") @SuppressWarnings("serial")
final class OpaqueUriComponents extends UriComponents { final class OpaqueUriComponents extends UriComponents {
private static final MultiValueMap<String, String> QUERY_PARAMS_NONE = new LinkedMultiValueMap<>(0); private static final MultiValueMap<String, String> QUERY_PARAMS_NONE = new LinkedMultiValueMap<>();
@Nullable @Nullable
private final String ssp; private final String ssp;

2
spring-webflux/src/main/java/org/springframework/web/reactive/function/client/DefaultWebClient.java

@ -349,7 +349,7 @@ class DefaultWebClient implements WebClient {
private MultiValueMap<String, String> initCookies() { private MultiValueMap<String, String> initCookies() {
if (CollectionUtils.isEmpty(this.cookies)) { if (CollectionUtils.isEmpty(this.cookies)) {
return (defaultCookies != null ? defaultCookies : new LinkedMultiValueMap<>(0)); return (defaultCookies != null ? defaultCookies : new LinkedMultiValueMap<>());
} }
else if (CollectionUtils.isEmpty(defaultCookies)) { else if (CollectionUtils.isEmpty(defaultCookies)) {
return this.cookies; return this.cookies;

15
spring-webflux/src/main/java/org/springframework/web/reactive/socket/adapter/NettyWebSocketSessionSupport.java

@ -13,6 +13,7 @@
* See the License for the specific language governing permissions and * See the License for the specific language governing permissions and
* limitations under the License. * limitations under the License.
*/ */
package org.springframework.web.reactive.socket.adapter; package org.springframework.web.reactive.socket.adapter;
import java.util.HashMap; import java.util.HashMap;
@ -49,14 +50,14 @@ public abstract class NettyWebSocketSessionSupport<T> extends AbstractWebSocketS
protected static final int DEFAULT_FRAME_MAX_SIZE = 64 * 1024; protected static final int DEFAULT_FRAME_MAX_SIZE = 64 * 1024;
private static final Map<Class<?>, WebSocketMessage.Type> MESSAGE_TYPES; private static final Map<Class<?>, WebSocketMessage.Type> messageTypes;
static { static {
MESSAGE_TYPES = new HashMap<>(4); messageTypes = new HashMap<>(8);
MESSAGE_TYPES.put(TextWebSocketFrame.class, WebSocketMessage.Type.TEXT); messageTypes.put(TextWebSocketFrame.class, WebSocketMessage.Type.TEXT);
MESSAGE_TYPES.put(BinaryWebSocketFrame.class, WebSocketMessage.Type.BINARY); messageTypes.put(BinaryWebSocketFrame.class, WebSocketMessage.Type.BINARY);
MESSAGE_TYPES.put(PingWebSocketFrame.class, WebSocketMessage.Type.PING); messageTypes.put(PingWebSocketFrame.class, WebSocketMessage.Type.PING);
MESSAGE_TYPES.put(PongWebSocketFrame.class, WebSocketMessage.Type.PONG); messageTypes.put(PongWebSocketFrame.class, WebSocketMessage.Type.PONG);
} }
@ -73,7 +74,7 @@ public abstract class NettyWebSocketSessionSupport<T> extends AbstractWebSocketS
protected WebSocketMessage toMessage(WebSocketFrame frame) { protected WebSocketMessage toMessage(WebSocketFrame frame) {
DataBuffer payload = bufferFactory().wrap(frame.content()); DataBuffer payload = bufferFactory().wrap(frame.content());
return new WebSocketMessage(MESSAGE_TYPES.get(frame.getClass()), payload); return new WebSocketMessage(messageTypes.get(frame.getClass()), payload);
} }
protected WebSocketFrame toFrame(WebSocketMessage message) { protected WebSocketFrame toFrame(WebSocketMessage message) {

Loading…
Cancel
Save