首页 > 作文

java中元素排序Comparable和Comparator的区别

更新时间:2023-04-04 02:58:38 阅读: 评论:0

目录
comparablecompa20年后的家乡300字rator总结

初次碰到这个问题是之前有一次电话面试,问了一个小时的问题,其中有一个问题就问到comparable和comparator的区别,当时没答出 来。之后是公司入职时候做的一套java编程题,里面用junit跑用例的时候也用到了comparator接口,再加上jdk的大量的类包括常见的 string、byte、char、date等都实现了comparable接口,因此要学习一下这两个类的区别以及用法。

comparable

comparable可以认为是一个内比较器,实现了comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了comparable接口的类如何比较,则依赖compareto方法的实现,compareto方法也被称为自然比较方法。如果开发者add进入一个collection的对象想要collections的sort方法帮你自动进行排序的话,那么这个对象必须实现comparable接口。compareto方法的返回值是int,有三种情况:

1、比较者大于被比较者(也就是compareto方法里面的对象),那么返回正整数

2、比较者等于被比较者,那么返回0

3、比较者小于被比较者,那么返回负整数

写个很简单的例子:

public class domain implements comparable<domain>{    private string str;    public domain(string str)    {        this.str = str;    }    public int compareto(domain domain)    {        if (this.str.compareto(domain.str) > 0)            return 1;        el if (this.str.compareto(domain.str) == 0)            return 0;        el             return -1;    }        public string getstr()    {        return str;    }}public static void main(string[] args)    {        domain d1 = new domain("c");        domain d2 = new domain("c");        domain d3 = new domain("b");        domain d4 = new domain("d");        system.out.println(d1.compareto(d2));        system.out.println(d1.compareto(d3));        system.out.println(d1.compareto(d4));    }

运行结果为:

0
1
-1

注意一下,前面说实现comparable接口的类是可以支持和自己比较的,但是其实代码里面comparable的泛型未必就一定要是domain,将泛型指定为string或者指定为其他任何任何类型都可以—-只要开发者指定了具体的比较算法就行。

comparator

comparator可以认为是是一个外比较器,个人认为有两种情况可以使用实现comparator接口的方式:

1、一个对象不支持自己和自己比较(没有实现comparable接口),但是又想对两个对象进行比较

2、一个对象实现了comparable接口,但是开发者认为compareto方法中的比较方式并不是自己想要的那种比较方式

comparator接口里面有一个compare方法,方法有两个参数t o1和t o2,是泛型的表示方式,分别表示待比较的两个对象,方法返回值和comparable接口一样是int,有三种情况:

1、o1大于o2,返回正整数

2、o1等于o2,返回0

3、o1小于o3,返回负整数

写个很简单的例子,上面代码的domain不变(假设这就是第2种场景,我对这个compareto算法实现不满意,要自己写实现):

public class domaincomparator implements comparator<domain>{    public int compare(domain domain1, domain domain2发愤忘食乐以忘忧)    {        恐怖主义产生的原因if (domain1.getstr().compareto(domain2.getstr()) > 0)            return 1;        el if (domain1.getstr().compareto(domain2.getstr()) == 0)           繁荣英文 return 0;        el             return -1;    }}
public static void main(string[] args){    domain d1 = new domain("c");    domain d2 = new domain("c");    domain d3 = new domain("b");    domain d4 = new domain("d");    domaincomparator dc = new domaincomparator();    system.out.println(dc.compare(d1, d2));    system.out.println(dc.compare(d1, d3));    system.out.println(dc.compare(d1, d4));}

看一下运行结果:

0
1
-1

当然因为泛型指定死了,所以实现comparator接口的实现类只能是两个相同的对象(不能一个domain、一个string)进行比较了,因此实现comparat印度洋洋流or接口的实现类一般都会以”待比较的实体类+comparator”来命名

总结

总结一下,两种比较器comparable和comparator,后者相比前者有如下优点:

1、如果实现类没有实现comparable接口,又想对两个类进行比较(或者实现类实现了comparable接口,但是对compareto方法内的比较算法不满意),那么可以实现comparator接口,自定义一个比较器,写比较算法

2、实现comparable接口的方式比实现comparator接口的耦合性 要强一些,如果要修改比较算法,要修改comparable接口的实现类,而实现comparator的类是在外部进行比较的,不需要对实现类有任何修 改。从这个角度说,其实有些不太好,尤其在我们将实现类的.class文件打成一个.jar文件提供给开发者使用的时候。实际上实现comparator 接口的方式后面会写到就是一种典型的策略模式。

当然,这不是鼓励用comparator,意思是开发者还是要在具体场景下选择最合适的那种比较器而已。

到此这篇关于java中元素排序comparable和comparator的区别的文章就介绍到这了,更多相关java comparable和comparator内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-04 02:58:37,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/b3d8de8768cb8ed4d2422bb6b443fec6.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:java中元素排序Comparable和Comparator的区别.doc

本文 PDF 下载地址:java中元素排序Comparable和Comparator的区别.pdf

标签:接口   方法   对象   开发者
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图