comparator和comparable的比较

前言

1.Comparable 是排序接口,一个类实现了 Comparable接口,意味着“该类支持排序”。
2.Comparator 是比较器,我们可以实现该接口,自定义比较算法,创建一个 “该类的比较器” 来进行排序。Comparable 相当于“内部比较器”,而 Comparator 相当于“外部比较器”。
3.Comparable 的耦合性更强,Comparator 的灵活性和扩展性更优。4.Comparable 可以用作类的默认排序方法,而 Comparator 则用于默认排序不满足时,提供自定义排序。

1.comparable接口

comparable是需要比较的对象来实现该接口,一个类实现了comparable接口后需要重写compareTo(比较规则)方法

public  int compareTo(Person o) {
	    if(this.age==o.age&&this.name==o.name){
	    	return 0;
	    }else if(this.age>o.age){
	    	System.out.println("this.age:"+this.age+"o.age:"+o.age);
	    	return 1;
	    }else{
	    	return -1;
	    }	
		}

通过外部调用来实现对内部对象的比较

		list.add(new Person(66,"李四"));
		list.add(new Person(34,"王五"));
		list.add(new Person(45,"赵四"));
		list.add(new Person(23,"麻子"));
		Collections.sort(list);

list内部存放的是实现了comparable接口的Person的对象实例,对其进行比较排序。这样对象调用实现的方法来比较。对对象的耦合度高(需要改变对象的内部结构,破坏性大)。

2.comparator接口

comparator相当于一通用的比较工具类接口。需要定制一个比较类去实现它,重写里面的compare方法,方法的参数即是需要比较的对象。对象不用做任何改变,实现解耦。

Collections.sort(list,new Comparator<emp>(){
			@Override
			public int compare(emp o1, emp o2) {
				if(o1.age==o2.age&&o1.name==o2.name){
					return 0;
				}else if(o1.age>o2.age){
					return 1;			
				}else{
					return 0;
				}
			}
		});

list集合内部存放的是emp的对象实例

小案例

当实现类实现了 Comparable 接口,但是已有的 compareTo 方法的比较算法不满足当前需求,此时如果想对两个类进行比较,有两种办法:

1)修改实现类的源代码,修改 compareTo 方法,但是这明显不是一个好方案,因为这个实现类的默认比较算法可能已经在其他地方使用了,此时如果修改可能会造成影响,所以一般不会这么做。

2)实现 Comparator 接口,自定义一个比较器,该方案会更优,自定义的比较器只用于当前逻辑,其他已有的逻辑不受影响。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值