首页 > 编程知识 正文

comparator和comparable的区别,java序列化

时间:2023-05-03 06:13:41 阅读:153726 作者:3606

Comparable和Comparator是Java核心API提供的两个接口,从名称中可以看出它们用于比较对象。 但是怎么用呢? 区别是什么呢? 有两个很好地回答这个问题的例子。 以下示例用于比较HDTV的大小。 我相信通过阅读以下代码,您将对Comparable和Comparator的使用有更清晰的认识。

可互换性

实现Comparable接口的类可以将自己的对象与其他对象进行比较。 也就是说,要比较同一类中的两个对象,请确保相应的类实现Comparable接口并实现compareTo ()方法。 代码如下所示。

类HDTV implements comparable {

私有大小;

私有字符串;

公共HDTV (intsize,String brand ) {

this.size=size;

this.brand=brand;

}

公共获取(

返回大小;

}

公共void setsize (intsize ) {

this.size=size;

}

公共字符串获取品牌

返回品牌;

}

publicvoidsetbrand(stringbrand ) {

this.brand=brand;

}

@Override

公共公司(HDTV TV ) {

if(this.getsize ) (tv.getSize ) )

返回1;

elseif(this.getsize ) (tv.getSize ) )

返回- 1;

else

返回0;

}

}

public class Main {

publicstaticvoidmain (string [ ] args ) {

HDTVTV1=newHDTV(55,' Samsung ';

HDTVTV2=newHDTV(60,' Sony ';

if(TV1.comPareto ) TV2 )0) {

system.out.println (tv1.get brand () ' is better.' );

} else {

system.out.println (tv2.get brand (' is better.' ) );

}

}

}

输出结果:

索尼电池。

计算机

在某些情况下,您不想修改原始类,但希望比较Comparator界面可以实现这种功能。 可以使用Comparator界面比较特定的属性/字段。 例如,我们比较两个人的时候,我可以用年龄比较,也可以用身高比较。 这种情况是Comparable无法实现的。 因为要实现Comparable接口,其中只有一个compareTo方法,无法实现多个比较。

要实现Comparator接口,还可以重写名为compare ()的方法。 下面的示例通过这种方式比较HDTV的大小。 实际上,Comparator通常用于排序。 Java的Collections和Arrays都包含排序的sort方法。 此方法可以接收Comparator的实例(比较器)并对其进行排序。

import java.util.ArrayList;

import java.util.Collections;

import java.util.Comparator;

类HDTV {

私有大小;

私有字符串;

公共HDTV (intsize,String brand ) {

this.size=size;

this.brand=brand;

}

公共获取(

返回大小;

}

公共void setsize (intsize ) {

this.size=size;

}

公共字符串获取品牌

返回品牌;

}

公共语音

setBrand(String brand) {

this.brand = brand;

}

}

class SizeComparator implements Comparator {

@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 al = new ArrayList();

al.add(tv1);

al.add(tv2);

al.add(tv3);

Collections.sort(al, new SizeComparator());

for (HDTV a : al) {

System.out.println(a.getBrand());

}

}

}

输出结果:

Panasonic

Samsung

Sony

以上代码就实现了通过自定义一个比较器(Comparator)来实现对一个列表进行排序。

我们也经常会使用Collections.reverseOrder()来获取一个倒序的Comparator。例如:

ArrayList al = new ArrayList();

al.add(3);

al.add(1);

al.add(2);

System.out.println(al);

Collections.sort(al);

System.out.println(al);

Comparator comparator = Collections.reverseOrder();

Collections.sort(al,comparator);

System.out.println(al);

输出结果:

[3,1,2]

[1,2,3]

[3,2,1]

如何选择

简单来说,一个类如果实现Comparable接口,那么他就具有了可比较性,意思就是说它的实例之间相互直接可以进行比较。

通常在两种情况下会定义一个实现Comparator类。

1、如上面的例子一样,可以把一个Comparator的子类传递给Collections.sort()、Arrays.sort()等方法,用于自定义排序规则。

2、用于初始化特定的数据结构。常见的有可排序的Set(TreeSet)和可排序的Map(TreeMap)

下面通过这两种方式分别创建TreeSet。

使用Comparator创建TreeSet

class Dog {

int size;

Dog(int s) {

size = s;

}

}

class SizeComparator implements Comparator {

@Override

public int compare(Dog d1, Dog d2) {

return d1.size - d2.size;

}

}

public class ImpComparable {

public static void main(String[] args) {

TreeSet d = new TreeSet(new SizeComparator()); // pass comparator

d.add(new Dog(1));

d.add(new Dog(2));

d.add(new Dog(1));

}

}

这里使用的就是Comparator的第二种用法,定义一个Comparator的子类,重写compare方法。然后在定义HashSet的时候,把这个类的实例传递给其构造函数。这样,再使用add方法向HashSet中增加元素的时候,就会按照刚刚定义的那个比较器的逻辑进行排序。

使用Comparable创建TreeSet

class Dog implements Comparable{

int size;

Dog(int s) {

size = s;

}

@Override

public int compareTo(Dog o) {

return o.size - this.size;

}

}

public class ImpComparable {

public static void main(String[] args) {

TreeSet d = new TreeSet();

d.add(new Dog(1));

d.add(new Dog(2));

d.add(new Dog(1));

}

}

这里,定义TreeSet的时候并没有传入一个比较器。但是使用add方法向HashSet中增加的对象是一个实现了Comparable的类的实例。所以,也能实现排序功能。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。