Java Tip #12: Use Collection min()/max() when looking for lowest/highest item in collections
At work I regularly stumble across a specific type of processing: sorting a collection/list and afterwards only retrieving the first or last element. Such code constructs are clearly for fetching the minimum or maximum element but sorting the whole collection for just a single item seems to be a bit of overhead. And indeed it is and the Collection class provides methods for these purposes without having to juggle items in memory and creating new collection objects which are never really required.
If you have a collection and want to retrieve the minimum or maximum element from it you don't have to sort it and retrieve the first or last but java.util.Collections offers its min() and max() methods for that which are much more efficient for that exact purpose. These can also be used with custom Comparators.
// retrieve smallest element Collections.sort(elementList); Element smallest = elementList.get(0); ... // fetch item with highest custom value Collections.sort(customItemsList, Collections.reverseOrder(new MyCustomComparator())); Item largestItem = customItemsList.get(0);
Element smallest = Collections.min(elementList); ... Item largestItem = Collections.max(customItemsList, new MyCustomComparator());
Readability gain. Possible huge performance gain, as min()/max() run in O(n) while sorting takes O(n log(n)).
If the comparison methods (compare(), equals()) do not fulfill the Comparator requirements according to the Java SDK (see here) (i.e. A.equals(B) != B.equals(A) or (A<B)!=(B>A), etc.) then the result of min()/max() may be different than the result from the approach using sorted collections.