Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Comparator接口如何工作以及如何在内部调用compare()方法_Java - Fatal编程技术网

Java Comparator接口如何工作以及如何在内部调用compare()方法

Java Comparator接口如何工作以及如何在内部调用compare()方法,java,Java,简要解释Comparator接口在内部是如何工作的,它是如何通过JVM调用compare()方法的。在Collections.sort()方法中,我们将第一个参数作为Employee对象的列表传递,另一个参数传递NameComparator类对象,该类对象正在实现Comparator方法,以升序缩短Employee的名称。所以我想知道,实际上compare()方法是如何使用两个参数作为Employee对象调用的。因为我们没有调用compare()方法。还有其他一些概念,比如它实际上是如何在内部工

简要解释Comparator接口在内部是如何工作的,它是如何通过JVM调用compare()方法的。在Collections.sort()方法中,我们将第一个参数作为Employee对象的列表传递,另一个参数传递NameComparator类对象,该类对象正在实现Comparator方法,以升序缩短Employee的名称。所以我想知道,实际上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);
    }
}
公共类测试
{
公共静态void main(字符串[]args)
{
列表=新的ArrayList();
添加(新员工(“Manish”);
列表。添加(新员工(“Amit”);
添加(新员工(“克里希纳”);
//传递employee obj和NameComparator类对象的列表。
Collections.sort(list,newnamecomparator());
系统输出打印项次(列表);
}
}
班级员工
{
字符串名称=null;
公共雇员(字符串名称)
{
this.name=名称;
}
@凌驾
公共字符串toString()
{
返回此.name;
}
}
类NameComparator实现Comparator
{
@凌驾
公共整数比较(员工o1、员工o2)
{
员工emp1=(员工)o1;
员工emp2=(员工)o2;
返回emp1.name.compareTo(emp2.name);
}
}

您只需查看实现即可。例如,在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--) 
        ...
    }
private static void mergeSort(对象[]src,
对象[]dest,
int低,int高,int关,
比较器(c){
整数长度=高-低;
//最小数组的插入排序
if(长度<插入排序阈值){
对于(int i=低;i来自:

“排序算法是一种改进的mergesort(在该算法中,如果低位子列表中的最高元素小于高位子列表中的最低元素,则忽略合并)。该算法提供有保证的n log(n)性能。此实现将指定的列表转储到数组中,对数组进行排序,并在列表上迭代,从数组中的相应位置重置每个元素。这避免了因尝试对链接列表进行适当排序而导致的n2 log(n)性能。”

以下是排序代码:


到底什么是“类对象”呢?嗨,如果高兴的话,请接受我下面的回答,结束这个问题,谢谢