Comparable VS Comparator

前言

在阅读TreeMap源码时发现了Comparable与Comparator,光是名字看起来就很像,既然都是比较器,那有何区别呢?实际上我对于比较器的使用场景并不是很多,所以这篇还是借鉴了别人的想法。

比较

通过下面的这段代码来说明问题。


    public class Test {

        public static void main(String[] args) {
            Apple appleOne = new Apple(1, "red");
            Apple appleTwo = new Apple(2, "green");
            appleOne.compareTo(appleTwo);
        }
    }

    class Apple implements Comparable<Apple> {

        private int size;
        private String color;

        Apple(int size, String color){
            this.size = size;
            this.color = color;
        }

        @Override
        public int compareTo(Apple o) {
            return size > o.size ? 1 : 0; //比较Apple的大小
        }

        //getter、setter
    }

代码上挺简单的,只是比较了Apple的大小,现在来思考一下,哪一天突然想比较Apple的颜色了,那岂不是要改代码了,而对于新需求我们通常说现有代码尽量保持不变,通过新增类的方式来满足,所以Comparable的缺点很明显,一旦某个类指定了比较方式后就无法做修改(除非是修改代码...),即使能修改代码我们也不知道会不会造成新的问题或新的需求产生,所以这是行不通的。而对于Comparator来说,它就显得更加灵活了,支持多个比较器,只要新增类即可,看如下的代码展示:


    public class Test {

        public static void main(String[] args) {
            Apple appleOne = new Apple(1, "red");
            Apple appleTwo = new Apple(2, "green");

            //比较Apple的大小
            AppleCompareSize acs = new AppleCompareSize();
            acs.compare(appleOne, appleTwo);

            //比较Apple的颜色
            AppleCompareColor acc = new AppleCompareColor();
            acc.compare(appleOne, appleTwo);
        }
    }

    class Apple {

        private int size;
        private String color;

        Apple(int size, String color) {
            this.size = size;
            this.color = color;
        }

        //getter、setter
    }

    class AppleCompareSize implements Comparator<Apple> {

        @Override
        public int compare(Apple o1, Apple o2) {
            return o1.getSize() > o2.getSize() ? 1 : 0;
        }
    }

    class AppleCompareColor implements Comparator<Apple> {

        @Override
        public int compare(Apple o1, Apple o2) {
            return o1.getColor().compareTo(o2.getColor());
        }
    }

应该很容易就能看出效果了,即使别人已经写好了一个比较器,对于新需求,我们只要增加即可,并不会出现修改或污染其他人代码的情况。

总结

Comparator与Comaparable的最大区别在于Comparator能够定义多种不同的比较策略,即新增多个比较来,同时避免往比较对象(Apple)中添加其他代码(比较)

posted @ 2020-12-21 21:24  zliawk  阅读(72)  评论(0)    收藏  举报