diff --git a/src/main/java/com/search/ExponentialSearch.java b/src/main/java/com/search/ExponentialSearch.java
new file mode 100644
index 00000000..e60940c4
--- /dev/null
+++ b/src/main/java/com/search/ExponentialSearch.java
@@ -0,0 +1,39 @@
+package src.main.java.com.search;
+
+import java.util.Arrays;
+
+/**
+ * Exponential search (also called doubling search or galloping search or Struzik search) is an algorithm which finds
+ * the position of a target value within an array. It works by determining a range that the search key resides in and
+ * performing a binary search within that range
+ *
+ * Worst-case performance O(n)
+ * Best-case performance O(1)
+ * Average performance O(Log n)
+ * Worst-case space complexity O(Log n)
+ */
+public class ExponentialSearch {
+ /**
+ * @param array is an array where the element should be found
+ * @param key is an element which should be found
+ * @param is any comparable type
+ * @return The index position of the key in the array, returns -1 for empty array
+ */
+ public > int findIndex(T[] array, T key) {
+ int size = array.length;
+ if(size == 0)
+ return -1;
+ // If the element is present at first position
+ if (array[0] == key)
+ return 0;
+
+ // Find the range for binary search by repeated doubling
+ int i = 1;
+ while (i < size && array[i].compareTo(key) <= 0) {
+ i = i * 2;
+ }
+
+ // Call binary search for the range found
+ return Arrays.binarySearch(array, i / 2, Math.min(i, size), key);
+ }
+}
diff --git a/src/test/java/com/search/ExponentialSearchTest.java b/src/test/java/com/search/ExponentialSearchTest.java
new file mode 100644
index 00000000..1023e8e3
--- /dev/null
+++ b/src/test/java/com/search/ExponentialSearchTest.java
@@ -0,0 +1,31 @@
+package src.test.java.com.search;
+
+import org.junit.Assert;
+import org.junit.Test;
+import src.main.java.com.search.ExponentialSearch;
+
+public class ExponentialSearchTest {
+ @Test
+ public void testExponentialSearch() {
+ ExponentialSearch expSearch = new ExponentialSearch();
+
+ Integer[] arr = {11, 14, 23, 29, 36, 40, 42, 52};
+ int x = 36;
+ int index = expSearch.findIndex(arr, x);
+ Assert.assertEquals("Incorrect index", 4, index);
+
+ Integer[] arrTwo = {-210, -190, -180, -160, -130, -120, -100};
+ x = -120;
+ index = expSearch.findIndex(arrTwo, x);
+ Assert.assertEquals("Incorrect index", 5, index);
+
+ String[] arrString = {"101", "122", "136", "165", "225", "251", "291"};
+ String stringX = "122";
+ index = expSearch.findIndex(arrString, stringX);
+ Assert.assertEquals("Incorrect index", 1, index);
+
+ String[] arrThree = {};
+ Assert.assertEquals("Incorrect index", -1, expSearch.findIndex(arrThree, ""));
+ }
+
+}