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);