Core Java

Linear Search Java Example

1. Introduction

Linear search is a computer algorithm which finds an element from an array sequentially. The time complexity is O(n) in the worst case – meaning the element is the last element of the array or not in the array. The time complexity is O(1) in the best case – meaning the element is the first element of the array. It’s useful when the array is small or not ordered.

In this example, I will demonstrate the following with a Maven project.

  • How to code the linear search
  • How JDK ArrayList implements the linear search
  • When to use the linear search

2. Technologies Used

The example code in this article was built and run using:

  • Java 11
  • Maven 3.3.9
  • Eclipse Oxygen
  • Junit 4.12

3. Maven Project

3.1 Dependencies

I will include Junit in the pom.xml.

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>jcg.zheng.demo</groupId>
	<artifactId>java-linear-search-demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<build>
		<sourceDirectory>src</sourceDirectory>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.8.0</version>
				<configuration>
					<release>11</release>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version>
		</dependency>
	</dependencies>
</project>

3.2 Demo POJO

I will create a DemoPOJO which has equals method.

DemoPOJO.java

package jcg.zheng.demo.search;

public class DemoPOJO {

	private int id;

	private String name;

	public DemoPOJO(int id, String name) {
		super();
		this.name = name;
		this.id = id;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		DemoPOJO other = (DemoPOJO) obj;
		if (id != other.id)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

	public int getId() {
		return id;
	}

	public String getName() {
		return name;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + id;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	public void setId(int id) {
		this.id = id;
	}

	public void setName(String name) {
		this.name = name;
	}

}

I will createLinearSearch which has two methods:

  • findItem – it checks item sequentially in a list via a for loop, returns the found object, else returns null.
  • findItemViaStream – it checks item sequentially in a list via a Stream, return the found object, else returns null.

LinearSearch.java

package jcg.zheng.demo.search;

import java.util.List;

public class LinearSearch<T> {

	public T findItem(List<T> elements, T searchingItem) {
		for (T item : elements) {
			if (item.equals(searchingItem)) {
				return item;
			}
		}
		return null;
	}

	public T findItemViaStream(List<T> elements, T searchingItem) {
		return elements.stream().filter(customer -> searchingItem.equals(customer)).findAny().orElse(null);
	}
}

3.4 JDK ArrayList Index

I will show the ArrayList‘s implementation for the indexOf method which checks the item sequentially via a for loop.

ArrayList.indexOf.java

 @Override
        public int indexOf(Object o) {
            E[] a = this.a;
            if (o == null) {
                for (int i = 0; i < a.length; i++)
                    if (a[i] == null)
                        return i;
            } else {
                for (int i = 0; i < a.length; i++)
                    if (o.equals(a[i]))
                        return i;
            }
            return -1;
        }

I will create aBinarySearch which searches an item from an ordered array in a faster way. The time complexity is O(log n).

BinarySearch.java

package jcg.zheng.demo.search;

public class BinarySearch {

	public int findItemIndex(int elements[], int left, int right, int searchItem) {
		if (right >= left) {
			int mid = left + (right - left) / 2;

			if (elements[mid] == searchItem)
				return mid;

			if (elements[mid] > searchItem)
				return findItemIndex(elements, left, mid - 1, searchItem);

			return findItemIndex(elements, mid + 1, right, searchItem);
		}

		return -1;
	}

}

4. JUnit Test

I will demonstrate the linear search and binary search with several Junit test classes.

4.1 Linear Search Integer

I will create LinearSearch_IntegerTest.

LinearSearch_IntegerTest.java

package jcg.zheng.demo.search;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

import org.junit.Before;
import org.junit.Test;

public class LinearSearch_IntegerTest {

	private List<Integer> elements;
	private LinearSearch<Integer> searchInt;

	@Test
	public void linearSearch_Integer() {
		Integer found = searchInt.findItem(elements, 20);
		assertNotNull(found);
		assertEquals(20, found.intValue());
	}

	@Test
	public void linearSearch_Stream_Integer() {
		Integer found = searchInt.findItemViaStream(elements, 20);
		assertNotNull(found);
		assertEquals(20, found.intValue());
	}

	@Before
	public void setup() {
		searchInt = new LinearSearch<>();
		elements = IntStream.iterate(10, x -> x + 10).limit(25).boxed().collect(Collectors.toList());
	}

}

4.2 Linear Search String

I will create LinearSearch_StringTest.

LinearSearch_StringTest.java

package jcg.zheng.demo.search;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;

import java.util.Arrays;
import java.util.List;

import org.junit.Before;
import org.junit.Test;

public class LinearSearch_StringTest {

	private List<String> elements;
	 
	private LinearSearch<String> searchInt;

	@Test
	public void linearSearch_Stream_String() {
		String found = searchInt.findItemViaStream(elements, "Mary");
		assertNotNull(found);
		assertEquals("Mary", found);
	}

	@Test
	public void linearSearch_String() {
		String found = searchInt.findItem(elements, "Mary");
		assertNotNull(found);
		assertEquals("Mary", found);
	}

	@Before
	public void setup() {
		searchInt = new LinearSearch<>();
		elements = Arrays.asList("Hello", "Mary", "How", "Are", "You");
	}

}

4.3 Linear Search POJO

I will create LinearSearch_POJOTest.

LinearSearch_POJOTest.java

package jcg.zheng.demo.search;

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;

import java.util.ArrayList;
import java.util.List;

import org.junit.Before;
import org.junit.Test;

public class LinearSearch_POJOTest {

	private List<DemoPOJO> elements;
	private LinearSearch<DemoPOJO> searchPojo;

	@Test
	public void linearSearch_POJO() {
		DemoPOJO found = searchPojo.findItem(elements, new DemoPOJO(1, "Mary"));
		assertNotNull(found);
		assertTrue(found.equals(new DemoPOJO(1, "Mary")));
	}

	@Test
	public void linearSearch_Stream_POJO() {
		DemoPOJO found = searchPojo.findItemViaStream(elements, new DemoPOJO(1, "Mary"));
		assertNotNull(found);
		assertTrue(found.equals(new DemoPOJO(1, "Mary")));
	}

	@Before
	public void setup() {
		searchPojo = new LinearSearch<>();
		elements = new ArrayList<>();
		elements.add(new DemoPOJO(1, "Mary"));
		elements.add(new DemoPOJO(2, "Zheng"));
		elements.add(new DemoPOJO(3, "Alex"));

	}
}

I will create BinarySearchTest.

BinarySearchTest.java

package jcg.zheng.demo.search;

import static org.junit.Assert.*;

import org.junit.Test;

public class BinarySearchTest {

	private int arr[] = { 2, 3, 4, 10, 40 };
	private BinarySearch testClass = new BinarySearch();

	@Test
	public void search_item_found() {
		int itemIndex = testClass.findItemIndex(arr, 0, arr.length - 1, 10);
		assertEquals(10, arr[itemIndex]);
	}

	@Test
	public void search_item_not_found() {
		int itemIndex = testClass.findItemIndex(arr, 0, arr.length - 1, 60);
		assertEquals(-1, itemIndex);
	}

}

4.5 Run Tests

Execute the mvn test command and capture the output here.

Output

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running jcg.zheng.demo.search.BinarySearchTest
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.1 sec
Running jcg.zheng.demo.search.LinearSearch_IntegerTest
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
Running jcg.zheng.demo.search.LinearSearch_POJOTest
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec
Running jcg.zheng.demo.search.LinearSearch_StringTest
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec

Results :

Tests run: 8, Failures: 0, Errors: 0, Skipped: 0

5. Linear Search Java Example – Summary

In this article, I created several Java classes to demonstrate how to implement a linear search. I also tested the search for an Integer, String, and DemoPOJO object. The time complexity of linear searching is O(n). When searching an item from a sorted list, the binary search has an O(log n) complexity.

6. Download the Source Code

This tutorial consists of a Maven project which includes Java classes to implement a linear search and binary search algorithms.

Download
You can download the full source code of this example here: Linear Search Java Example

Mary Zheng

Mary has graduated from Mechanical Engineering department at ShangHai JiaoTong University. She also holds a Master degree in Computer Science from Webster University. During her studies she has been involved with a large number of projects ranging from programming and software engineering. She works as a senior Software Engineer in the telecommunications sector where she acts as a leader and works with others to design, implement, and monitor the software solution.
Subscribe
Notify of
guest

This site uses Akismet to reduce spam. Learn how your comment data is processed.

0 Comments
Inline Feedbacks
View all comments
Back to top button