一、 Comparable:是排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。实现了 Comparable接口的类的对象的列表或数组可以通过Collections.sort或Arrays.sort进行自动排序。
此外,实现此接口的对象可以用作有序映射中的键或有序集合中的集合,无需指定比较器。
此接口只有一个方法compare,比较此对象与指定对象的顺序,如果该对象小于、等于或大于指定 对象,则分别返回负整数、零或正整数。

以下是实现方法:
1、采用内部Comparable排序集合对象
(1) Comparable 排序接口,必须要实现接口并实现方法

class Studentmsg implements Comparable<Studentmsg> {
	     private int age;
private String name;
private int weight;
private int tall;
	   public Studentmsg(String name, int age, int tall, int weight) {
	       this.age = age;
           this.name = name;
           this.weight = weight;
           this.tall = tall;
	}
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;
	}

	public int getWeight() {
		return weight;
	}

	public void setWeight(int weight) {
		this.weight = weight;
	}

	public int getTall() {
		return tall;
	}

	public void setTall(int tall) {
		this.tall = tall;
	}

	// 重写toString方法 拼接
	@Override
	public String toString() {
		return "Studentmsg [name=" + name + ",age =" + age + ", weight=" + weight + ", tall=" + tall + "]";
	}

	// 实现排序接口的方法
	// this - o 从小到大
	// o - this 从大到小
	@Override
	public int compareTo(Studentmsg o) {
		// TODO Auto-generated method stub
		if (this.age == o.age) {
			if (this.weight == o.weight) {
				return o.tall - this.tall;
			}
			return o.weight - this.weight;
		}
		return o.age - this.age;
	}
}

创建一个集合

List<Studentmsg> student = new ArrayList<Studentmsg>();
	       student.add(new Studentmsg("小白", 20, 178, 70));
	       student.add(new Studentmsg("小李", 20, 176, 65));
	       student.add(new Studentmsg("小高", 20, 176, 70));
	       student.add(new Studentmsg("小智", 22, 169, 60));
	       student.add(new Studentmsg("小王", 19, 176, 71));
           student.add(new Studentmsg("小黑", 23, 177, 73));
           //接着可以直接通过Collections.sort来进行排序
           Collections.sort(student)  //排序规则从大到小

2、可以在内部的基础上改变排序规则,也就是采用外部Comparable排序集合
以下是实现代码(改变实现接口的排序规则:从小到大):

Collections.sort(student, new Comparator<Studentmsg>() { 
		public int compare(Studentmsg o1, Studentmsg o2) {
		    if (o1.getAge() == o2.getAge()) {
			    if (o1.getWeight() == o2.getWeight()) {
				 return o1.getTall() – o2.getTall();
			    }
			    return o1.getWeight() – o2.getWeight();
			 }
			return o1.getAge() – o2.getAge();
		     }
		});

由于外部的排序规则优先度高,因此可以通过采用Comparator来改变别人的排序规则

二、 Comparator:是比较接口,我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现 Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现 Comparator接口即可。也就是说,我们可以通过实现Comparator来新建一个比较器,然后通过这个比 较器对类进行排序。
注意:

  • 若一个类要实现Comparator接口:它一定要实现compare(T o1, T o2) 函数,但可以不实现 equals(Object obj) 函数。
  • int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意 味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。

以下是实现方法:
*定义一个和上面一样的集合,但是不一样的是Studentmsg类不需要去实现排序接口
Comparator采用的是匿名内部类,所以一般用于在不能更改别人代码时使用(排序规则小到大)

class Studentmsg {
	private int age;
	private String name;
	private int weight;
	private int tall;

	public Studentcomparator(String name, int age, int tall, int weight) {
		this.age = age;
		this.name = name;
		this.weight = weight;
		this.tall = tall;
	}

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

	public int getWeight() {
		return weight;
	}

	public void setWeight(int weight) {
		this.weight = weight;
	}

	public int getTall() {
		return tall;
	}

	public void setTall(int tall) {
		this.tall = tall;
	}

	// 重写toString方法 拼接
	@Override
	public String toString() {
		return "Studentcomparator [name=" + name + ",age =" + age + ", weight=" + weight + ", tall=" + tall + "]";
	}
}

排序规则从小到大:

Collections.sort(listStudentcomparator, new Comparator<Studentcomparator>(){	 public int compare(Studentcomparator o1, Studentcomparator o2) {
	      if (o1.getAge() == o2.getAge()) {
		    if (o1.getWeight() == o2.getWeight()) {
			   return o1.getTall() - o2.getTall();
			}
		      return o1.getWeight() - o2.getWeight();
		     }
	      return o1.getAge() - o2.getAge();}});

另外除了List集合可以使用排序接口,TreeSet因为也具有排序状态,因此也可以使用排序接口

Comparable和Comparator区别比较:
1、Comparable是排序接口,若一个类实现了Comparable接口,就意味着“该类支持排序”。 Comparator是比较器,我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。 Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。

2、用Comparable简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需 要修改源代码。 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定 义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面 用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。