I did a little test and did not find a difference (only in a small run does the built-in comparator show slightly better performance). This is the code used to test:
public class ComparatorTest { private static final int MAX = 1000000; private static final int RUN = 10000; public static void main(String[] args) { List<A> list = new ArrayList<A>(); long externalComparatorClassTotalTime = 0; long inlineCompartorTotalTime = 0; for (int i = RUN; i > 0; i--) { init(list); externalComparatorClassTotalTime += externalComparatorClassTest(list); init(list); inlineCompartorTotalTime += inlineCompartorTest(list); } System.out.format("List with %d elements and %d runs%n", MAX, RUN); System.out.println("external Comparator class average millis: " + externalComparatorClassTotalTime / RUN); System.out.println("inline Comparator class average millis: " + inlineCompartorTotalTime / RUN); } private static void init(List<A> list) { list.clear(); for (int i = MAX; i > 0; i--) { list.add(new A(i)); } } private static long inlineCompartorTest(List<A> secondList) { long start = System.currentTimeMillis(); Collections.sort(secondList, new Comparator<A>() { public int compare(A obj1, A obj2) { return obj1.getVal().compareTo(obj2.getVal()); } }); return System.currentTimeMillis() - start; } private static long externalComparatorClassTest(List<A> firstList) { long start = System.currentTimeMillis(); Collections.sort(firstList, new MyComparatorOne()); return System.currentTimeMillis() - start; } }
Comparator Class:
public class MyComparatorOne implements Comparator<A> { public int compare(A obj1, A obj2) { return obj1.getVal().compareTo(obj2.getVal()); } }
and output:
List with 1000000 elements and 10000 runs external Comparator class average millis: 3 inline Comparator class average millis: 3
If you have several references to a comparator that supports an instance, this would be useful
Paizo source share