When working with sorted collections in Java, the Collections.binarySearch() method can be a helpful tool for quickly finding the position of an object in the collection. Here's a closer look at how to use this method effectively.
Syntax of Collections.binarySearch()
Before diving into code examples, it's important to understand the syntax of Collections.binarySearch(). The method takes two arguments:
- A sorted list of objects to search
- The object to search for
It returns the index of the object in the list, or a negative number if the object is not found. Specifically, if the object is not present in the list, it returns the negation of the insertion point - 1. For example, if the object would be inserted at index 3, the method returns -4.
Example Usage of Collections.binarySearch()
Here's a simple example that demonstrates how to use Collections.binarySearch() to search for an integer in a sorted list:
javaimport java.util.Collections;
import java.util.List;
import java.util.ArrayList;
public class BinarySearchExample {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(3);
numbers.add(5);
numbers.add(7);
numbers.add(9);
int index = Collections.binarySearch(numbers, 5);
System.out.println("Index of 5: " + index); // Output: 2
index = Collections.binarySearch(numbers, 8);
System.out.println("Index of 8: " + index); // Output: -5
}
}In this example, we create a new ArrayList of integers and populate it with odd numbers up to 9. Then, we use Collections.binarySearch() to search for the value 5 and 8. We print out the resulting index or negative number.
Important Points to Keep in Mind
There are a few important things to keep in mind when using Collections.binarySearch():
- The list must be sorted in ascending order for the method to work properly.
- If the list contains duplicates, there is no guarantee which one will be found.
- If the object is not present in the list, the method returns the negation of the insertion point - 1.
Collections.binarySearch()works with objects collections likeArrayListandLinkedList.- The point must either implement
Comparableor we must provide an object of the class that implements theComparator. - The method does not take any range parameters like
Arrays.binarySearch()does. - For
ArrayList, the time complexity of the method is O(log n) for O(log n) object comparisons because of direct access. ForLinkedList, it will be O(n) for O(log n) object comparisons because the middle point needs to be found, which takes linear time in a linked list.
By keeping these points in mind and using Collections.binarySearch() correctly, you can quickly and efficiently search for objects in a sorted collection.