Browse Source

Introduce ObjectUtils#nullSafeHash(Object... element)

This commit deprecates the various nullSafeHashCode methods taking array
types as they are superseded by Arrays.hashCode now. This means that
the now only remaining nullSafeHashCode method does not trigger a
warning only if the target type is not an array. At the same time, there
are multiple use of this method on several elements, handling the
accumulation of hash codes.

For that reason, this commit also introduces a nullSafeHash that takes
an array of elements. The only difference between Objects.hash is that
this method handles arrays.

The codebase has been reviewed to use any of those two methods when it
is possible.

Closes gh-29051
pull/31226/head
Stephane Nicoll 3 years ago
parent
commit
01f717375b
  1. 7
      spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJExpressionPointcut.java
  2. 4
      spring-aop/src/main/java/org/springframework/aop/aspectj/TypePatternClassFilter.java
  3. 4
      spring-aop/src/main/java/org/springframework/aop/support/ClassFilters.java
  4. 3
      spring-aop/src/main/java/org/springframework/aop/target/AbstractBeanFactoryBasedTargetSource.java
  5. 3
      spring-aop/src/main/java/org/springframework/aop/target/EmptyTargetSource.java
  6. 4
      spring-aspects/src/test/java/org/springframework/cache/config/TestEntity.java
  7. 2
      spring-beans/src/main/java/org/springframework/beans/BeanMetadataAttribute.java
  8. 10
      spring-beans/src/main/java/org/springframework/beans/ExtendedBeanInfo.java
  9. 7
      spring-beans/src/main/java/org/springframework/beans/GenericTypeAwarePropertyDescriptor.java
  10. 2
      spring-beans/src/main/java/org/springframework/beans/PropertyValue.java
  11. 5
      spring-beans/src/main/java/org/springframework/beans/factory/InjectionPoint.java
  12. 6
      spring-beans/src/main/java/org/springframework/beans/factory/config/BeanDefinitionHolder.java
  13. 2
      spring-beans/src/main/java/org/springframework/beans/factory/config/ConstructorArgumentValues.java
  14. 2
      spring-beans/src/main/java/org/springframework/beans/factory/config/TypedStringValue.java
  15. 4
      spring-beans/src/main/java/org/springframework/beans/factory/support/MethodOverride.java
  16. 10
      spring-context-support/src/main/java/org/springframework/mail/SimpleMailMessage.java
  17. 3
      spring-context/src/main/java/org/springframework/context/event/AbstractApplicationEventMulticaster.java
  18. 4
      spring-context/src/main/java/org/springframework/context/support/ApplicationListenerDetector.java
  19. 5
      spring-context/src/main/java/org/springframework/context/support/DefaultMessageSourceResolvable.java
  20. 7
      spring-context/src/main/java/org/springframework/jmx/support/NotificationListenerHolder.java
  21. 4
      spring-context/src/testFixtures/java/org/springframework/context/testfixture/cache/beans/TestEntity.java
  22. 3
      spring-core/src/main/java/org/springframework/core/annotation/RepeatableContainers.java
  23. 3
      spring-core/src/main/java/org/springframework/core/convert/Property.java
  24. 4
      spring-core/src/main/java/org/springframework/core/env/PropertySource.java
  25. 155
      spring-core/src/main/java/org/springframework/util/ObjectUtils.java
  26. 253
      spring-core/src/test/java/org/springframework/util/ObjectUtilsTests.java
  27. 3
      spring-messaging/src/main/java/org/springframework/messaging/simp/user/MultiServerUserRegistry.java
  28. 2
      spring-messaging/src/main/java/org/springframework/messaging/support/GenericMessage.java
  29. 4
      spring-messaging/src/test/java/org/springframework/messaging/simp/user/TestSimpSubscription.java
  30. 2
      spring-r2dbc/src/main/java/org/springframework/r2dbc/core/Parameter.java
  31. 11
      spring-web/src/main/java/org/springframework/http/ContentDisposition.java
  32. 4
      spring-web/src/main/java/org/springframework/http/HttpEntity.java
  33. 4
      spring-web/src/main/java/org/springframework/http/HttpRange.java
  34. 10
      spring-web/src/main/java/org/springframework/http/ProblemDetail.java
  35. 11
      spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java
  36. 6
      spring-web/src/main/java/org/springframework/web/util/OpaqueUriComponents.java
  37. 4
      spring-webflux/src/main/java/org/springframework/web/reactive/socket/CloseStatus.java
  38. 3
      spring-websocket/src/main/java/org/springframework/web/socket/CloseStatus.java

7
spring-aop/src/main/java/org/springframework/aop/aspectj/AspectJExpressionPointcut.java

@ -525,11 +525,8 @@ public class AspectJExpressionPointcut extends AbstractExpressionPointcut @@ -525,11 +525,8 @@ public class AspectJExpressionPointcut extends AbstractExpressionPointcut
@Override
public int hashCode() {
int hashCode = ObjectUtils.nullSafeHashCode(getExpression());
hashCode = 31 * hashCode + ObjectUtils.nullSafeHashCode(this.pointcutDeclarationScope);
hashCode = 31 * hashCode + ObjectUtils.nullSafeHashCode(this.pointcutParameterNames);
hashCode = 31 * hashCode + ObjectUtils.nullSafeHashCode(this.pointcutParameterTypes);
return hashCode;
return ObjectUtils.nullSafeHash(getExpression(), this.pointcutDeclarationScope,
this.pointcutParameterNames, this.pointcutParameterTypes);
}
@Override

4
spring-aop/src/main/java/org/springframework/aop/aspectj/TypePatternClassFilter.java

@ -16,6 +16,8 @@ @@ -16,6 +16,8 @@
package org.springframework.aop.aspectj;
import java.util.Objects;
import org.aspectj.weaver.tools.PointcutParser;
import org.aspectj.weaver.tools.TypePatternMatcher;
@ -124,7 +126,7 @@ public class TypePatternClassFilter implements ClassFilter { @@ -124,7 +126,7 @@ public class TypePatternClassFilter implements ClassFilter {
@Override
public int hashCode() {
return ObjectUtils.nullSafeHashCode(this.typePattern);
return Objects.hashCode(this.typePattern);
}
@Override

4
spring-aop/src/main/java/org/springframework/aop/support/ClassFilters.java

@ -129,7 +129,7 @@ public abstract class ClassFilters { @@ -129,7 +129,7 @@ public abstract class ClassFilters {
@Override
public int hashCode() {
return ObjectUtils.nullSafeHashCode(this.filters);
return Arrays.hashCode(this.filters);
}
@Override
@ -170,7 +170,7 @@ public abstract class ClassFilters { @@ -170,7 +170,7 @@ public abstract class ClassFilters {
@Override
public int hashCode() {
return ObjectUtils.nullSafeHashCode(this.filters);
return Arrays.hashCode(this.filters);
}
@Override

3
spring-aop/src/main/java/org/springframework/aop/target/AbstractBeanFactoryBasedTargetSource.java

@ -17,6 +17,7 @@ @@ -17,6 +17,7 @@
package org.springframework.aop.target;
import java.io.Serializable;
import java.util.Objects;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@ -190,7 +191,7 @@ public abstract class AbstractBeanFactoryBasedTargetSource implements TargetSour @@ -190,7 +191,7 @@ public abstract class AbstractBeanFactoryBasedTargetSource implements TargetSour
@Override
public int hashCode() {
return getClass().hashCode() * 13 + ObjectUtils.nullSafeHashCode(this.targetBeanName);
return Objects.hash(getClass(), this.targetBeanName);
}
@Override

3
spring-aop/src/main/java/org/springframework/aop/target/EmptyTargetSource.java

@ -17,6 +17,7 @@ @@ -17,6 +17,7 @@
package org.springframework.aop.target;
import java.io.Serializable;
import java.util.Objects;
import org.springframework.aop.TargetSource;
import org.springframework.lang.Nullable;
@ -140,7 +141,7 @@ public final class EmptyTargetSource implements TargetSource, Serializable { @@ -140,7 +141,7 @@ public final class EmptyTargetSource implements TargetSource, Serializable {
@Override
public int hashCode() {
return EmptyTargetSource.class.hashCode() * 13 + ObjectUtils.nullSafeHashCode(this.targetClass);
return Objects.hash(getClass(), this.targetClass);
}
@Override

4
spring-aspects/src/test/java/org/springframework/cache/config/TestEntity.java vendored

@ -16,6 +16,8 @@ @@ -16,6 +16,8 @@
package org.springframework.cache.config;
import java.util.Objects;
import org.springframework.lang.Nullable;
import org.springframework.util.ObjectUtils;
@ -42,7 +44,7 @@ public class TestEntity { @@ -42,7 +44,7 @@ public class TestEntity {
@Override
public int hashCode() {
return ObjectUtils.nullSafeHashCode(this.id);
return Objects.hashCode(this.id);
}
@Override

2
spring-beans/src/main/java/org/springframework/beans/BeanMetadataAttribute.java

@ -90,7 +90,7 @@ public class BeanMetadataAttribute implements BeanMetadataElement { @@ -90,7 +90,7 @@ public class BeanMetadataAttribute implements BeanMetadataElement {
@Override
public int hashCode() {
return this.name.hashCode() * 29 + ObjectUtils.nullSafeHashCode(this.value);
return ObjectUtils.nullSafeHash(this.name, this.value);
}
@Override

10
spring-beans/src/main/java/org/springframework/beans/ExtendedBeanInfo.java

@ -30,6 +30,7 @@ import java.lang.reflect.Modifier; @@ -30,6 +30,7 @@ import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.TreeSet;
@ -345,7 +346,7 @@ class ExtendedBeanInfo implements BeanInfo { @@ -345,7 +346,7 @@ class ExtendedBeanInfo implements BeanInfo {
@Override
public int hashCode() {
return (ObjectUtils.nullSafeHashCode(getReadMethod()) * 29 + ObjectUtils.nullSafeHashCode(getWriteMethod()));
return Objects.hash(getReadMethod(), getWriteMethod());
}
@Override
@ -500,11 +501,8 @@ class ExtendedBeanInfo implements BeanInfo { @@ -500,11 +501,8 @@ class ExtendedBeanInfo implements BeanInfo {
@Override
public int hashCode() {
int hashCode = ObjectUtils.nullSafeHashCode(getReadMethod());
hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(getWriteMethod());
hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(getIndexedReadMethod());
hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(getIndexedWriteMethod());
return hashCode;
return Objects.hash(getReadMethod(), getWriteMethod(),
getIndexedReadMethod(), getIndexedWriteMethod());
}
@Override

7
spring-beans/src/main/java/org/springframework/beans/GenericTypeAwarePropertyDescriptor.java

@ -20,6 +20,7 @@ import java.beans.IntrospectionException; @@ -20,6 +20,7 @@ import java.beans.IntrospectionException;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import org.apache.commons.logging.LogFactory;
@ -30,7 +31,6 @@ import org.springframework.core.MethodParameter; @@ -30,7 +31,6 @@ import org.springframework.core.MethodParameter;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
/**
@ -172,10 +172,7 @@ final class GenericTypeAwarePropertyDescriptor extends PropertyDescriptor { @@ -172,10 +172,7 @@ final class GenericTypeAwarePropertyDescriptor extends PropertyDescriptor {
@Override
public int hashCode() {
int hashCode = getBeanClass().hashCode();
hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(getReadMethod());
hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(getWriteMethod());
return hashCode;
return Objects.hash(getBeanClass(), getReadMethod(), getWriteMethod());
}
}

2
spring-beans/src/main/java/org/springframework/beans/PropertyValue.java

@ -197,7 +197,7 @@ public class PropertyValue extends BeanMetadataAttributeAccessor implements Seri @@ -197,7 +197,7 @@ public class PropertyValue extends BeanMetadataAttributeAccessor implements Seri
@Override
public int hashCode() {
return this.name.hashCode() * 29 + ObjectUtils.nullSafeHashCode(this.value);
return ObjectUtils.nullSafeHash(this.name, this.value);
}
@Override

5
spring-beans/src/main/java/org/springframework/beans/factory/InjectionPoint.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2002-2022 the original author or authors.
* Copyright 2002-2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -20,6 +20,7 @@ import java.lang.annotation.Annotation; @@ -20,6 +20,7 @@ import java.lang.annotation.Annotation;
import java.lang.reflect.AnnotatedElement;
import java.lang.reflect.Field;
import java.lang.reflect.Member;
import java.util.Objects;
import org.springframework.core.MethodParameter;
import org.springframework.lang.Nullable;
@ -190,7 +191,7 @@ public class InjectionPoint { @@ -190,7 +191,7 @@ public class InjectionPoint {
@Override
public int hashCode() {
return (this.field != null ? this.field.hashCode() : ObjectUtils.nullSafeHashCode(this.methodParameter));
return Objects.hash(this.field, this.methodParameter);
}
@Override

6
spring-beans/src/main/java/org/springframework/beans/factory/config/BeanDefinitionHolder.java

@ -173,10 +173,8 @@ public class BeanDefinitionHolder implements BeanMetadataElement { @@ -173,10 +173,8 @@ public class BeanDefinitionHolder implements BeanMetadataElement {
@Override
public int hashCode() {
int hashCode = this.beanDefinition.hashCode();
hashCode = 29 * hashCode + this.beanName.hashCode();
hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(this.aliases);
return hashCode;
return ObjectUtils.nullSafeHash(this.beanDefinition, this.beanName,
this.aliases);
}
}

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

@ -606,7 +606,7 @@ public class ConstructorArgumentValues { @@ -606,7 +606,7 @@ public class ConstructorArgumentValues {
* same content to reside in the same Set.
*/
private int contentHashCode() {
return ObjectUtils.nullSafeHashCode(this.value) * 29 + ObjectUtils.nullSafeHashCode(this.type);
return ObjectUtils.nullSafeHash(this.value, this.type);
}
/**

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

@ -223,7 +223,7 @@ public class TypedStringValue implements BeanMetadataElement { @@ -223,7 +223,7 @@ public class TypedStringValue implements BeanMetadataElement {
@Override
public int hashCode() {
return ObjectUtils.nullSafeHashCode(this.value) * 29 + ObjectUtils.nullSafeHashCode(this.targetType);
return ObjectUtils.nullSafeHash(this.value, this.targetType);
}
@Override

4
spring-beans/src/main/java/org/springframework/beans/factory/support/MethodOverride.java

@ -113,9 +113,7 @@ public abstract class MethodOverride implements BeanMetadataElement { @@ -113,9 +113,7 @@ public abstract class MethodOverride implements BeanMetadataElement {
@Override
public int hashCode() {
int hashCode = ObjectUtils.nullSafeHashCode(this.methodName);
hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(this.source);
return hashCode;
return ObjectUtils.nullSafeHash(this.methodName, this.source);
}
}

10
spring-context-support/src/main/java/org/springframework/mail/SimpleMailMessage.java

@ -236,14 +236,8 @@ public class SimpleMailMessage implements MailMessage, Serializable { @@ -236,14 +236,8 @@ public class SimpleMailMessage implements MailMessage, Serializable {
@Override
public int hashCode() {
int hashCode = ObjectUtils.nullSafeHashCode(this.from);
hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(this.replyTo);
hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(this.to);
hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(this.cc);
hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(this.bcc);
hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(this.sentDate);
hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(this.subject);
return hashCode;
return ObjectUtils.nullSafeHash(this.from, this.replyTo, this.to, this.cc,
this.bcc, this.sentDate, this.subject);
}
@Override

3
spring-context/src/main/java/org/springframework/context/event/AbstractApplicationEventMulticaster.java

@ -21,6 +21,7 @@ import java.util.Collection; @@ -21,6 +21,7 @@ import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Predicate;
@ -404,7 +405,7 @@ public abstract class AbstractApplicationEventMulticaster @@ -404,7 +405,7 @@ public abstract class AbstractApplicationEventMulticaster
@Override
public int hashCode() {
return this.eventType.hashCode() * 29 + ObjectUtils.nullSafeHashCode(this.sourceType);
return Objects.hash(this.eventType, this.sourceType);
}
@Override

4
spring-context/src/main/java/org/springframework/context/support/ApplicationListenerDetector.java

@ -17,6 +17,7 @@ @@ -17,6 +17,7 @@
package org.springframework.context.support;
import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.logging.Log;
@ -28,7 +29,6 @@ import org.springframework.beans.factory.support.RootBeanDefinition; @@ -28,7 +29,6 @@ import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ApplicationEventMulticaster;
import org.springframework.lang.Nullable;
import org.springframework.util.ObjectUtils;
/**
* {@code BeanPostProcessor} that detects beans which implement the {@code ApplicationListener}
@ -120,7 +120,7 @@ class ApplicationListenerDetector implements DestructionAwareBeanPostProcessor, @@ -120,7 +120,7 @@ class ApplicationListenerDetector implements DestructionAwareBeanPostProcessor,
@Override
public int hashCode() {
return ObjectUtils.nullSafeHashCode(this.applicationContext);
return Objects.hashCode(this.applicationContext);
}
}

5
spring-context/src/main/java/org/springframework/context/support/DefaultMessageSourceResolvable.java

@ -179,10 +179,7 @@ public class DefaultMessageSourceResolvable implements MessageSourceResolvable, @@ -179,10 +179,7 @@ public class DefaultMessageSourceResolvable implements MessageSourceResolvable,
@Override
public int hashCode() {
int hashCode = ObjectUtils.nullSafeHashCode(getCodes());
hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(getArguments());
hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(getDefaultMessage());
return hashCode;
return ObjectUtils.nullSafeHash(getCode(), getArguments(), getDefaultMessage());
}
}

7
spring-context/src/main/java/org/springframework/jmx/support/NotificationListenerHolder.java

@ -167,11 +167,8 @@ public class NotificationListenerHolder { @@ -167,11 +167,8 @@ public class NotificationListenerHolder {
@Override
public int hashCode() {
int hashCode = ObjectUtils.nullSafeHashCode(this.notificationListener);
hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(this.notificationFilter);
hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(this.handback);
hashCode = 29 * hashCode + ObjectUtils.nullSafeHashCode(this.mappedObjectNames);
return hashCode;
return ObjectUtils.nullSafeHash(this.notificationListener, this.notificationFilter,
this.handback, this.mappedObjectNames);
}
}

4
spring-context/src/testFixtures/java/org/springframework/context/testfixture/cache/beans/TestEntity.java vendored

@ -16,6 +16,8 @@ @@ -16,6 +16,8 @@
package org.springframework.context.testfixture.cache.beans;
import java.util.Objects;
import org.springframework.lang.Nullable;
import org.springframework.util.ObjectUtils;
@ -38,7 +40,7 @@ public class TestEntity { @@ -38,7 +40,7 @@ public class TestEntity {
@Override
public int hashCode() {
return ObjectUtils.nullSafeHashCode(this.id);
return Objects.hashCode(this.id);
}
@Override

3
spring-core/src/main/java/org/springframework/core/annotation/RepeatableContainers.java

@ -20,6 +20,7 @@ import java.lang.annotation.Annotation; @@ -20,6 +20,7 @@ import java.lang.annotation.Annotation;
import java.lang.annotation.Repeatable;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.Objects;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
@ -91,7 +92,7 @@ public abstract class RepeatableContainers { @@ -91,7 +92,7 @@ public abstract class RepeatableContainers {
@Override
public int hashCode() {
return ObjectUtils.nullSafeHashCode(this.parent);
return Objects.hashCode(this.parent);
}

3
spring-core/src/main/java/org/springframework/core/convert/Property.java

@ -22,6 +22,7 @@ import java.lang.reflect.Field; @@ -22,6 +22,7 @@ import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;
import org.springframework.core.MethodParameter;
import org.springframework.lang.Nullable;
@ -269,7 +270,7 @@ public final class Property { @@ -269,7 +270,7 @@ public final class Property {
@Override
public int hashCode() {
return (ObjectUtils.nullSafeHashCode(this.objectType) * 31 + ObjectUtils.nullSafeHashCode(this.name));
return Objects.hash(this.objectType, this.name);
}
}

4
spring-core/src/main/java/org/springframework/core/env/PropertySource.java vendored

@ -16,6 +16,8 @@ @@ -16,6 +16,8 @@
package org.springframework.core.env;
import java.util.Objects;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@ -147,7 +149,7 @@ public abstract class PropertySource<T> { @@ -147,7 +149,7 @@ public abstract class PropertySource<T> {
*/
@Override
public int hashCode() {
return ObjectUtils.nullSafeHashCode(getName());
return Objects.hashCode(getName());
}
/**

155
spring-core/src/main/java/org/springframework/util/ObjectUtils.java

@ -22,6 +22,7 @@ import java.time.ZoneId; @@ -22,6 +22,7 @@ import java.time.ZoneId;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.StringJoiner;
import java.util.TimeZone;
@ -390,21 +391,32 @@ public abstract class ObjectUtils { @@ -390,21 +391,32 @@ public abstract class ObjectUtils {
}
/**
* Return as hash code for the given object; typically the value of
* Return a hash code for the given elements, delegating to
* {@link #nullSafeHashCode(Object)} for each element. Contrary
* to {@link Objects#hash(Object...)}, this method handle an
* element that is an array.
* @param elements the elements to be hashed
* @return a hash value of the elements
* @since 6.1
*/
public static int nullSafeHash(@Nullable Object... elements) {
if (elements == null) {
return 0;
}
int result = 1;
for (Object element : elements) {
result = 31 * result + nullSafeHashCode(element);
}
return result;
}
/**
* Return a hash code for the given object; typically the value of
* {@code Object#hashCode()}}. If the object is an array,
* this method will delegate to any of the {@code nullSafeHashCode}
* methods for arrays in this class. If the object is {@code null},
* this method returns 0.
* this method will delegate to any of the {@code Arrays#hasCode}
* methods. If the object is {@code null}, this method returns 0.
* @see Object#hashCode()
* @see #nullSafeHashCode(Object[])
* @see #nullSafeHashCode(boolean[])
* @see #nullSafeHashCode(byte[])
* @see #nullSafeHashCode(char[])
* @see #nullSafeHashCode(double[])
* @see #nullSafeHashCode(float[])
* @see #nullSafeHashCode(int[])
* @see #nullSafeHashCode(long[])
* @see #nullSafeHashCode(short[])
* @see Arrays
*/
public static int nullSafeHashCode(@Nullable Object obj) {
if (obj == null) {
@ -412,31 +424,31 @@ public abstract class ObjectUtils { @@ -412,31 +424,31 @@ public abstract class ObjectUtils {
}
if (obj.getClass().isArray()) {
if (obj instanceof Object[] objects) {
return nullSafeHashCode(objects);
return Arrays.hashCode(objects);
}
if (obj instanceof boolean[] booleans) {
return nullSafeHashCode(booleans);
return Arrays.hashCode(booleans);
}
if (obj instanceof byte[] bytes) {
return nullSafeHashCode(bytes);
return Arrays.hashCode(bytes);
}
if (obj instanceof char[] chars) {
return nullSafeHashCode(chars);
return Arrays.hashCode(chars);
}
if (obj instanceof double[] doubles) {
return nullSafeHashCode(doubles);
return Arrays.hashCode(doubles);
}
if (obj instanceof float[] floats) {
return nullSafeHashCode(floats);
return Arrays.hashCode(floats);
}
if (obj instanceof int[] ints) {
return nullSafeHashCode(ints);
return Arrays.hashCode(ints);
}
if (obj instanceof long[] longs) {
return nullSafeHashCode(longs);
return Arrays.hashCode(longs);
}
if (obj instanceof short[] shorts) {
return nullSafeHashCode(shorts);
return Arrays.hashCode(shorts);
}
}
return obj.hashCode();
@ -445,136 +457,91 @@ public abstract class ObjectUtils { @@ -445,136 +457,91 @@ public abstract class ObjectUtils {
/**
* Return a hash code based on the contents of the specified array.
* If {@code array} is {@code null}, this method returns 0.
* @deprecated as of 6.1 in favor of {@link Arrays#hashCode(Object[])}
*/
@Deprecated(since = "6.1")
public static int nullSafeHashCode(@Nullable Object[] array) {
if (array == null) {
return 0;
}
int hash = INITIAL_HASH;
for (Object element : array) {
hash = MULTIPLIER * hash + nullSafeHashCode(element);
}
return hash;
return Arrays.hashCode(array);
}
/**
* Return a hash code based on the contents of the specified array.
* If {@code array} is {@code null}, this method returns 0.
* @deprecated as of 6.1 in favor of {@link Arrays#hashCode(boolean[])}
*/
@Deprecated(since = "6.1")
public static int nullSafeHashCode(@Nullable boolean[] array) {
if (array == null) {
return 0;
}
int hash = INITIAL_HASH;
for (boolean element : array) {
hash = MULTIPLIER * hash + Boolean.hashCode(element);
}
return hash;
return Arrays.hashCode(array);
}
/**
* Return a hash code based on the contents of the specified array.
* If {@code array} is {@code null}, this method returns 0.
* @deprecated as of 6.1 in favor of {@link Arrays#hashCode(byte[])}
*/
@Deprecated(since = "6.1")
public static int nullSafeHashCode(@Nullable byte[] array) {
if (array == null) {
return 0;
}
int hash = INITIAL_HASH;
for (byte element : array) {
hash = MULTIPLIER * hash + element;
}
return hash;
return Arrays.hashCode(array);
}
/**
* Return a hash code based on the contents of the specified array.
* If {@code array} is {@code null}, this method returns 0.
* @deprecated as of 6.1 in favor of {@link Arrays#hashCode(char[])}
*/
@Deprecated(since = "6.1")
public static int nullSafeHashCode(@Nullable char[] array) {
if (array == null) {
return 0;
}
int hash = INITIAL_HASH;
for (char element : array) {
hash = MULTIPLIER * hash + element;
}
return hash;
return Arrays.hashCode(array);
}
/**
* Return a hash code based on the contents of the specified array.
* If {@code array} is {@code null}, this method returns 0.
* @deprecated as of 6.1 in favor of {@link Arrays#hashCode(double[])}
*/
@Deprecated(since = "6.1")
public static int nullSafeHashCode(@Nullable double[] array) {
if (array == null) {
return 0;
}
int hash = INITIAL_HASH;
for (double element : array) {
hash = MULTIPLIER * hash + Double.hashCode(element);
}
return hash;
return Arrays.hashCode(array);
}
/**
* Return a hash code based on the contents of the specified array.
* If {@code array} is {@code null}, this method returns 0.
* @deprecated as of 6.1 in favor of {@link Arrays#hashCode(float[])}
*/
@Deprecated(since = "6.1")
public static int nullSafeHashCode(@Nullable float[] array) {
if (array == null) {
return 0;
}
int hash = INITIAL_HASH;
for (float element : array) {
hash = MULTIPLIER * hash + Float.hashCode(element);
}
return hash;
return Arrays.hashCode(array);
}
/**
* Return a hash code based on the contents of the specified array.
* If {@code array} is {@code null}, this method returns 0.
* @deprecated as of 6.1 in favor of {@link Arrays#hashCode(int[])}
*/
@Deprecated(since = "6.1")
public static int nullSafeHashCode(@Nullable int[] array) {
if (array == null) {
return 0;
}
int hash = INITIAL_HASH;
for (int element : array) {
hash = MULTIPLIER * hash + element;
}
return hash;
return Arrays.hashCode(array);
}
/**
* Return a hash code based on the contents of the specified array.
* If {@code array} is {@code null}, this method returns 0.
* @deprecated as of 6.1 in favor of {@link Arrays#hashCode(long[])}
*/
@Deprecated(since = "6.1")
public static int nullSafeHashCode(@Nullable long[] array) {
if (array == null) {
return 0;
}
int hash = INITIAL_HASH;
for (long element : array) {
hash = MULTIPLIER * hash + Long.hashCode(element);
}
return hash;
return Arrays.hashCode(array);
}
/**
* Return a hash code based on the contents of the specified array.
* If {@code array} is {@code null}, this method returns 0.
* @deprecated as of 6.1 in favor of {@link Arrays#hashCode(short[])}
*/
@Deprecated(since = "6.1")
public static int nullSafeHashCode(@Nullable short[] array) {
if (array == null) {
return 0;
}
int hash = INITIAL_HASH;
for (short element : array) {
hash = MULTIPLIER * hash + element;
}
return hash;
return Arrays.hashCode(array);
}

253
spring-core/src/test/java/org/springframework/util/ObjectUtilsTests.java

@ -30,6 +30,7 @@ import java.nio.file.Path; @@ -30,6 +30,7 @@ import java.nio.file.Path;
import java.sql.SQLException;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Arrays;
import java.util.Collections;
import java.util.Currency;
import java.util.Date;
@ -38,6 +39,7 @@ import java.util.HashSet; @@ -38,6 +39,7 @@ import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.TimeZone;
@ -379,193 +381,221 @@ class ObjectUtilsTests { @@ -379,193 +381,221 @@ class ObjectUtilsTests {
}
@Test
void nullSafeHashCodeWithBooleanArray() {
int expected = 31 * 7 + Boolean.TRUE.hashCode();
expected = 31 * expected + Boolean.FALSE.hashCode();
void nullSafeHashWithNull() {
assertThat(ObjectUtils.nullSafeHash((Object[]) null)).isEqualTo(0);
}
@Test
void nullSafeHashWithIntermediateNullElements() {
assertThat(ObjectUtils.nullSafeHash(3, null, 5)).isEqualTo(Objects.hash(3, null, 5));
}
@Test
@Deprecated
void nullSafeHashCodeWithNullBooleanArray() {
boolean[] array = null;
assertThat(ObjectUtils.nullSafeHashCode(array)).isEqualTo(0);
}
@Test
@Deprecated
void nullSafeHashCodeWithBooleanArray() {
boolean[] array = {true, false};
int actual = ObjectUtils.nullSafeHashCode(array);
assertThat(actual).isEqualTo(Arrays.hashCode(array));
}
assertThat(actual).isEqualTo(expected);
@Test
@Deprecated
void nullSafeHashCodeWithObjectBeingBooleanArray() {
Object array = new boolean[] {true, false};
int expected = ObjectUtils.nullSafeHashCode((boolean[]) array);
assertEqualHashCodes(expected, array);
}
@Test
void nullSafeHashCodeWithBooleanArrayEqualToNull() {
assertThat(ObjectUtils.nullSafeHashCode((boolean[]) null)).isEqualTo(0);
@Deprecated
void nullSafeHashCodeWithNullByteArray() {
byte[] array = null;
assertThat(ObjectUtils.nullSafeHashCode(array)).isEqualTo(0);
}
@Test
@Deprecated
void nullSafeHashCodeWithByteArray() {
int expected = 31 * 7 + 8;
expected = 31 * expected + 10;
byte[] array = {8, 10};
int actual = ObjectUtils.nullSafeHashCode(array);
assertThat(actual).isEqualTo(Arrays.hashCode(array));
}
assertThat(actual).isEqualTo(expected);
@Test
@Deprecated
void nullSafeHashCodeWithObjectBeingByteArray() {
Object array = new byte[] {6, 39};
int expected = ObjectUtils.nullSafeHashCode((byte[]) array);
assertEqualHashCodes(expected, array);
}
@Test
void nullSafeHashCodeWithByteArrayEqualToNull() {
assertThat(ObjectUtils.nullSafeHashCode((byte[]) null)).isEqualTo(0);
@Deprecated
void nullSafeHashCodeWithNullCharArray() {
char[] array = null;
assertThat(ObjectUtils.nullSafeHashCode(array)).isEqualTo(0);
}
@Test
@Deprecated
void nullSafeHashCodeWithCharArray() {
int expected = 31 * 7 + 'a';
expected = 31 * expected + 'E';
char[] array = {'a', 'E'};
int actual = ObjectUtils.nullSafeHashCode(array);
assertThat(actual).isEqualTo(Arrays.hashCode(array));
}
assertThat(actual).isEqualTo(expected);
@Test
@Deprecated
void nullSafeHashCodeWithObjectBeingCharArray() {
Object array = new char[] {'l', 'M'};
int expected = ObjectUtils.nullSafeHashCode((char[]) array);
assertEqualHashCodes(expected, array);
}
@Test
void nullSafeHashCodeWithCharArrayEqualToNull() {
assertThat(ObjectUtils.nullSafeHashCode((char[]) null)).isEqualTo(0);
@Deprecated
void nullSafeHashCodeWithNullDoubleArray() {
double[] array = null;
assertThat(ObjectUtils.nullSafeHashCode(array)).isEqualTo(0);
}
@Test
@Deprecated
void nullSafeHashCodeWithDoubleArray() {
long bits = Double.doubleToLongBits(8449.65);
int expected = 31 * 7 + (int) (bits ^ (bits >>> 32));
bits = Double.doubleToLongBits(9944.923);
expected = 31 * expected + (int) (bits ^ (bits >>> 32));
double[] array = {8449.65, 9944.923};
int actual = ObjectUtils.nullSafeHashCode(array);
assertThat(actual).isEqualTo(Arrays.hashCode(array));
}
assertThat(actual).isEqualTo(expected);
@Test
@Deprecated
void nullSafeHashCodeWithObjectBeingDoubleArray() {
Object array = new double[] {68930.993, 9022.009};
int expected = ObjectUtils.nullSafeHashCode((double[]) array);
assertEqualHashCodes(expected, array);
}
@Test
void nullSafeHashCodeWithDoubleArrayEqualToNull() {
assertThat(ObjectUtils.nullSafeHashCode((double[]) null)).isEqualTo(0);
@Deprecated
void nullSafeHashCodeWithNullFloatArray() {
float[] array = null;
assertThat(ObjectUtils.nullSafeHashCode(array)).isEqualTo(0);
}
@Test
@Deprecated
void nullSafeHashCodeWithFloatArray() {
int expected = 31 * 7 + Float.floatToIntBits(9.6f);
expected = 31 * expected + Float.floatToIntBits(7.4f);
float[] array = {9.6f, 7.4f};
int actual = ObjectUtils.nullSafeHashCode(array);
assertThat(actual).isEqualTo(expected);
}
@Test
void nullSafeHashCodeWithFloatArrayEqualToNull() {
assertThat(ObjectUtils.nullSafeHashCode((float[]) null)).isEqualTo(0);
assertThat(actual).isEqualTo(Arrays.hashCode(array));
}
@Test
void nullSafeHashCodeWithIntArray() {
int expected = 31 * 7 + 884;
expected = 31 * expected + 340;
int[] array = {884, 340};
int actual = ObjectUtils.nullSafeHashCode(array);
assertThat(actual).isEqualTo(expected);
@Deprecated
void nullSafeHashCodeWithObjectBeingFloatArray() {
Object array = new float[] {9.9f, 9.54f};
int expected = ObjectUtils.nullSafeHashCode((float[]) array);
assertEqualHashCodes(expected, array);
}
@Test
void nullSafeHashCodeWithIntArrayEqualToNull() {
assertThat(ObjectUtils.nullSafeHashCode((int[]) null)).isEqualTo(0);
@Deprecated
void nullSafeHashCodeWithNullIntArray() {
int[] array = null;
assertThat(ObjectUtils.nullSafeHashCode(array)).isEqualTo(0);
}
@Test
void nullSafeHashCodeWithLongArray() {
long lng = 7993L;
int expected = 31 * 7 + (int) (lng ^ (lng >>> 32));
lng = 84320L;
expected = 31 * expected + (int) (lng ^ (lng >>> 32));
long[] array = {7993L, 84320L};
@Deprecated
void nullSafeHashCodeWithIntArray() {
int[] array = {884, 340};
int actual = ObjectUtils.nullSafeHashCode(array);
assertThat(actual).isEqualTo(expected);
assertThat(actual).isEqualTo(Arrays.hashCode(array));
}
@Test
void nullSafeHashCodeWithLongArrayEqualToNull() {
assertThat(ObjectUtils.nullSafeHashCode((long[]) null)).isEqualTo(0);
@Deprecated
void nullSafeHashCodeWithObjectBeingIntArray() {
Object array = new int[] {89, 32};
int expected = ObjectUtils.nullSafeHashCode((int[]) array);
assertEqualHashCodes(expected, array);
}
@Test
void nullSafeHashCodeWithObject() {
String str = "Luke";
assertThat(ObjectUtils.nullSafeHashCode(str)).isEqualTo(str.hashCode());
@Deprecated
void nullSafeHashCodeWithNullLongArray() {
long[] array = null;
assertThat(ObjectUtils.nullSafeHashCode(array)).isEqualTo(0);
}
@Test
void nullSafeHashCodeWithObjectArray() {
int expected = 31 * 7 + "Leia".hashCode();
expected = 31 * expected + "Han".hashCode();
Object[] array = {"Leia", "Han"};
@Deprecated
void nullSafeHashCodeWithLongArray() {
long[] array = {7993L, 84320L};
int actual = ObjectUtils.nullSafeHashCode(array);
assertThat(actual).isEqualTo(expected);
}
@Test
void nullSafeHashCodeWithObjectArrayEqualToNull() {
assertThat(ObjectUtils.nullSafeHashCode((Object[]) null)).isEqualTo(0);
assertThat(actual).isEqualTo(Arrays.hashCode(array));
}
@Test
void nullSafeHashCodeWithObjectBeingBooleanArray() {
Object array = new boolean[] {true, false};
int expected = ObjectUtils.nullSafeHashCode((boolean[]) array);
@Deprecated
void nullSafeHashCodeWithObjectBeingLongArray() {
Object array = new long[] {4389, 320};
int expected = ObjectUtils.nullSafeHashCode((long[]) array);
assertEqualHashCodes(expected, array);
}
@Test
void nullSafeHashCodeWithObjectBeingByteArray() {
Object array = new byte[] {6, 39};
int expected = ObjectUtils.nullSafeHashCode((byte[]) array);
assertEqualHashCodes(expected, array);
@Deprecated
void nullSafeHashCodeWithNullShortArray() {
short[] array = null;
assertThat(ObjectUtils.nullSafeHashCode(array)).isEqualTo(0);
}
@Test
void nullSafeHashCodeWithObjectBeingCharArray() {
Object array = new char[] {'l', 'M'};
int expected = ObjectUtils.nullSafeHashCode((char[]) array);
assertEqualHashCodes(expected, array);
@Deprecated
void nullSafeHashCodeWithShortArray() {
short[] array = {4, 25};
int actual = ObjectUtils.nullSafeHashCode(array);
assertThat(actual).isEqualTo(Arrays.hashCode(array));
}
@Test
void nullSafeHashCodeWithObjectBeingDoubleArray() {
Object array = new double[] {68930.993, 9022.009};
int expected = ObjectUtils.nullSafeHashCode((double[]) array);
@Deprecated
void nullSafeHashCodeWithObjectBeingShortArray() {
Object array = new short[] {5, 3};
int expected = ObjectUtils.nullSafeHashCode((short[]) array);
assertEqualHashCodes(expected, array);
}
@Test
void nullSafeHashCodeWithObjectBeingFloatArray() {
Object array = new float[] {9.9f, 9.54f};
int expected = ObjectUtils.nullSafeHashCode((float[]) array);
assertEqualHashCodes(expected, array);
void nullSafeHashCodeWithObject() {
String str = "Luke";
assertThat(ObjectUtils.nullSafeHashCode(str)).isEqualTo(str.hashCode());
}
@Test
void nullSafeHashCodeWithObjectBeingIntArray() {
Object array = new int[] {89, 32};
int expected = ObjectUtils.nullSafeHashCode((int[]) array);
assertEqualHashCodes(expected, array);
@Deprecated
void nullSafeHashCodeWithObjectArray() {
Object[] array = {"Leia", "Han"};
int actual = ObjectUtils.nullSafeHashCode(array);
assertThat(actual).isEqualTo(Arrays.hashCode(array));
}
@Test
void nullSafeHashCodeWithObjectBeingLongArray() {
Object array = new long[] {4389, 320};
int expected = ObjectUtils.nullSafeHashCode((long[]) array);
assertEqualHashCodes(expected, array);
@Deprecated
void nullSafeHashCodeWithObjectArrayEqualToNull() {
assertThat(ObjectUtils.nullSafeHashCode((Object[]) null)).isEqualTo(0);
}
@Test
@Deprecated
void nullSafeHashCodeWithObjectBeingObjectArray() {
Object array = new Object[] {"Luke", "Anakin"};
int expected = ObjectUtils.nullSafeHashCode((Object[]) array);
@ -573,31 +603,10 @@ class ObjectUtilsTests { @@ -573,31 +603,10 @@ class ObjectUtilsTests {
}
@Test
void nullSafeHashCodeWithObjectBeingShortArray() {
Object array = new short[] {5, 3};
int expected = ObjectUtils.nullSafeHashCode((short[]) array);
assertEqualHashCodes(expected, array);
}
@Test
@Deprecated
void nullSafeHashCodeWithObjectEqualToNull() {
assertThat(ObjectUtils.nullSafeHashCode((Object) null)).isEqualTo(0);
}
@Test
void nullSafeHashCodeWithShortArray() {
int expected = 31 * 7 + 70;
expected = 31 * expected + 8;
short[] array = {70, 8};
int actual = ObjectUtils.nullSafeHashCode(array);
assertThat(actual).isEqualTo(expected);
}
@Test
void nullSafeHashCodeWithShortArrayEqualToNull() {
assertThat(ObjectUtils.nullSafeHashCode((short[]) null)).isEqualTo(0);
Object[] array = null;
assertThat(ObjectUtils.nullSafeHashCode(array)).isEqualTo(0);
}
@Test

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

@ -23,6 +23,7 @@ import java.util.Collections; @@ -23,6 +23,7 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
@ -539,7 +540,7 @@ public class MultiServerUserRegistry implements SimpUserRegistry, SmartApplicati @@ -539,7 +540,7 @@ public class MultiServerUserRegistry implements SimpUserRegistry, SmartApplicati
@Override
public int hashCode() {
return getId().hashCode() * 31 + ObjectUtils.nullSafeHashCode(getSession());
return Objects.hash(getId(), getSession());
}
@Override

2
spring-messaging/src/main/java/org/springframework/messaging/support/GenericMessage.java

@ -98,7 +98,7 @@ public class GenericMessage<T> implements Message<T>, Serializable { @@ -98,7 +98,7 @@ public class GenericMessage<T> implements Message<T>, Serializable {
@Override
public int hashCode() {
// Using nullSafeHashCode for proper array hashCode handling
return ObjectUtils.nullSafeHashCode(this.payload) * 23 + this.headers.hashCode();
return ObjectUtils.nullSafeHash(this.payload, this.headers);
}
@Override

4
spring-messaging/src/test/java/org/springframework/messaging/simp/user/TestSimpSubscription.java

@ -16,6 +16,8 @@ @@ -16,6 +16,8 @@
package org.springframework.messaging.simp.user;
import java.util.Objects;
import org.springframework.lang.Nullable;
import org.springframework.util.ObjectUtils;
@ -66,7 +68,7 @@ public class TestSimpSubscription implements SimpSubscription { @@ -66,7 +68,7 @@ public class TestSimpSubscription implements SimpSubscription {
@Override
public int hashCode() {
return this.id.hashCode() * 31 + ObjectUtils.nullSafeHashCode(getSession());
return Objects.hash(this.id, getSession());
}
@Override

2
spring-r2dbc/src/main/java/org/springframework/r2dbc/core/Parameter.java

@ -117,7 +117,7 @@ public final class Parameter { @@ -117,7 +117,7 @@ public final class Parameter {
@Override
public int hashCode() {
return ObjectUtils.nullSafeHashCode(this.value) + ObjectUtils.nullSafeHashCode(this.type);
return ObjectUtils.nullSafeHash(this.value, this.type);
}
@Override

11
spring-web/src/main/java/org/springframework/http/ContentDisposition.java

@ -240,15 +240,8 @@ public final class ContentDisposition { @@ -240,15 +240,8 @@ public final class ContentDisposition {
@Override
public int hashCode() {
int result = ObjectUtils.nullSafeHashCode(this.type);
result = 31 * result + ObjectUtils.nullSafeHashCode(this.name);
result = 31 * result + ObjectUtils.nullSafeHashCode(this.filename);
result = 31 * result + ObjectUtils.nullSafeHashCode(this.charset);
result = 31 * result + ObjectUtils.nullSafeHashCode(this.size);
result = 31 * result + ObjectUtils.nullSafeHashCode(this.creationDate);
result = 31 * result + ObjectUtils.nullSafeHashCode(this.modificationDate);
result = 31 * result + ObjectUtils.nullSafeHashCode(this.readDate);
return result;
return ObjectUtils.nullSafeHash(this.type, this.name,this.filename,
this.charset, this.size, this.creationDate, this.modificationDate, this.readDate);
}
/**

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

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2002-2021 the original author or authors.
* Copyright 2002-2023 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -141,7 +141,7 @@ public class HttpEntity<T> { @@ -141,7 +141,7 @@ public class HttpEntity<T> {
@Override
public int hashCode() {
return (ObjectUtils.nullSafeHashCode(this.headers) * 29 + ObjectUtils.nullSafeHashCode(this.body));
return ObjectUtils.nullSafeHash(this.headers, this.body);
}
@Override

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

@ -21,6 +21,7 @@ import java.util.ArrayList; @@ -21,6 +21,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.StringJoiner;
import org.springframework.core.io.InputStreamResource;
@ -276,8 +277,7 @@ public abstract class HttpRange { @@ -276,8 +277,7 @@ public abstract class HttpRange {
@Override
public int hashCode() {
return (ObjectUtils.nullSafeHashCode(this.firstPos) * 31 +
ObjectUtils.nullSafeHashCode(this.lastPos));
return Objects.hash(this.firstPos, this.lastPos);
}
@Override

10
spring-web/src/main/java/org/springframework/http/ProblemDetail.java

@ -19,6 +19,7 @@ package org.springframework.http; @@ -19,6 +19,7 @@ package org.springframework.http;
import java.net.URI;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
@ -244,13 +245,8 @@ public class ProblemDetail { @@ -244,13 +245,8 @@ public class ProblemDetail {
@Override
public int hashCode() {
int result = this.type.hashCode();
result = 31 * result + ObjectUtils.nullSafeHashCode(getTitle());
result = 31 * result + this.status;
result = 31 * result + ObjectUtils.nullSafeHashCode(this.detail);
result = 31 * result + ObjectUtils.nullSafeHashCode(this.instance);
result = 31 * result + ObjectUtils.nullSafeHashCode(this.properties);
return result;
return Objects.hash(this.type, getTitle(), this.status, this.detail,
this.instance, this.properties);
}
@Override

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

@ -24,6 +24,7 @@ import java.nio.charset.Charset; @@ -24,6 +24,7 @@ import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.StringJoiner;
import java.util.function.BiFunction;
import java.util.function.UnaryOperator;
@ -566,14 +567,8 @@ final class HierarchicalUriComponents extends UriComponents { @@ -566,14 +567,8 @@ final class HierarchicalUriComponents extends UriComponents {
@Override
public int hashCode() {
int result = ObjectUtils.nullSafeHashCode(getScheme());
result = 31 * result + ObjectUtils.nullSafeHashCode(this.userInfo);
result = 31 * result + ObjectUtils.nullSafeHashCode(this.host);
result = 31 * result + ObjectUtils.nullSafeHashCode(this.port);
result = 31 * result + this.path.hashCode();
result = 31 * result + this.queryParams.hashCode();
result = 31 * result + ObjectUtils.nullSafeHashCode(getFragment());
return result;
return Objects.hash(getScheme(), this.userInfo, this.host, this.port,
this.path, this.queryParams, getFragment());
}

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

@ -21,6 +21,7 @@ import java.net.URISyntaxException; @@ -21,6 +21,7 @@ import java.net.URISyntaxException;
import java.nio.charset.Charset;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import org.springframework.lang.Nullable;
import org.springframework.util.LinkedMultiValueMap;
@ -166,10 +167,7 @@ final class OpaqueUriComponents extends UriComponents { @@ -166,10 +167,7 @@ final class OpaqueUriComponents extends UriComponents {
@Override
public int hashCode() {
int result = ObjectUtils.nullSafeHashCode(getScheme());
result = 31 * result + ObjectUtils.nullSafeHashCode(this.ssp);
result = 31 * result + ObjectUtils.nullSafeHashCode(getFragment());
return result;
return Objects.hash(getScheme(), this.ssp, getFragment());
}
}

4
spring-webflux/src/main/java/org/springframework/web/reactive/socket/CloseStatus.java

@ -16,6 +16,8 @@ @@ -16,6 +16,8 @@
package org.springframework.web.reactive.socket;
import java.util.Objects;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.ObjectUtils;
@ -231,7 +233,7 @@ public final class CloseStatus { @@ -231,7 +233,7 @@ public final class CloseStatus {
@Override
public int hashCode() {
return this.code * 29 + ObjectUtils.nullSafeHashCode(this.reason);
return Objects.hash(this.code, this.reason);
}
@Override

3
spring-websocket/src/main/java/org/springframework/web/socket/CloseStatus.java

@ -17,6 +17,7 @@ @@ -17,6 +17,7 @@
package org.springframework.web.socket;
import java.io.Serializable;
import java.util.Objects;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
@ -213,7 +214,7 @@ public final class CloseStatus implements Serializable { @@ -213,7 +214,7 @@ public final class CloseStatus implements Serializable {
@Override
public int hashCode() {
return this.code * 29 + ObjectUtils.nullSafeHashCode(this.reason);
return Objects.hash(this.code, this.reason);
}
@Override

Loading…
Cancel
Save