可比与比较器接口中Java中有什么不同?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
<强>详解Java中比较和比较器接口的区别强>
本文要来详细分析一下Java中比较和比较器接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧。
<强>可比简介强>
可比是排序接口。
若一个类实现了可比接口,就意味着“该类支持排序”只即然实现可比接口的类支持排序,假设现在存在“实现可比接口的类的对象的名单列表(或数组)”,则该列名单表(或数组)可以通过集合。sort(或Arrays.sort)进行排序。
此外,“实现可比接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。
<强>可比定义强>
可比接口仅仅只包括一个函数,它的定义如下:
包java.util; 公共接口Comparator{ int比较(T o1、o2); 布尔=(对象obj); }
说明:
(01)若一个类要实现比较器接口:它一定要实现compareTo (T o1、o2)函数,但可以不实现=(对象obj)函数。
为什么可以不实现=(对象obj)函数呢?因为任何类,默认都是已经实现了=(对象obj)的。Java中的一切类都是继承于Java . lang . Object,在对象。java中实现了=(对象obj)函数,所以,其它所有的类也相当于都实现了该函数。
(02) int比较(T o1、o2)是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。
<强>比较器和可比比较强>
可比是排序接口,若一个类实现了可比接口,就意味着“该类支持排序”。
而比较器是比较器;我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。
我们不难发现:同类相当于“内部比较器”,而比较器相当于“外部比较器”。
我们通过一个测试程序来对这两个接口进行说明。源码如下:
进口java.util。*; 进口java.lang.Comparable;/* * * @desc“Comparator"和“可比”的比较程序。 * (01)“Comparable" *它是一个排序接口,只包含一个函数compareTo ()。 *一个类实现了可比接口,就意味着“该类本身支持排序”,它可以直接通过Arrays.sort()或Collections.sort()进行排序。 * (02)“Comparator" *它是一个比较器接口,包括两个函数:比较平等()和()。 *一个类实现了比较器接口,那么它就是一个“比较器”。其它的类,可以根据该比较器去排的序。 * *综上所述:可比是内部比较器,而比较是外部比较器。 *一个类本身实现了可比比较器,就意味着它本身支持排序;若它本身没实现可比性,也可以通过外部比较器比较器进行排序。 */公开课CompareComparatorAndComparableTest { 公共静态void main (String [] args) {//新建ArrayList(动态数组) ArrayList列表=new ArrayList ();//添加对象到ArrayList中 列表。(新添加的人(“ccc" 20)); 列表。(新添加的人(“AAA" 30)); 列表。(新添加的人(“bbb" 10)); 列表。(新添加的人(“ddd" 40));//打印列表的原始序列 System.out.printf(“原始排序,列表:% s \ n",列表);//对列表进行排序//这里会根据“人实现的Comparable 接口”进行排序,即会根据“name”进行排序 Collections.sort(列表); System.out.printf(“名称排序,列表:% s \ n",列表);//通过“比较器(AscAgeComparator)”,对列表进行排序//AscAgeComparator的排序方式是:根据“年龄”的升序排序 集合。排序(列表,新AscAgeComparator ()); System.out.printf (“Asc(年龄)排序,列表:% s \ n",列表);//通过“比较器(DescAgeComparator)”,对列表进行排序//DescAgeComparator的排序方式是:根据“年龄”的降序排序 集合。排序(列表,新DescAgeComparator ()); System.out.printf (“Desc(年龄)排序,列表:% s \ n",列表);//判断两个人是否相等 testEquals (); }/* * * @desc测试两个人比较是否相等。 *由于人实现了equals()函数:若两人的年龄、姓名都相等,则认为这两个相的人等。 *所以,这里的p1和p2相等。 * * TODO:若去中掉人的=()函数,则p1不等于p2 */私有静态孔隙testEquals () { 人p1=new (“eee", 100); 人p2=new (“eee", 100); 如果(p1.equals (p2)) { System.out.printf (“% s=% s \ n", p1, p2); 其他}{ System.out.printf (“% s”不等于% s \ n", p1, p2); } }/* * * @desc人类。 *人实现了可比接口,这意味着人本身支持排序 */私有静态类人实现Comparable 类似与比较器接口中Java中有什么不同