diff --git a/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/HashMapWithMaxSizeLimit.java b/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/HashMapWithMaxSizeLimit.java new file mode 100644 index 0000000000..63736e49f3 --- /dev/null +++ b/core-java-modules/core-java-collections-maps-7/src/main/java/com/baeldung/map/HashMapWithMaxSizeLimit.java @@ -0,0 +1,25 @@ +package com.baeldung.map; + +import java.util.HashMap; + +public class HashMapWithMaxSizeLimit extends HashMap { + private int maxSize = -1; + + public HashMapWithMaxSizeLimit() { + super(); + } + + public HashMapWithMaxSizeLimit(int maxSize) { + super(); + this.maxSize = maxSize; + } + + @Override + public V put(K key, V value) { + if (this.maxSize == -1 || this.containsKey(key) || this.size() < this.maxSize) { + return super.put(key, value); + } + throw new RuntimeException("Max size exceeded!"); + } + +} diff --git a/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByCustomHashMapUnitTest.java b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByCustomHashMapUnitTest.java new file mode 100644 index 0000000000..0846baae1a --- /dev/null +++ b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByCustomHashMapUnitTest.java @@ -0,0 +1,60 @@ +package com.baeldung.map; + +import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.junit.jupiter.api.Test; + +class LimitMaxSizeHashMapByCustomHashMapUnitTest { + + private final int MAX_SIZE = 4; + private HashMapWithMaxSizeLimit hashMapWithMaxSizeLimit; + + @Test + void givenCustomHashMapObject_whenThereIsNoLimit_thenDoesNotThrowException() { + hashMapWithMaxSizeLimit = new HashMapWithMaxSizeLimit(); + assertDoesNotThrow(() -> { + for (int i = 0; i < 10000; i++) { + hashMapWithMaxSizeLimit.put(i, i + ""); + } + }); + } + + @Test + void givenCustomHashMapObject_whenLimitNotReached_thenDoesNotThrowException() { + hashMapWithMaxSizeLimit = new HashMapWithMaxSizeLimit(MAX_SIZE); + assertDoesNotThrow(() -> { + for (int i = 0; i < 4; i++) { + hashMapWithMaxSizeLimit.put(i, i + ""); + } + }); + } + + @Test + void givenCustomHashMapObject_whenReplacingValueWhenLimitIsReached_thenDoesNotThrowException() { + hashMapWithMaxSizeLimit = new HashMapWithMaxSizeLimit(MAX_SIZE); + assertDoesNotThrow(() -> { + hashMapWithMaxSizeLimit.put(1, "One"); + hashMapWithMaxSizeLimit.put(2, "Two"); + hashMapWithMaxSizeLimit.put(3, "Three"); + hashMapWithMaxSizeLimit.put(4, "Four"); + hashMapWithMaxSizeLimit.put(4, "4"); + }); + } + + @Test + void givenCustomHashMapObject_whenLimitExceeded_thenThrowsException() { + hashMapWithMaxSizeLimit = new HashMapWithMaxSizeLimit(MAX_SIZE); + Exception exception = assertThrows(RuntimeException.class, () -> { + for (int i = 0; i < 5; i++) { + hashMapWithMaxSizeLimit.put(i, i + ""); + } + }); + + String messageThrownWhenSizeExceedsLimit = "Max size exceeded!"; + String actualMessage = exception.getMessage(); + assertTrue(actualMessage.equals(messageThrownWhenSizeExceedsLimit)); + } + +} diff --git a/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByLinkedHashMapUnitTest.java b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByLinkedHashMapUnitTest.java new file mode 100644 index 0000000000..d32d98da3a --- /dev/null +++ b/core-java-modules/core-java-collections-maps-7/src/test/java/com/baeldung/map/LimitMaxSizeHashMapByLinkedHashMapUnitTest.java @@ -0,0 +1,38 @@ +package com.baeldung.map; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; + +import java.util.LinkedHashMap; +import java.util.Map; + +import org.junit.jupiter.api.Test; + +class LimitMaxSizeHashMapByLinkedHashMapUnitTest { + + @Test + void givenLinkedHashMapObject_whenAddingNewEntry_thenEldestEntryIsRemoved() { + final int MAX_SIZE = 4; + LinkedHashMap linkedHashMap; + linkedHashMap = new LinkedHashMap() { + private static final long serialVersionUID = 1L; + + @Override + protected boolean removeEldestEntry(Map.Entry eldest) { + return size() > MAX_SIZE; + } + }; + linkedHashMap.put(1, "One"); + linkedHashMap.put(2, "Two"); + linkedHashMap.put(3, "Three"); + linkedHashMap.put(4, "Four"); + linkedHashMap.put(5, "Five"); + String[] expectedArrayAfterFive = { "Two", "Three", "Four", "Five" }; + assertArrayEquals(expectedArrayAfterFive, linkedHashMap.values() + .toArray()); + linkedHashMap.put(6, "Six"); + String[] expectedArrayAfterSix = { "Three", "Four", "Five", "Six" }; + assertArrayEquals(expectedArrayAfterSix, linkedHashMap.values() + .toArray()); + } + +}