相关文章推荐
乖乖的荒野  ·  Spark ...·  5 月前    · 
坏坏的麦片  ·  How to fix OSError: ...·  1 年前    · 
英姿勃勃的地瓜  ·  Fabric js ...·  1 年前    · 

2022.01.15每日总结

1.comparable接口

Comparable接口代码:

* @param   o the object to be compared.
public interface Comparable<T> {
    public int compareTo(T o);
}

任何实现Comparable接口的类都需包含compareTo方法,这个方法有一个Object参数,并且返回一个整数。

1.1为什么要实现Comparable接口?

假设希望使用Arrays类的sort方法对Employee对象数组进项排序,Employee类就必须实现Comparable接口。

主要原因在于Java是程序设计语言是一种强类型(strong typed)语言,在调用方法的时候编译器要能检查这个方法确实存在,在sort方法中可能会有下面的语句:

if(a[i].compareTo(a[j]) > 0)
  // rearrange a[i] and a[j]
}

编译器必须确认a[i] 一定有一个compareTo方法。

public class Employee implements Comparable<Employee>
   private String name;
   private double salary;
   public Employee(String name, double salary)
      this.name = name;
      this.salary = salary;
   public String getName()
      return name;
   public double getSalary()
      return salary;
   public void raiseSalary(double byPercent)
      double raise = salary * byPercent / 100;
      salary += raise;
    * Compares employees by salary
    * @param other another Employee object
    * @return a negative value if this employee has a lower salary than
    * otherObject, 0 if the salaries are the same, a positive value otherwise
   public int compareTo(Employee other)
      return Double.compare(salary, other.salary);
}
import java.util.*;
 * This program demonstrates the use of the Comparable interface.
 * @version 1.30 2004-02-27
 * @author Cay Horstmann
public class EmployeeSortTest
   public static void main(String[] args)
      Employee[] staff = new Employee[3];
      staff[0] = new Employee("Harry Hacker", 35000);
      staff[1] = new Employee("Carl Cracker", 75000);
      staff[2] = new Employee("Tony Tester", 38000);
      Arrays.sort(staff);
      // print out information about all Employee objects
      for (Employee e : staff)
         System.out.println("name=" + e.getName() + ",salary=" + e.getSalary());
}

1.2在Java 5中,Comparable接口已经提升为一个泛型类型。

泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。

泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。
————————————————

例如,在实现Comparable<Employee>接口的类中,必须提供以下方法

int compareTo(Employee other),方法中有一个Object类型的参数,必须手动将compareTo方法的这个参数强制转换为所希望的类型。

public int compareTo(Object otherObject)
   Employee other = (Employee) otherObject;
   return Double.compare(salary, other.salary);
}

为泛型Comparable接口提供一个类型参数:

public class Employee implements Comparable<Employee>
    * @param other another Employee object
   public int compareTo(Employee other)
      return Double.compare(salary, other.salary);