javaDEMO
本网站记录了最全的各种 JavaDEMO ,保证下载,复制就是可用的,包括基础的, 集合的, spring 的, Mybatis 的等等各种,助力你从菜鸟到大牛,记得收藏哦~~
https://www.javastudy.cloud
对象之间的比较方式
比较方式只要有以下四种
- 用 == 来比较
- 用 equals 来比较
- 用 Comparator 外部比较器来比较
- 实现 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 下面, 加油吧,少年!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于