diff --git a/core-java-collections-map/README.md b/core-java-collections-map/README.md
new file mode 100644
index 0000000000..da02928118
--- /dev/null
+++ b/core-java-collections-map/README.md
@@ -0,0 +1,6 @@
+=========
+
+## Core Java Collections 2
+
+### Relevant Articles:
+- Java - Copying a HashMap
diff --git a/core-java-collections-map/pom.xml b/core-java-collections-map/pom.xml
new file mode 100644
index 0000000000..8c0aef54bf
--- /dev/null
+++ b/core-java-collections-map/pom.xml
@@ -0,0 +1,78 @@
+
+ 4.0.0
+ core-java-collections-map
+ 0.1.0-SNAPSHOT
+ core-java-collections-map
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../parent-java
+
+
+
+
+ org.apache.commons
+ commons-collections4
+ ${commons-collections4.version}
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+ org.eclipse.collections
+ eclipse-collections
+ ${eclipse.collections.version}
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+ org.junit.platform
+ junit-platform-runner
+ ${junit.platform.version}
+ test
+
+
+ org.openjdk.jmh
+ jmh-core
+ ${openjdk.jmh.version}
+
+
+ org.openjdk.jmh
+ jmh-generator-annprocess
+ ${openjdk.jmh.version}
+
+
+ org.apache.commons
+ commons-exec
+ ${commons-exec.version}
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+ provided
+
+
+
+
+ 1.19
+ 1.2.0
+ 3.8.1
+ 4.1
+ 4.01
+ 1.7.0
+ 3.11.1
+ 7.1.0
+ 1.3
+
+
diff --git a/core-java-collections-map/src/main/java/com/baeldung/copyinghashmap/CopyHashMap.java b/core-java-collections-map/src/main/java/com/baeldung/copyinghashmap/CopyHashMap.java
new file mode 100644
index 0000000000..e1649f593c
--- /dev/null
+++ b/core-java-collections-map/src/main/java/com/baeldung/copyinghashmap/CopyHashMap.java
@@ -0,0 +1,55 @@
+package com.baeldung.copyinghashmap;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.SerializationUtils;
+
+public class CopyHashMap {
+
+ public static HashMap copyUsingConstructor(HashMap originalMap) {
+ return new HashMap(originalMap);
+ }
+
+ public static HashMap copyUsingClone(HashMap originalMap) {
+ return (HashMap) originalMap.clone();
+ }
+
+ public static HashMap copyUsingPut(HashMap originalMap) {
+ HashMap shallowCopy = new HashMap();
+ Set> entries = originalMap.entrySet();
+ for(Map.Entry mapEntry: entries) {
+ shallowCopy.put(mapEntry.getKey(), mapEntry.getValue());
+ }
+
+ return shallowCopy;
+ }
+
+ public static HashMap copyUsingPutAll(HashMap originalMap) {
+ HashMap shallowCopy = new HashMap();
+ shallowCopy.putAll(originalMap);
+
+ return shallowCopy;
+ }
+
+ public static HashMap copyUsingJava8Stream(HashMap originalMap) {
+ Set> entries = originalMap.entrySet();
+ HashMap shallowCopy = (HashMap) entries
+ .stream()
+ .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+
+ return shallowCopy;
+ }
+
+ public static HashMap shallowCopy(HashMap originalMap) {
+ return (HashMap) originalMap.clone();
+ }
+
+ public static HashMap deepCopy(HashMap originalMap) {
+ return SerializationUtils.clone(originalMap);
+ }
+
+}
diff --git a/core-java-collections-map/src/test/java/com/baeldung/copyinghashmap/CopyHashMapUnitTest.java b/core-java-collections-map/src/test/java/com/baeldung/copyinghashmap/CopyHashMapUnitTest.java
new file mode 100644
index 0000000000..400696d97a
--- /dev/null
+++ b/core-java-collections-map/src/test/java/com/baeldung/copyinghashmap/CopyHashMapUnitTest.java
@@ -0,0 +1,77 @@
+package com.baeldung.copyinghashmap;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Test;
+
+import com.google.common.collect.ImmutableMap;
+
+public class CopyHashMapUnitTest {
+
+ @Test
+ public void givenHashMap_whenShallowCopy_thenCopyisNotSameAsOriginal() {
+
+ HashMap map = new HashMap<>();
+ Employee emp1 = new Employee("John");
+ Employee emp2 = new Employee("Norman");
+ map.put("emp1",emp1);
+ map.put("emp2",emp2);
+
+ HashMap shallowCopy = CopyHashMap.shallowCopy(map);
+
+ assertThat(shallowCopy).isNotSameAs(map);
+
+ }
+
+ @Test
+ public void givenHashMap_whenShallowCopyModifyingOriginalObject_thenCopyShouldChange() {
+
+ HashMap map = new HashMap<>();
+ Employee emp1 = new Employee("John");
+ Employee emp2 = new Employee("Norman");
+ map.put("emp1",emp1);
+ map.put("emp2",emp2);
+
+ HashMap shallowCopy = CopyHashMap.shallowCopy(map);
+
+ emp1.setName("Johny");
+
+ assertThat(shallowCopy.get("emp1")).isEqualTo(map.get("emp1"));
+
+ }
+
+ @Test
+ public void givenHashMap_whenDeepCopyModifyingOriginalObject_thenCopyShouldNotChange() {
+
+ HashMap map = new HashMap<>();
+ Employee emp1 = new Employee("John");
+ Employee emp2 = new Employee("Norman");
+ map.put("emp1",emp1);
+ map.put("emp2",emp2);
+ HashMap deepCopy = CopyHashMap.deepCopy(map);
+
+ emp1.setName("Johny");
+
+ assertThat(deepCopy.get("emp1")).isNotEqualTo(map.get("emp1"));
+
+ }
+
+ @Test
+ public void givenImmutableMap_whenCopyUsingGuava_thenCopyShouldNotChange() {
+ Employee emp1 = new Employee("John");
+ Employee emp2 = new Employee("Norman");
+
+ Map map = ImmutableMap. builder()
+ .put("emp1",emp1)
+ .put("emp2",emp2)
+ .build();
+ Map shallowCopy = ImmutableMap.copyOf(map);
+
+ assertThat(shallowCopy).isSameAs(map);
+
+ }
+
+}
diff --git a/core-java-collections-map/src/test/java/com/baeldung/copyinghashmap/Employee.java b/core-java-collections-map/src/test/java/com/baeldung/copyinghashmap/Employee.java
new file mode 100644
index 0000000000..b47fdc768e
--- /dev/null
+++ b/core-java-collections-map/src/test/java/com/baeldung/copyinghashmap/Employee.java
@@ -0,0 +1,28 @@
+package com.baeldung.copyinghashmap;
+
+import java.io.Serializable;
+
+public class Employee implements Serializable{
+
+ private String name;
+
+ public Employee(String name) {
+ super();
+ this.name = name;
+ }
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public String toString() {
+ return this.name;
+ }
+
+}
+
+
diff --git a/pom.xml b/pom.xml
index 7fb9ca351f..bdd8403231 100644
--- a/pom.xml
+++ b/pom.xml
@@ -385,6 +385,7 @@
core-java-arrays
core-java-collections
+ core-java-collections-map
core-java-collections-list
core-java-concurrency-basic
core-java-concurrency-collections
@@ -1041,6 +1042,7 @@
core-java-arrays
core-java-collections
+ core-java-collections-map
core-java-collections-list
core-java-concurrency-basic
core-java-concurrency-collections