Comparable接口和Comparator接口的区别

1> Comparable接口里面的方法是 int compareTo(T o);

     Comparator接口里面的方法是 int compare(T o1,T o2);

 2>一个类既可以实现Comparable接口也可以实现Comparator接口

    如果希望一个类的比较方式有很多种,而且比较方式具有外部扩展性,那么可以实现Comparator接口,如果一个类默认的实现了Comparable接口,而你又希望再定义一个比较规则,那么你不可能去修改原类,因为这样会破坏封闭开放原则,最好的方法是写一个实现了Comparator接口的类。总的来说,Comparator接口比Comparable接口要灵活。

 3>如果一个集合类中存放着一些对象,如果希望对这个集合进行排序,可以使用Collections类里面的sort方法。

     sort方法有两种重载形式。

sort(Collection<T> c);   这种方法是根据类T里面默认的排序规则来排序的,即类T里面的compareTo方法

sort(Collection<T> c,Comparator<T> com);这种方法是根据类外面传进来的Comparator实现类类排序的。可以自己定义排序规则。

      请参考下面的程序

package com.basic.collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Comparable和Comparator的区别 {
	
	public static void main(String[] args) {
		//测试Comparable方法
		List<Person> list = new ArrayList<Person>();
		list.add(new Person(1006,"jason",59));
		list.add(new Person(1020,"meihao",32));
		list.add(new Person(1001,"xiaolei",20));
		list.add(new Person(1012,"edision",16));
		list.add(new Person(1002,"wangyong",29));
		
		System.out.println("排序前:....");
		printList(list);
		
		//通过Collections.sort方法来对List进行排序,是按照List里面的对象(Person)
		//实现的Comparable接口的规则来排序的
		Collections.sort(list);
		System.out.println("####################");
		System.out.println("默认的Name排序规则,排序后:....");
		printList(list);
		
		//通过NumberComparator定义的规则排序
		Collections.sort(list,new NumberComparator());
		System.out.println("####################");
		System.out.println("Number排序规则,排序后:....");
		printList(list);
		
		//通过NumberComparator定义的规则排序
		Collections.sort(list,new AgeComparator());
		System.out.println("####################");
		System.out.println("Age排序规则,排序后:....");
		printList(list);
		
	}
	
	
	private static void printList(List<Person> list){
		for(Person p:list){
			System.out.println(p);
		}
	}
	
}

class Person implements Comparable<Person> {
	public String name;
	public int age;
	public int number;
	
	public Person(){}
	
	public Person(int num,String name,int age){
		this.number = num;
		this.name = name;
		this.age = age;
	}

	@Override
	public int compareTo(Person o) {
		return this.name.compareTo(o.name);
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + ", number=" + number
				+ "]";
	}
	
}


class NumberComparator implements Comparator<Person>{

	@Override
	public int compare(Person o1, Person o2) {
		return o1.number - o2.number;	
	}
	
}

class AgeComparator implements Comparator<Person>{

	@Override
	public int compare(Person o1, Person o2) {
		return o1.age - o2.age;
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值