Java中的 Comparable 与 Comparator的区别以及使用场景

Comparable 的位置:java.lang.Comparable;
Comparator的位置: java.util.Comparator;

Collections.sort() 和 Arrays.sort()方法可以对Object数组进行排序,但是这种方法排序要求对象所在的类必须实现Comparable接口,此接口用于指定排序规则

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class HDTV implements Comparable<HDTV> {

    private int size;
    private String brand;

    public HDTV(int size, String brand) {
        this.size = size;
        this.brand = brand;
    }

public int getSize() {
    return size;
}

public void setSize(int size) {
    this.size = size;
}

public String getBrand() {
    return brand;
}

public void setBrand(String brand) {
    this.brand = brand;
}

@Override
public int compareTo(HDTV tv) {
    if (this.getSize() > tv.getSize())
        return 1;
    else if (this.getSize() < tv.getSize())
        return -1;
    else
        return 0;
}

public static void main(String[] args) {
    HDTV tv1 = new HDTV(55, "Samsung");
    HDTV tv2 = new HDTV(60, "Sony");
    HDTV tv3 = new HDTV(35, "Apple");

    List<HDTV> list = new ArrayList<HDTV>();
    list.add(tv1);list.add(tv2);list.add(tv3);

    Collections.sort(list);

    for (HDTV tv : list) {
        System.out.println(tv.getSize()+"---"+tv.getBrand());
    }


}

如果一个类已经开发完成,但是在此类建立的初期并没有实现Comparable接口,此时肯定是无法进行对象排序操作的,所以为了解决这个问题,java定义了另一个比较器的操作接口–Comparator

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

class HDTV {
    private int size;
    private String brand;

    public HDTV(int size, String brand) {
        this.size = size;
        this.brand = brand;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    public String getBrand() {
        return brand;
    }

    public void setBrand(String brand) {
        this.brand = brand;
    }
}

class SizeComparator implements Comparator<HDTV> {
    @Override
    public int compare(HDTV tv1, HDTV tv2) {
        int tv1Size = tv1.getSize();
        int tv2Size = tv2.getSize();

        if (tv1Size > tv2Size) {
            return 1;
        } else if (tv1Size < tv2Size) {
            return -1;
        } else {
            return 0;
        }
    }
}

public class Main {
    public static void main(String[] args) {
        HDTV tv1 = new HDTV(55, "Samsung");
        HDTV tv2 = new HDTV(60, "Sony");
        HDTV tv3 = new HDTV(42, "Panasonic");

    ArrayList<HDTV> al = new ArrayList<HDTV>();
    al.add(tv1);
    al.add(tv2);
    al.add(tv3);

    Collections.sort(al, new SizeComparator());
    for (HDTV a : al) {
        System.out.println(a.getBrand());
    }
}

总结:

Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完成比较大小操作,已经实现了Comparable接口)

用 Comparator 是策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ComparatorComparable都是Java用于比较对象的接口,但它们的使用场景略有不同。 Comparable接口是Java内置的接口,用于对类的对象进行比较。如果一个类实现了Comparable接口,那么它的对象就可以通过Collections.sort()或Arrays.sort()方法进行排序。Comparable接口只有一个compareTo()方法,用于定义对象之间的自然排序规则。例如,如果我们有一个Student类,我们可以在其实现Comparable接口,以便按照学生的年龄进行排序: ```java public class Student implements Comparable<Student> { private String name; private int age; // 构造函数、getter和setter方法 @Override public int compareTo(Student other) { return Integer.compare(this.age, other.age); } } ``` Comparator接口也是Java的接口,用于对类的对象进行比较。与Comparable不同的是,Comparator接口可以在创建对象时动态地指定排序规则。Comparator接口有两个方法:compare()和equals()。compare()方法用于定义对象之间的排序规则,而equals()方法用于比较两个对象是否相等。例如,如果我们有一个Person类,我们可以在其实现Comparator接口,以便按照身高进行排序: ```java public class Person { private String name; private int age; private int height; // 构造函数、getter和setter方法 public static Comparator<Person> heightComparator = new Comparator<Person>() { @Override public int compare(Person p1, Person p2) { return Integer.compare(p1.getHeight(), p2.getHeight()); } }; } ``` 在上面的例子,我们创建了一个名为heightComparatorComparator对象,它可以按照Person对象的身高进行排序。在需要按照身高排序的时候,我们可以使用Collections.sort()或Arrays.sort()方法,并将heightComparator作为参数传递进去。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值