java 中的2个接口 Comparable和Comparator

像Integer、String这些类型的数据都是已经实现Comparable接口的,所以对这些类型可以直接通过Arrays.sort(...)和Collections.sort(...)方法进行排序。但是对于一些自己new出来的对象而言,如果想使用sort这种方法,必须要实现Comparable接口,这是由sort方法底层决定的,具体看一下实例:

定义一个Bean

public class Employee implements Comparable{

private int age;  private String name;

public Employee(String name,int age){

this.name=name;

this.age=age;

}  public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

@Override

public int hashCode() {

final int prime = 31;

int result = 1;

result = prime * result + age;

result = prime * result + ((name == null) ? 0 : name.hashCode());

return result;  }

@Override

public boolean equals(Object obj) {

if (this == obj)    return true;

if (obj == null)    return false;

if (getClass() != obj.getClass())

return false;

Employee other = (Employee) obj;

if (age != other.age)

return false;

if (name == null) {

if (other.name != null)

return false;

} else if (!name.equals(other.name))

return false;

return true;

}

@Override  public String toString() {

return "Employee [age=" + age + ", name=" + name + "]";

}

@Override

public int compareTo(Object o) {

if(o instanceof Employee){

if(age > ((Employee) o).age){

return 1;

}else if(age == ((Employee) o).age){

return 0;   }else if (age < ((Employee) o).age){

return -1;   }

}   return 0;

}

}

//

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Collections;

import java.util.Comparator;

import java.util.List;

public class EmployeeSortTest {

public static void main(String[] args){

Employee[] staff = new Employee[3];

staff[0]= new Employee("aaa",12);

staff[1] = new Employee("bbb",13);

staff[2] = new Employee("ccc",14);

Arrays.sort(staff);//sort方法可以实现对对象数组的排序,但必须实现Comparable接口

for(Employee e: staff){

System.out.println(e);

}  //以上方法虽然可以实现对象的排序,但是有弊端;

//1、修改了公共类Employee,而很多情况下我们是没有办法修改公共的类,

//2、当我们需求满足不同的方式进行排序时,这种方法是不可行的

//接下来java中提供了Comparator接口,Comparator使用其compare()方法返回的整数来比较2个对象,

//这样就无需修改公共类

System.out.println("---------------");

List<Employee> list = new ArrayList<Employee> ();

list.add(new Employee("aaa",12));

list.add(new Employee("bbb",13));

list.add(new Employee("bbb",14));

Collections.sort(list, new Comparator<Employee>(){

@Override

public int compare(Employee  o1, Employee  o2) {

// TODO Auto-generated method stub

return o1.getAge()-o2.getAge();

}

});

for(Employee e : list){

System.out.println(e);

}

}

}

//输出结果:

Employee [age=12, name=aaa]
Employee [age=13, name=bbb]
Employee [age=14, name=ccc]
Employee [age=12, name=aaa]
Employee [age=13, name=bbb]
Employee [age=14, name=bbb]

时间: 2024-12-21 06:05:24

java 中的2个接口 Comparable和Comparator的相关文章

【Java基础】接口Comparable和Comparator的区别和关系

接口Comparable和Comparator的区别和关系 1).两者都是实现集合中元素的比较.排序: 2).Comparable是集合内部定义方法实现排序,Comparator是集合外部实现排序 3).Comparator接口在java.util下,Comparable接口在java.lang下; 通常自定义类加入如List等容器中能够排序,可以实现Comparable接口,在用Collections.sort(List<T> list, Comparator<? super T>

java学习笔记13--比较器(Comparable、Comparator)

java学习笔记13--比较器(Comparable.Comparator) 分类: JAVA 2013-05-20 23:20 3296人阅读 评论(0) 收藏 举报 Comparable接口的作用 之前Arrays类中存在sort()方法,此方法可以直接对对象数组进行排序. Comparable接口 可以直接使用java.util.Arrays类进行数组的排序操作,但对象所在的类必须实现Comparable接口,用于指定排序接口. Comparable接口的定义如下: public  int

Java的比较接口comparable与comparator

package test0; import java.util.Comparator; //限定修饰符为friend不能为public,一个java文件中只能有一个public类 /*** * java程序是从一个public类的main函数开始执行的, *(其实是main线程),就像c程序是从main()函数开始执行一样. * 只能有一个public类是为了给类装载器提供方便. */ interface MyComparable<T>{ //接口类--抽象类 public int compa

Java中的类和接口

类有两种: 普通类  : 抽象类(abstract): 抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量.成员方法和构造方法的访问方式和普通类一样. 由于抽象类不能实例化对象,所以抽象类必须被继承(extends),才能被使用.也是因为这个原因,通常在设计阶段决定要不要设计抽象类. 父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法. 在Java中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口. 抽象方法 如果你想设计这样

JAVA中的抽象类和接口

一 抽象类 抽象类就是不能被实例化的类,即不可以用new运算符创建本类的对象.在实际应用中,抽象类应该具有子类,且其子类一般不为抽象类. java中使用抽象类的原因有如下四点: 1.抽象类是较高层次的概括,其他的类可以继承它的抽象化特征: 2.抽象类包括它的所有子类共享的公共行为和公共属性,即抽象类中定义一些属性和方法,其他类继承该抽象类并实现这些属性和方法: 3.抽象类使编写程序更贴近人类的思维方式和客观世界: 4.在用户生成实例时强迫用户生成更具体的实例,保证代码的安全性. 二 接口 在接口

Java 中的抽象类及接口

抽象类使用 abstract 关键字修饰,该类即为抽象类. 抽象类的作用: 1.某些情况下,父类约束子类必须包含哪些方法,但不知道子类如何去实现这些方法. 2.可以从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,避免子类设计的随意性. 抽象类的使用规则: 1.使用 abstract 定义抽象对象: 2.abstract 定义抽象方法,只有声明,不需要实现: 3.包含抽象方法的类是抽象类: 4.抽象类中可以包含普通的方法,也可以没有抽象方法: 5.抽象类不能直接创建,可以定义

Java 中的锁——Lock接口

Java SE5之后,并发包中新增了Lock接口(以及相关实现类)用来实现锁功能.虽然它少了(通过synchronized块或者方法所提供的)隐式获取释放锁的便捷性,但是却拥有了锁获取与释放的操作性.可中断的获取锁以及超时获取锁等多种synchronized关键字所不具备的同步特性. 使用synchronized关键字将会隐式地获取锁,但是它将锁的获取和释放固化了,也就是先获取再释放.当然,这简化了同步的管理,可是扩展性没有显示的锁获取和释放来的好. Lock接口提供的synchronized关

Java中如何动态创建接口的实现

有很多应用场景,用到了接口动态实现,下面举几个典型的应用: 1.mybatis / jpa 等orm框架,可以在接口上加注解进行开发,不需要编写实现类,运行时动态产生实现. 2.dubbo等分布式服务框架,消费者只需要引入接口就可以调用远程的实现,分析源代码,其实在消费端产生了接口的代理实现,再由代理调用远程接口. 3.spring aop 这是最典型的动态代理了. 创建接口的动态实现,有二种最常用的方式:JDK动态代理和CGLIB动态代理. 代理模式是一种常用的设计模式,其目的就是为其他对象提

关于JAVA中的抽象类和接口中常量和变量定义的原因

转载自https://my.oschina.net/cdzsc/blog/86107 在抽象类中,可以包含一个或多个抽象方法:但在接口(interface)中,所有的方法必须都是抽象的,不能有方法体,它比抽象类更加"抽象". 1. 为什么接口中只能定义static final:     1.1 static(这时暂且认为是变量)解释:因为一个类可以实现多个接口,如果一个类同时实现了多个接口而每个接口中都定义了同一个变量的话就会产生在类中不知道是哪个接口中的变量了,所以必须定义成stat