diff --git a/src/main/java/com/thealgorithms/maths/CollatzConjecture.java b/src/main/java/com/thealgorithms/maths/CollatzConjecture.java
new file mode 100644
index 000000000..980dc89b7
--- /dev/null
+++ b/src/main/java/com/thealgorithms/maths/CollatzConjecture.java
@@ -0,0 +1,42 @@
+package com.thealgorithms.maths;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * ...
+ */
+public class CollatzConjecture {
+
+ /**
+ * Calculate the next number of the sequence.
+ *
+ * @param n current number of the sequence
+ * @return next number of the sequence
+ */
+ public int nextNumber(final int n) {
+ if (n % 2 == 0) {
+ return n / 2;
+ }
+ return 3 * n + 1;
+ }
+
+ /**
+ * Calculate the Collatz sequence of any natural number.
+ *
+ * @param firstNumber starting number of the sequence
+ * @return sequence of the Collatz Conjecture
+ */
+ public List collatzConjecture(int firstNumber) {
+ if (firstNumber < 1) {
+ throw new IllegalArgumentException("Must be a natural number");
+ }
+ ArrayList result = new ArrayList<>();
+ result.add(firstNumber);
+ while (firstNumber != 1) {
+ result.add(nextNumber(firstNumber));
+ firstNumber = nextNumber(firstNumber);
+ }
+ return result;
+ }
+}
diff --git a/src/test/java/com/thealgorithms/maths/CollatzConjectureTest.java b/src/test/java/com/thealgorithms/maths/CollatzConjectureTest.java
new file mode 100644
index 000000000..e63a956dc
--- /dev/null
+++ b/src/test/java/com/thealgorithms/maths/CollatzConjectureTest.java
@@ -0,0 +1,40 @@
+package com.thealgorithms.maths;
+
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class CollatzConjectureTest {
+
+ static CollatzConjecture cConjecture;
+
+ @BeforeAll
+ static void setUp() {
+ cConjecture = new CollatzConjecture();
+ }
+
+ @Test
+ void nextNumberFromEvenNumber() {
+ assertEquals(25, cConjecture.nextNumber(50));
+ }
+
+ @Test
+ void nextNumberFromOddNumber() {
+ assertEquals(154, cConjecture.nextNumber(51));
+ }
+
+ @Test
+ void collatzConjecture() {
+ final List expected = List.of(35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1);
+ assertIterableEquals(expected, cConjecture.collatzConjecture(35));
+ }
+
+ @Test
+ void sequenceOfNotNaturalFirstNumber() {
+ assertThrows(IllegalArgumentException.class, () -> cConjecture.collatzConjecture(0));
+ assertThrows(IllegalArgumentException.class, () -> cConjecture.collatzConjecture(-1));
+ }
+}
\ No newline at end of file