java中comparable和comparator的区别

区别  

 Comparable & Comparator 都是用来实现集合中元素的比较、排序的,只是 Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。

Comparator位于包java.util下,而Comparable位于包   java.lang下

Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作,已经实现了Comparable接口)   

 自定义的类要在加入list容器中后能够排序,可以实现Comparable接口,在用Collections类的sort方法排序时,如果不指定Comparator,那么就以自然顺序排序,如API所说:
Sorts the specified list into ascending order, according to the natural ordering of its elements. All elements in the list must implement the Comparable interface
这里的自然顺序就是实现Comparable接口设定的排序方式。

而 Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。
 
可以说一个是自已完成比较,一个是外部程序实现比较的差别而已。

用 Comparator 是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。
 
比如:你想对整数采用绝对值大小来排序,Integer 是不符合要求的,你不需要去修改 Integer 类(实际上你也不能这么做)去改变它的排序行为,只要使用一个实现了 Comparator 接口的对象来实现控制它的排序就行了。

1 Comparable

 java中comparable和comparator的区别_第1张图片

因为 User没有实现对应的Comparable接口,所以在使用TreeSet的时候,会报错

java中comparable和comparator的区别_第2张图片

2. Comparator 

java中comparable和comparator的区别_第3张图片

 

java中comparable和comparator的区别_第4张图片

 java中comparable和comparator的区别_第5张图片

 3  list  排序

java中comparable和comparator的区别_第6张图片

 总结

* Comparable : 如果treeSet中保存我们自己定义的类型的时候,使用Comparable

 *

 * Comparator : 如果treeSet中保存的不是我们写的类型的时候,就要使用Comparator来指定排序规则

 *            比如 Integer 默认是升序排序,假如我们需要降序排序,我们只能使用 Comparator,因为我们不可能去更改Integer的源码

 *            但此时 Integer中是有Comparable接口的实现的,等于两个比较都存在,但是Comparator优先级高,

 *            所以会按照我们定义的规则进行排序

 *            开闭原则 : 对修改关闭,对扩展开发

你可能感兴趣的:(分享,笔记,java,开发语言,后端)