Comparable<T> 和 Comparator<T> 的区别

Comparable

package java.lang;
import java.util.*;
public interface Comparable {
//函数式接口public int compareTo(T o);
}

 

首先它是在java.lang包下的

有一个 返回值为 int型的 抽象方法

compareTo(T o)

传入参数是一个泛型 在定义这个接口的时候可以传入类型

参数 o与自己比较的对象

实例

package com.mc.demo.compare;
//让这个类实现 Comparable 接口
public class User implements Comparable {//用户姓名private String name;//年龄private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic int compareTo(User user1) {//如果自身年龄 大于 user1的年龄 输出大于0 等于输出0 小于输出负数return this.getAge() - user1.getAge();}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}
}
package com.mc.demo.compare;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class ComparableTest {public static void main(String[] args) {User user1 = new User();user1.setAge(3);user1.setName("mc");User user2 = new User();user2.setAge(5);user2.setName("lmf");List list = new ArrayList<>();list.add(user2);list.add(user1);System.out.println("排序前....");for(User u:list) {System.out.println(u);}Collections.sort(list);System.out.println("排序后....");for(User u:list){System.out.println(u);}}
}

运行结果

排序前....
User{name='lmf', age=5}
User{name='mc', age=3}
排序后....
User{name='mc', age=3}
User{name='lmf', age=5}

Comparator

package java.util;@FunctionalInterface
public interface Comparator {//也是一个函数式接口int compare(T o1, T o2);}

这个方法的作用是比较两个参数的顺序。返回负整数,零或正整数,因为第一个参数小于或等于或大于第二个参数。

参数 o1 -要比较的第一个元素 o2 要比较的第二个元素

1.首先comparator 在java.util包下

2.他也有一个抽象方法,不过需要传递两个对象

实例

package com.mc.demo.compare;
//让这个类实现 Comparable 接口
//public class User implements Comparable {
public class User{//用户姓名private String name;//年龄private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}//    @Override
//    public int compareTo(User user1) {
//        //如果自身年龄 大于 user1的年龄 输出大于0 等于输出0 小于输出负数
//        return this.getAge() - user1.getAge();
//    }@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}
}
package com.mc.demo.compare;import java.util.Arrays;
import java.util.Comparator;public class ComparatorTest {public static void main(String[] args) {//使用lambad表达式实现一个Comparator的接口Comparator comparator = (o1,o2)->{return o1.getAge()-o2.getAge();};User[] users = new User[2];User user1 = new User();user1.setAge(3);user1.setName("mc");User user2 = new User();user2.setAge(5);users[0] = user2;users[1] = user1;//排序前for(User u:users){System.out.println(u);}//排序后Arrays.sort(users,comparator);System.out.println("排序后..............");for(User u:users){System.out.println(u);}}
}

总结

1.首先Comparable 在java.lang包下,Comparator 在java.util包下

2.Comparable中的比较方法需要传递一个参数,而Comparator需要传递两个参数

3.如果一个类实现类Comparable接口,就意味着这个类支持排序。而Comparator相当于一个比较器,我们如果需要控制某个类的次序,可以建立一个该类的比较器来进行排序

4.两种方法各有优劣, 用Comparable 简单, 只要实现Comparable 接口的对象直接就成为一个可以比较的对象,但是需要修改源代码。 用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并且在Comparator 里面用户可以自己实现复杂的可以通用的逻辑,使其可以匹配一些比较简单的对象,那样就可以节省很多重复劳动了。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部