diff --git a/java-shallow-deep-copy/pom.xml b/java-shallow-deep-copy/pom.xml
new file mode 100644
index 0000000000..68ff8fc8e7
--- /dev/null
+++ b/java-shallow-deep-copy/pom.xml
@@ -0,0 +1,32 @@
+
+ 4.0.0
+
+ org.example
+ java-shallow-deep-copy
+ 1.0-SNAPSHOT
+ jar
+
+ java-shallow-deep-copy
+ http://maven.apache.org
+
+
+ UTF-8
+ 18
+ 18
+
+
+
+
+ org.junit.jupiter
+ junit-jupiter-api
+ 5.9.1
+ test
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.1
+
+
+
diff --git a/java-shallow-deep-copy/src/main/java/com/baeldung/java_shallow_deep_copy/App.java b/java-shallow-deep-copy/src/main/java/com/baeldung/java_shallow_deep_copy/App.java
new file mode 100644
index 0000000000..0f01a498a6
--- /dev/null
+++ b/java-shallow-deep-copy/src/main/java/com/baeldung/java_shallow_deep_copy/App.java
@@ -0,0 +1,13 @@
+package com.baeldung.java_shallow_deep_copy;
+
+/**
+ * Hello world!
+ *
+ */
+public class App
+{
+ public static void main( String[] args )
+ {
+
+ }
+}
diff --git a/java-shallow-deep-copy/src/main/java/com/baeldung/java_shallow_deep_copy/data/Person.java b/java-shallow-deep-copy/src/main/java/com/baeldung/java_shallow_deep_copy/data/Person.java
new file mode 100644
index 0000000000..e52a669e28
--- /dev/null
+++ b/java-shallow-deep-copy/src/main/java/com/baeldung/java_shallow_deep_copy/data/Person.java
@@ -0,0 +1,34 @@
+package com.baeldung.java_shallow_deep_copy.data;
+
+import java.util.List;
+
+public class Person {
+
+ private String name;
+ private String surname;
+ private List addresses;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getSurname() {
+ return surname;
+ }
+
+ public void setSurname(String surname) {
+ this.surname = surname;
+ }
+
+ public List getAddresses() {
+ return addresses;
+ }
+
+ public void setAddresses(List addresses) {
+ this.addresses = addresses;
+ }
+}
diff --git a/java-shallow-deep-copy/src/main/java/com/baeldung/java_shallow_deep_copy/data/PersonDeep.java b/java-shallow-deep-copy/src/main/java/com/baeldung/java_shallow_deep_copy/data/PersonDeep.java
new file mode 100644
index 0000000000..a2823566b8
--- /dev/null
+++ b/java-shallow-deep-copy/src/main/java/com/baeldung/java_shallow_deep_copy/data/PersonDeep.java
@@ -0,0 +1,15 @@
+package com.baeldung.java_shallow_deep_copy.data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class PersonDeep extends Person{
+
+ public PersonDeep(String name, String surname, List addresses) {
+ this.setName(name);
+ this.setSurname(surname);
+ List deepCopyList = new ArrayList<>();
+ deepCopyList.addAll(addresses);
+ this.setAddresses(deepCopyList);
+ }
+}
diff --git a/java-shallow-deep-copy/src/main/java/com/baeldung/java_shallow_deep_copy/data/PersonShallow.java b/java-shallow-deep-copy/src/main/java/com/baeldung/java_shallow_deep_copy/data/PersonShallow.java
new file mode 100644
index 0000000000..2221d8b924
--- /dev/null
+++ b/java-shallow-deep-copy/src/main/java/com/baeldung/java_shallow_deep_copy/data/PersonShallow.java
@@ -0,0 +1,14 @@
+package com.baeldung.java_shallow_deep_copy.data;
+
+import java.util.List;
+
+public class PersonShallow extends Person {
+
+ public PersonShallow(String name, String surname, List addresses) {
+ this.setName(name);
+ this.setSurname(surname);
+ this.setAddresses(addresses);
+ }
+
+
+}
diff --git a/java-shallow-deep-copy/src/test/java/com/baeldung/java_shallow_deep_copy/unit/DeepCopyTest.java b/java-shallow-deep-copy/src/test/java/com/baeldung/java_shallow_deep_copy/unit/DeepCopyTest.java
new file mode 100644
index 0000000000..5fbdbabad5
--- /dev/null
+++ b/java-shallow-deep-copy/src/test/java/com/baeldung/java_shallow_deep_copy/unit/DeepCopyTest.java
@@ -0,0 +1,26 @@
+package com.baeldung.java_shallow_deep_copy.unit;
+
+import com.baeldung.java_shallow_deep_copy.data.PersonDeep;
+import com.baeldung.java_shallow_deep_copy.data.PersonShallow;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class DeepCopyTest {
+
+ @Test
+ void whenTheParameterIsNotAnImmutableObject_thenShouldDoADeepCopy (){
+ String name = "Hello";
+ String surname = "World";
+ List addresses = new ArrayList<>();
+ addresses.add("Standford street");
+ PersonDeep personShallow = new PersonDeep(name,surname,addresses);
+ personShallow.getAddresses().forEach(System.out :: println);
+ Assertions.assertEquals(addresses, personShallow.getAddresses());
+ addresses.add("Oxford street");
+ personShallow.getAddresses().forEach(System.out :: println);
+ Assertions.assertNotEquals(addresses, personShallow.getAddresses());
+ }
+}
diff --git a/java-shallow-deep-copy/src/test/java/com/baeldung/java_shallow_deep_copy/unit/ShallowCopyTest.java b/java-shallow-deep-copy/src/test/java/com/baeldung/java_shallow_deep_copy/unit/ShallowCopyTest.java
new file mode 100644
index 0000000000..daef700145
--- /dev/null
+++ b/java-shallow-deep-copy/src/test/java/com/baeldung/java_shallow_deep_copy/unit/ShallowCopyTest.java
@@ -0,0 +1,38 @@
+package com.baeldung.java_shallow_deep_copy.unit;
+
+import com.baeldung.java_shallow_deep_copy.data.PersonShallow;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+public class ShallowCopyTest {
+
+ @Test
+ void whenTheParameterIsAnImmutableObject_thenShouldNotChangeTheValue (){
+ String name = "Hello";
+ String surname = "World";
+ PersonShallow personShallow = new PersonShallow(name,surname,null);
+ surname = "Pluto";
+ Assertions.assertNotEquals(surname, personShallow.getSurname());
+ }
+
+ @Test
+ void whenTheParameterIsNotAnImmutableObject_thenShouldDoAShallowCopy (){
+ String name = "Hello";
+ String surname = "World";
+ List addresses = new ArrayList<>();
+ addresses.add("Standford street");
+ PersonShallow personShallow = new PersonShallow(name,surname,addresses);
+ personShallow.getAddresses().forEach(System.out :: println);
+ Assertions.assertEquals(addresses, personShallow.getAddresses());
+ addresses.add("Oxford street");
+ personShallow.getAddresses().forEach(System.out :: println);
+ Assertions.assertEquals(addresses, personShallow.getAddresses());
+ }
+
+
+
+}