Java两种比较机制Comparable与Comparator区别

一、Comparable

1、Comparable 自然排序 它对每个实现它的类的对象强加了排序规则。该排序称之为自然排序

在java.lang包下,是一个接口。
compareTo 方法的返回值有三种情况:

    <1> e1.compareTo(e2) > 0 即 e1 > e2

    <2> e1.compareTo(e2) = 0 即 e1 = e2

    <3> e1.compareTo(e2) < 0 即 e1 < e2

    实现了 Comparable 接口的 List 或则数组可以使用 Collections.sort() 或者 Arrays.sort() 方法进行排序

comparable接口定义一个方法:

    public interface Comparable<T> {
        public int compareTo(T o);
    }
2、举例
    public class TestComparable implements Comparable<TestComparable> {

        private String name;

        private int age;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        @Override
        public String toString() {
            return this.name + this.age;
        }

        @Override
        public int compareTo(TestComparable o) {

            if (this.age == o.age){
                return 0;
            }else if(this.age > o.age){
                return 1;
            }else {
                return -1;
            }
        }
    }

	public static void main(String[] arges){
        //定义一个TestComparable           
		TestComparable testComparable = new TestComparable();
        testComparable.setName("王三");
        testComparable.setAge(29);
        //定义一个TestComparable1    
		TestComparable testComparable1 = new TestComparable();
        testComparable1.setName("李四");
        testComparable1.setAge(28);

        List<TestComparable> testComparables = new ArrayList<>();
        testComparables.add(testComparable);
        testComparables.add(testComparable1);
        //排序前打印
        System.out.print(testComparables.toString());
        //排序(按年龄的大小)
        Collections.sort(testComparables);
        //排序后打印
        System.out.print(testComparables.toString());
    }

二、Comparator

1、Comparator 定制排序 是在外部制定排序规则 是一种策略模式

Comparator 在 java.util 包下,也是一个接口
JDK 1.8 以前只有两个方法:

    public interface Comparator<T> {

        public int compare(T lhs, T rhs);

        public boolean equals(Object object);
    }

JDK 1.8 以后又新增了很多方法

2、举例
    <1> 创建一个类实现Comparator接口,其中TestComparatorBean是自定义类
	
	    public class TestComparator implements Comparator<TestComparatorBean> {

            @Override
            public int compare(TestComparatorBean o1, TestComparatorBean o2) {
		        //排序规则
                return o1.getAge() - o2.getAge();
            }
        }
	
	    //自定义类TestComparatorBean

	    public class TestComparatorBean {

            private String name;
            private int age;

            public String getName() {
                return name;
            }

            public void setName(String name) {
                this.name = name;
            }

            public int getAge() {
                return age;
            }

            public void setAge(int age) {
                this.age = age;
            }

            @Override
            public String toString() {
                return this.name + this.age;
            }
        }

	<2> 测试
	
	    public static void main(String[] arges){

            TestComparatorBean testComparatorBean = new TestComparatorBean();
            testComparatorBean.setName("找五");
            testComparatorBean.setAge(13);

            TestComparatorBean testComparatorBean1 = new TestComparatorBean();
            testComparatorBean1.setName("随六");
            testComparatorBean1.setAge(12);

            List<TestComparatorBean> testComparatorEnties = new ArrayList<>();
            testComparatorEnties.add(testComparatorBean);
            testComparatorEnties.add(testComparatorBean1);
            //排序前打印
            System.out.println(testComparatorEnties.toString());
            //排序
            Collections.sort(testComparatorEnties,new TestComparator());
            //排序后打印
            System.out.println(testComparatorEnties.toString());

        } 

三、Comparable和Comparator区别

 Comparable相当于“内部比较器”,而Comparator相当于“外部比较器”。
 
 <1> 若一个类实现了Comparable接口直接就成为一个可以比较的对象,但是需要修改源代码。
 
 <2> Comparator是比较器,若需要控制某个类的次序,则需要定义一个外部类实现Comparator接口,
 
     当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了。不需要修改源代码。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值