8 java.lang.Comparable 和 java.util.Comparator 与 compareTo 的区别

区别:当需要排序的集合或数组时可以使用ComparatorComparable,它们都可以实现排序,但是它们的区别是Comparator从外部定义了对象的比较规则,而Comparable则是从内部定义了对象是可比较的。

  1. 一、 Comparator

      Comparator从外部定义了对象的比较规则

      比如,你要使用某人写的一个矩形类Rect。现在你有一个Rect的集合(或数组),你想实现对Rect的排序,现在有一个问题,某人在实现Rect的时候没有考虑到会有人将会比较Rect对象。这个时候你必须根据需要对Rect进行排序(比如,根据矩形的长进行排序),在这个场景下使用Comparator,因为Rect类已经存在,你不能对其进行改变。

    [java] view plaincopyprint?

    import java.util.*;  

      

    public class Rectangle {  

          

        public static void main(String[] args)  

        {  

            Rect[] rectArrays = new Rect[] {new Rect(3, 4), new Rect(5, 2), new Rect(4, 5)};  

              

            // 排序,将定义的RectComparator作为参数   

            Arrays.sort(rectArrays, new RectComparator());  

              

            for (int i=0; i != rectArrays.length; ++i)  

                System.out.println(rectArrays[i]);  

        }  

          

        // 定义一个Rect比较方式:根据Rect的长比较   

        public static class RectComparator implements Comparator<Rect>  

        {  

            public int compare(Rect o1, Rect o2)  

            {  

                return o1.getLength() - o2.getLength();  

            }  

        }  

      

        public static class Rect  

        {  

            Rect(int l, int w)  

            {  

                this.length = l;  

                this.width = w;  

            }  

              

            public int getLength()  

            {  

                return this.length;  

            }  

              

            public int getWidth()  

            {  

                return this.width;  

            }  

              

            public int getArea()  

            {  

                return this.length * this.width;  

            }  

              

            public String toString()  

            {  

                return "length: " + length + " width: " + width;  

            }  

              

            private int length;  

            private int width;  

        }  

    }  

    输出:

    length: 3 width: 4length: 4 width: 5length: 5 width: 2

  2. 二、 Comparable

      Comparable则是从内部定义了对象的是可比较的

      还是以Rect为例,假如你是Rect的实现者,在你定义Rect时,你觉得有必要定义一个比较方式,这个时候就应该使Rect继承Comparable接口。如果你觉得较合理的排序方式是根据Rect的面积进行排序,那么可以这样实现

    [java] view plaincopyprint?

    import java.util.*;  

      

    public class Rectangle {  

          

        public static void main(String[] args)  

        {  

            Rect[] rectArrays = new Rect[] {new Rect(3, 4), new Rect(5, 2), new Rect(4, 5)};  

              

            Arrays.sort(rectArrays);  

              

            for (int i=0; i != rectArrays.length; ++i)  

                System.out.println(rectArrays[i]);  

        }  

      

        // 定义了Comparable接口   

        public static class Rect implements Comparable<Rect>  

        {  

            Rect(int l, int w)  

            {  

                this.length = l;  

                this.width = w;  

            }  

              

            public int getLength()  

            {  

                return this.length;  

            }  

              

            public int getWidth()  

            {  

                return this.width;  

            }  

              

            public int getArea()  

            {  

                return this.length * this.width;  

            }  

              

            public String toString()  

            {  

                return "length: " + length + " width: " + width;  

            }  

              

            // 重载compareTo函数,按面积比较   

            @Override  

            public int compareTo(Rect that)  

            {  

                return this.getArea() - that.getArea();  

            }  

              

            private int length;  

            private int width;  

        }  

    }  

    输出:

    length: 5 width: 2length: 3 width: 4length: 4 width: 5

  3. 3

    三、总结

    通过Comparator和Comparable的意思我们也可以看出两者的区别Comparable意为“可比较的”,一个类继承了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。Comparator意为“比较算子”,因此Comparator可以看成一种算法的实现,将算法和数据分离。  另外,通过定义方式,我们可以发现如果一个类继承了Comparable接口,则表明这个类的对象之间是可以比较的,且比较的方式只有一种。但是Comparator可以定义多种比较方式。在第二个程序中,Rect定义了按面积进行比较,如果我们想按长对Rect进行排序,那么也可以通过Comparator来实现。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值