java 基础 | 对象之间的比较及 Comparator 和 Comparable 的区别

本贴最后更新于 1625 天前,其中的信息可能已经事过景迁

javaDEMO

本网站记录了最全的各种 JavaDEMO ,保证下载,复制就是可用的,包括基础的, 集合的, spring 的, Mybatis 的等等各种,助力你从菜鸟到大牛,记得收藏哦~~
https://www.javastudy.cloud

对象之间的比较方式

比较方式只要有以下四种

  1. 用 == 来比较
  2. 用 equals 来比较
  3. 用 Comparator 外部比较器来比较
  4. 实现 Comparable 接口来比较

用==比较

常用于比较基本类型的值是否想等,包装类型的地址是否相等
使用如下:

	int a=1 ,b = 1;
        // 输出true
        System.out.println(a==b);

用 equals 比较

equals 其实就是 java 里面的一个普通的方法,当前类有重写的话,就调用重写之后的,如果没有重写的话,则默认调用 Object 里面的 equals 方法.
如下面的 TestModel,重写了 equals 方法,只有名字和年龄都想等时才是想等的.

public class TestModel{

		private String name;

		private Integer age;

		public String getName() {
			return name;
		}

		public TestModel setName(String name) {
			this.name = name;
			return this;
		}

		public Integer getAge() {
			return age;
		}

		public TestModel setAge(Integer age) {
			this.age = age;
			return this;
		}

        @Override
        public boolean equals(Object obj) {
            TestModel target = (TestModel) obj;
            return this.name.equals(target.name) && age.equals(target.age);
        }
    }

使用 Comparable

用法可参考 jdk 中 Integer 类, Integer 也是实现了 Comparable 接口,需要重写 compareTo 方法,此方法本质上也是一个 java 方法,按需调用即可,如把我们已有的 a 和传入的目标 b 比较
a.compareTo(b);

void contextLoads() {
        TestModel t1 = new TestModel().setName("java").setAge(25);
        TestModel t2 = new TestModel().setName("study").setAge(12);
		System.out.println(t1.compareTo(t2));
    }

	static class TestModel implements Comparable<TestModel>{

		private String name;

		private Integer age;

		public String getName() {
			return name;
		}

		public TestModel setName(String name) {
			this.name = name;
			return this;
		}

		public Integer getAge() {
			return age;
		}

		public TestModel setAge(Integer age) {
			this.age = age;
			return this;
		}

		@Override
		public int compareTo(TestModel o) {
			if(this.age.equals(o.getAge())){
				return 0;
			}
			if(this.age> o.getAge()){
				return 1;
			}
			return -1;

		}
	}

使用 Comparator 进行比较

和 Comparable 需要当前实体类实现不同, Comparator 需要在外部定义 source 和 target 的比较逻辑.

/**
 * @Author https://www.javastudy.cloud
 * @CreateTime 2019/11/13
 **/
public class TestMain {

    public static void main(String[] args) {
        Comparator<TestModel> comparator = (source,target)->{
            if(source.getAge().equals(target.getAge())){
                return 0;
            }
            if(source.getAge()> target.getAge()){
                return 1;
            }
            return -1;
        };

        TestModel t1 = new TestModel().setName("java").setAge(25);
        TestModel t2 = new TestModel().setName("study").setAge(12);
        System.out.println(comparator.compare(t1,t2));
    }

    static class TestModel{

        private String name;

        private Integer age;

        public String getName() {
            return name;
        }

        public TestModel setName(String name) {
            this.name = name;
            return this;
        }

        public Integer getAge() {
            return age;
        }

        public TestModel setAge(Integer age) {
            this.age = age;
            return this;
        }

    }
}

生活中的例子看 Comparator 和 Comparable 的区别

如我们一直所诟病的应试教育, 教育体系内只按成绩给学生排名,即每个学生都实现了 Comparable 接口, comparaTo 方法就是根据学习成绩来的. 到了社会之后, 排名就多元化了,有根据挣的钱的,有根据社会影响力的,有根据道德思想的等等不同的 Comparator 来排序.
我们可以看到 Comparator 是在 java.util 包下,Comparable 是放在 java.lang 包下,可从命名上做区分,在以前学英语时,able 结尾的代表有什么什么能力,类似于 be able to . 这应该是一个实对/对象本身的能力,所以 Comparable 放在了 lang 包下,是语言层面的. 以 er/or 结尾的代表人/实体,如 creator,programmer 等等,如此看这个比较器不是实体本身的东西,而是和实体并列的,可以为实体提供一定的服务,所以 Comparator 放在了 util 下面, 加油吧,少年!

  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3168 引用 • 8207 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...