Skip to content

Commit 8d8bb04

Browse files
committed
ConcurrentReferenceHashMap properly handles getOrDefault for null values
Issue: SPR-16584 (cherry picked from commit 356ef45)
1 parent 2cac3a8 commit 8d8bb04

File tree

2 files changed

+101
-99
lines changed

2 files changed

+101
-99
lines changed

spring-core/src/main/java/org/springframework/util/ConcurrentReferenceHashMap.java

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2017 the original author or authors.
2+
* Copyright 2002-2018 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -223,18 +223,27 @@ protected int getHash(Object o) {
223223

224224
@Override
225225
public V get(Object key) {
226-
Reference<K, V> reference = getReference(key, Restructure.WHEN_NECESSARY);
227-
Entry<K, V> entry = (reference != null ? reference.get() : null);
226+
Entry<K, V> entry = getEntryIfAvailable(key);
228227
return (entry != null ? entry.getValue() : null);
229228
}
230229

230+
@Override
231+
public V getOrDefault(Object key, V defaultValue) {
232+
Entry<K, V> entry = getEntryIfAvailable(key);
233+
return (entry != null ? entry.getValue() : defaultValue);
234+
}
235+
231236
@Override
232237
public boolean containsKey(Object key) {
233-
Reference<K, V> reference = getReference(key, Restructure.WHEN_NECESSARY);
234-
Entry<K, V> entry = (reference != null ? reference.get() : null);
238+
Entry<K, V> entry = getEntryIfAvailable(key);
235239
return (entry != null && ObjectUtils.nullSafeEquals(entry.getKey(), key));
236240
}
237241

242+
private Entry<K, V> getEntryIfAvailable(Object key) {
243+
Reference<K, V> reference = getReference(key, Restructure.WHEN_NECESSARY);
244+
return (reference != null ? reference.get() : null);
245+
}
246+
238247
/**
239248
* Return a {@link Reference} to the {@link Entry} for the specified {@code key},
240249
* or {@code null} if not found.
@@ -582,17 +591,18 @@ protected final void restructureIfNecessary(boolean allowResize) {
582591
}
583592

584593
private Reference<K, V> findInChain(Reference<K, V> reference, Object key, int hash) {
585-
while (reference != null) {
586-
if (reference.getHash() == hash) {
587-
Entry<K, V> entry = reference.get();
594+
Reference<K, V> currRef = reference;
595+
while (currRef != null) {
596+
if (currRef.getHash() == hash) {
597+
Entry<K, V> entry = currRef.get();
588598
if (entry != null) {
589599
K entryKey = entry.getKey();
590-
if (entryKey == key || entryKey.equals(key)) {
591-
return reference;
600+
if (ObjectUtils.nullSafeEquals(entryKey, key)) {
601+
return currRef;
592602
}
593603
}
594604
}
595-
reference = reference.getNext();
605+
currRef = currRef.getNext();
596606
}
597607
return null;
598608
}

0 commit comments

Comments
 (0)