简要解释一下Comparator接口如何在内部工作,它如何通过JVM调用compare()方法。在Collections.sort()方法中,我们将第一个参数作为Employee对象列表传递,另一个参数传递我们的NameComparator类对象,该对象实现Comparator方法以将员工名称缩写为升序。所以我想知道,compare()方法实际上是如何使用两个参数调用Employee对象。因为我们没有调用compare()方法。和其他概念一样,实际上它是如何在内部工作的。下面有一段代码。
public class Test
{
public static void main(String[] args)
{
List<Employee> list = new ArrayList<Employee>();
list.add(new Employee("Manish"));
list.add(new Employee("Amit"));
list.add(new Employee("Krishna"));
// passing the list of employee obj and NameComparator class object.
Collections.sort(list, new NameComparator());
System.out.println(list);
}
}
class Employee
{
String name = null;
public Employee(String name)
{
this.name = name;
}
@Override
public String toString()
{
return this.name;
}
}
class NameComparator implements Comparator<Employee>
{
@Override
public int compare(Employee o1, Employee o2)
{
Employee emp1 = (Employee) o1;
Employee emp2 = (Employee) o2;
return emp1.name.compareTo(emp2.name);
}
}
答案 0 :(得分:3)
来自:http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html
“排序算法是一个经过修改的mergesort(如果低子列表中的最高元素小于高子列表中的最低元素,则省略合并。)此算法提供有保证的n log(n)性能。实现将指定的列表转储到一个数组中,对数组进行排序,并迭代列表,从数组中的相应位置重置每个元素。这样可以避免因尝试对链接列表进行排序而导致的n2 log(n)性能。“
以下是排序代码:
http://www.docjar.com/html/api/java/util/Collections.java.html
答案 1 :(得分:2)
您可以查看实施情况。例如,在Java 6中,Collections.sort调用Arrays.sort,最终调用此方法:
private static void mergeSort(Object[] src,
Object[] dest,
int low, int high, int off,
Comparator c) {
int length = high - low;
// Insertion sort on smallest arrays
if (length < INSERTIONSORT_THRESHOLD) {
for (int i=low; i<high; i++)
// here the Comparator's compare method is called
for (int j=i; j>low && c.compare(dest[j-1], dest[j])>0; j--)
...
}