Skip to content

Commit 46d171a

Browse files
committed
Restore creation of plain HashSet/HashMap for direct HashSet/HashMap type
Closes gh-30596 (cherry picked from commit cdc4497)
1 parent 259bd52 commit 46d171a

File tree

2 files changed

+14
-8
lines changed

2 files changed

+14
-8
lines changed

spring-core/src/main/java/org/springframework/core/CollectionFactory.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ public static <E> Collection<E> createCollection(Class<?> collectionType, int ca
183183
@SuppressWarnings({"unchecked", "cast"})
184184
public static <E> Collection<E> createCollection(Class<?> collectionType, @Nullable Class<?> elementType, int capacity) {
185185
Assert.notNull(collectionType, "Collection type must not be null");
186-
if (LinkedHashSet.class == collectionType || HashSet.class == collectionType ||
186+
if (LinkedHashSet.class == collectionType ||
187187
Set.class == collectionType || Collection.class == collectionType) {
188188
return new LinkedHashSet<>(capacity);
189189
}
@@ -202,6 +202,9 @@ else if (EnumSet.class.isAssignableFrom(collectionType)) {
202202
// Cast is necessary for compilation in Eclipse 4.4.1.
203203
return (Collection<E>) EnumSet.noneOf(asEnumType(elementType));
204204
}
205+
else if (HashSet.class == collectionType) {
206+
return new HashSet<>(capacity);
207+
}
205208
else {
206209
if (collectionType.isInterface() || !Collection.class.isAssignableFrom(collectionType)) {
207210
throw new IllegalArgumentException("Unsupported Collection type: " + collectionType.getName());
@@ -302,7 +305,7 @@ public static <K, V> Map<K, V> createMap(Class<?> mapType, int capacity) {
302305
@SuppressWarnings({"rawtypes", "unchecked"})
303306
public static <K, V> Map<K, V> createMap(Class<?> mapType, @Nullable Class<?> keyType, int capacity) {
304307
Assert.notNull(mapType, "Map type must not be null");
305-
if (LinkedHashMap.class == mapType || HashMap.class == mapType || Map.class == mapType) {
308+
if (LinkedHashMap.class == mapType || Map.class == mapType) {
306309
return new LinkedHashMap<>(capacity);
307310
}
308311
else if (LinkedMultiValueMap.class == mapType || MultiValueMap.class == mapType) {
@@ -315,6 +318,9 @@ else if (EnumMap.class == mapType) {
315318
Assert.notNull(keyType, "Cannot create EnumMap for unknown key type");
316319
return new EnumMap(asEnumType(keyType));
317320
}
321+
else if (HashMap.class == mapType) {
322+
return new HashMap<>(capacity);
323+
}
318324
else {
319325
if (mapType.isInterface() || !Map.class.isAssignableFrom(mapType)) {
320326
throw new IllegalArgumentException("Unsupported Map type: " + mapType.getName());

spring-core/src/test/java/org/springframework/core/CollectionFactoryTests.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -217,15 +217,15 @@ void createsCollectionsCorrectly() {
217217

218218
// concrete types
219219
testCollection(ArrayList.class, ArrayList.class);
220-
testCollection(HashSet.class, LinkedHashSet.class);
220+
testCollection(HashSet.class, HashSet.class);
221221
testCollection(LinkedHashSet.class, LinkedHashSet.class);
222222
testCollection(TreeSet.class, TreeSet.class);
223223
}
224224

225225
private void testCollection(Class<?> collectionType, Class<?> resultType) {
226226
assertThat(CollectionFactory.isApproximableCollectionType(collectionType)).isTrue();
227-
assertThat(createCollection(collectionType, 0)).isInstanceOf(resultType);
228-
assertThat(createCollection(collectionType, String.class, 0)).isInstanceOf(resultType);
227+
assertThat(createCollection(collectionType, 0)).isExactlyInstanceOf(resultType);
228+
assertThat(createCollection(collectionType, String.class, 0)).isExactlyInstanceOf(resultType);
229229
}
230230

231231
@Test
@@ -266,16 +266,16 @@ void createsMapsCorrectly() {
266266
testMap(MultiValueMap.class, LinkedMultiValueMap.class);
267267

268268
// concrete types
269-
testMap(HashMap.class, LinkedHashMap.class);
269+
testMap(HashMap.class, HashMap.class);
270270
testMap(LinkedHashMap.class, LinkedHashMap.class);
271271
testMap(TreeMap.class, TreeMap.class);
272272
testMap(LinkedMultiValueMap.class, LinkedMultiValueMap.class);
273273
}
274274

275275
private void testMap(Class<?> mapType, Class<?> resultType) {
276276
assertThat(CollectionFactory.isApproximableMapType(mapType)).isTrue();
277-
assertThat(createMap(mapType, 0)).isInstanceOf(resultType);
278-
assertThat(createMap(mapType, String.class, 0)).isInstanceOf(resultType);
277+
assertThat(createMap(mapType, 0)).isExactlyInstanceOf(resultType);
278+
assertThat(createMap(mapType, String.class, 0)).isExactlyInstanceOf(resultType);
279279
}
280280

281281
@Test

0 commit comments

Comments
 (0)