diff --git a/core-java-modules/core-java-arrays-3/README.md b/core-java-modules/core-java-arrays-3/README.md
new file mode 100644
index 0000000000..9f2885a2ce
--- /dev/null
+++ b/core-java-modules/core-java-arrays-3/README.md
@@ -0,0 +1,5 @@
+## Core Java Arrays (Part 3)
+
+This module contains articles about Java arrays
+
+## Relevant Articles
diff --git a/core-java-modules/core-java-arrays-3/pom.xml b/core-java-modules/core-java-arrays-3/pom.xml
new file mode 100644
index 0000000000..b39a9af653
--- /dev/null
+++ b/core-java-modules/core-java-arrays-3/pom.xml
@@ -0,0 +1,31 @@
+
+
+ 4.0.0
+ core-java-arrays-3
+ 0.1.0-SNAPSHOT
+ core-java-arrays-3
+ jar
+
+
+ com.baeldung
+ parent-java
+ 0.0.1-SNAPSHOT
+ ../../parent-java
+
+
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+ test
+
+
+
+
+ 3.14.0
+
+
+
\ No newline at end of file
diff --git a/core-java-modules/core-java-arrays-3/src/test/java/com/baeldung/arrays/deepequals/ArraysDeepEqualsUnitTest.java b/core-java-modules/core-java-arrays-3/src/test/java/com/baeldung/arrays/deepequals/ArraysDeepEqualsUnitTest.java
new file mode 100644
index 0000000000..aa577ea7bd
--- /dev/null
+++ b/core-java-modules/core-java-arrays-3/src/test/java/com/baeldung/arrays/deepequals/ArraysDeepEqualsUnitTest.java
@@ -0,0 +1,100 @@
+package com.baeldung.arrays.deepequals;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Arrays;
+import java.util.Objects;
+import org.junit.jupiter.api.Test;
+
+public class ArraysDeepEqualsUnitTest {
+
+ class Person {
+ private int id;
+ private String name;
+ private int age;
+
+ Person(int id, String name, int age) {
+ this.id = id;
+ this.name = name;
+ this.age = age;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (this == obj) {
+ return true;
+ }
+ if (obj == null) {
+ return false;
+ }
+ if (!(obj instanceof Person))
+ return false;
+ Person person = (Person) obj;
+ return id == person.id && name.equals(person.name) && age == person.age;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(id, name, age);
+ }
+ }
+
+ @Test
+ void givenTwoUnidimensionalObjectTypeArrays_whenUsingEqualsAndDeepEquals_thenBothShouldReturnTrue() {
+ Object[] anArray = new Object[] { "string1", "string2", "string3" };
+ Object[] anotherArray = new Object[] { "string1", "string2", "string3" };
+
+ assertTrue(Arrays.equals(anArray, anotherArray));
+ assertTrue(Arrays.deepEquals(anArray, anotherArray));
+ }
+
+ @Test
+ void givenTwoUnidimensionalObjectTypeArraysWithNullElements_whenUsingEqualsAndDeepEquals_thenBothShouldReturnTrue() {
+ Object[] anArray = new Object[] { "string1", null, "string3" };
+ Object[] anotherArray = new Object[] { "string1", null, "string3" };
+
+ assertTrue(Arrays.equals(anArray, anotherArray));
+ assertTrue(Arrays.deepEquals(anArray, anotherArray));
+ }
+
+ @Test
+ void givenTwoUnidimensionalObjectTypeArraysWithNestedElements_whenUsingEqualsAndDeepEquals_thenShouldReturnDifferently() {
+ Object[] anArray = new Object[] { "string1", null, new String[] { "nestedString1", "nestedString2" } };
+ Object[] anotherArray = new Object[] { "string1", null, new String[] { "nestedString1", "nestedString2" } };
+
+ assertFalse(Arrays.equals(anArray, anotherArray));
+ assertTrue(Arrays.deepEquals(anArray, anotherArray));
+ }
+
+ @Test
+ void givenTwoMultidimensionalPrimitiveTypeArrays_whenUsingEqualsAndDeepEquals_thenBothShouldReturnDifferently() {
+ int[][] anArray = { { 1, 2, 3 }, { 4, 5, 6, 9 }, { 7 } };
+ int[][] anotherArray = { { 1, 2, 3 }, { 4, 5, 6, 9 }, { 7 } };
+
+ assertFalse(Arrays.equals(anArray, anotherArray));
+ assertTrue(Arrays.deepEquals(anArray, anotherArray));
+ }
+
+ @Test
+ void givenTwoMultidimensionalObjectTypeArrays_whenUsingEqualsAndDeepEquals_thenBothShouldReturnDifferently() {
+ Person personArray1[][] = { { new Person(1, "John", 22), new Person(2, "Mike", 23) },
+ { new Person(3, "Steve", 27), new Person(4, "Gary", 28) } };
+ Person personArray2[][] = { { new Person(1, "John", 22), new Person(2, "Mike", 23) },
+ { new Person(3, "Steve", 27), new Person(4, "Gary", 28) } };
+
+ assertFalse(Arrays.equals(personArray1, personArray2));
+ assertTrue(Arrays.deepEquals(personArray1, personArray2));
+ }
+
+ @Test
+ void givenTwoMultidimensionalObjectTypeArrays_whenUsingDeepEqualsFromObjectsAndArraysClasses_thenBothShouldReturnTrue() {
+ Person personArray1[][] = { { new Person(1, "John", 22), new Person(2, "Mike", 23) },
+ { new Person(3, "Steve", 27), new Person(4, "Gary", 28) } };
+ Person personArray2[][] = { { new Person(1, "John", 22), new Person(2, "Mike", 23) },
+ { new Person(3, "Steve", 27), new Person(4, "Gary", 28) } };
+
+ assertTrue(Objects.deepEquals(personArray1, personArray2));
+ assertTrue(Arrays.deepEquals(personArray1, personArray2));
+ }
+}
diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml
index c1a9acca6b..424fbc5150 100644
--- a/core-java-modules/pom.xml
+++ b/core-java-modules/pom.xml
@@ -31,6 +31,7 @@
core-java-annotations
core-java-arrays
core-java-arrays-2
+ core-java-arrays-3
core-java-collections
core-java-collections-2