Comparable和 Comparator的区别

本文详细介绍了Java中Comparable和Comparator接口的区别与应用。Comparable接口允许类内部实现比较逻辑,而Comparator作为独立比较器,适用于未预先定义比较逻辑的类。文章通过示例展示了如何重写compareTo方法和实现Comparator接口,以及如何利用Collections工具类对List进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

Comparable和 Comparator都是java.util包下的两个接口
Comparable在类内使用
Comparator单独使用

1、Comparable

## 描述
Comparable是一个接口,通过类继承该接口,重写compareTo方法的实现比较,
compareTo的返回值为int,有三种情况:

  1. Other > this: return 正整数
  2. Other = this:return 0
  3. Other < this: return 负整数
    例如:

compareTo方法的重写:

@Override
	public int compareTo(Person o) {
		// TODO Auto-generated method stub
		//比较名字长度,优先
		int num = this.name.length() - o.name.length();
		//比较年龄
		int num1 = num==0?this.age - o.age:num;
		return num1;
	}

test类

List<Person> list = new ArrayList<>();
		Person person;
		for(int i=0;i<30;i++) {
			person = new Person("person"+i, 10-i);
			list.add(person);
		}
		//打乱顺序,测试sort
		Collections.shuffle(list);
		Collections.sort(list);
		
		for(Person ps:list) {
			System.out.println(ps);
		}

输出:
在这里插入图片描述

2、Comparator

描述
Comparator独立的比较器,当设计类时,没有考虑到比较器,后面想使用时,可以定义。
例如:
Comparator比较器,继承于接口java.util.Comparator

public class Comparator implements java.util.Comparator<Person> {

	@Override
	public int compare(Person o1, Person o2) {
		// TODO Auto-generated method stub
		int num = o1.getName().length() - o2.getName().length();
		int num1 = num==0?o1.getAge() - o2.getAge():num;
		return num1;
	}
}

测试:

List<Person> list = new ArrayList<>();
		Person person;
		for (int i = 0; i< 30; i++) {
        	person = new Person("person"+i, 30-i);
            list.add(person);
        }
		Collections.sort(list, new Comparator());
		for(Person ps:list) {
			System.out.println(ps);
		}

输出:
在这里插入图片描述
3、Collections工具类
Collections提供以下方法对List进行操作

void reverse(List list):反转

void shuffle(List list),随机排序

void sort(List list),按自然排序的升序排序

void sort(List list, Comparator c);定制排序,由Comparator控制排序逻辑

void swap(List list, int i , int j),交换两个索引位置的元素

void rotate(List list, int distance),旋转。当distance为正数时,将list后distance个元素整体移到前面。当distance为负数时,将 list的前distance个元素整体移到后面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值