java对象的4种比较方法

java 专栏收录该内容
5 篇文章 0 订阅

概述

在java中,存在4种对象(含基础数据类型)的比较方式:==、equals、compareTo和compare。以及两种比较策略:引用比较和值比较。具体如下表所示。

比较基本数据类型对象
==、!=值比较引用比较。使用”==”进行对象引用比较有以下限制:比较引用是否为null;用于枚举比较时是值比较,因为每个枚举常量只有一个对象;检查两个引用是否指向同一个对象,通常对象的比较应该用equals
equals比较值的相等性。所有类都继承了该方法,但要进行值比较需要对equals方法复写,来实现比较逻辑。未复写的该方法的行为同”==”,是引用比较。通常equals首先进行”==”判断,是同一个对象则可快速返回
compareToComparable< T >的接口。比较值并返回1(大于)、0(等于)、小于(-1)。如果对象是具有自然顺序的或想要进行Collections.sort()或Arrays.sort(),可以实现Comparable接口。如String、Double、Interger等
compareComparator< T >的一个接口。比较两个对象的值。典型应用是将实现该接口的类作为工具类,传入如sort()之类的方法或用于排序的数据结构如TreeMap或TreeSet中进行对象排序。在下列场景中可能需要Comparator对象:多重比较,需要提供不同的排序方式。如要对一个具有name、ID、age、height的Person类进行排序,那么需要定义Comparator传入sort()方法;系统类为任意对象提供比较方法。如定义一个Comparator用于比较String的length;策略模式在需要将算法表现为一个对象的场景中实现策略模式,可将其作为参数或存储在数据结构中。如果类对象具有自然排序序列,则不需要该接口。

自然顺序(natural ordering):对象的值具有数值特性,可使用四则运算。如String、Integer类。

注意1:如果复写了equals()方法,也应该复写hashCode()方法。HashSet和HashMap之类的数据结构使用hashCode()来散列,如果不复写,在应用于这些数据结构时可能工作不正常。
注意2:一般情况下,如果a.equals(b)是true,那么a.compareTo(b) == 0也应该是true。一个例外是BigDecimal类,因为BigDecimal的equals是在value值和scale都相同才为true,而compareTo是value值相同scale不同也返回0。如:

BigDecimal bd = new BigDecimal(1.2, MathContext.DECIMAL32);
BigDecimal bd2 = new BigDecimal(1.2, MathContext.DECIMAL64);
bd.equals(bd2);    // return false
bd.compareTo(bd2); // return 0

代码示例

// 1. 值比较
int a = 5;
int b = 5;
int c = 6;
a == b; // return true
a == c; // return false


// 2. equals比较
// MyClass未复写equals方法
class MyClass {
    private int myVirable;
    MyClass() {}
    MyClass(int virable) {
        this.myVirable = virable;
    } 
}

MyClass obj1 = new MyClass(5);
MyClass obj2 = new MyClass(5);
MyClass obj3 = obj2;
obj1.equals(obj2); // return false
obj3.equals(obj1); // return true

// MyClass复写equals方法
class MyClass {
    private int myVirable;
    MyClass() {}
    MyClass(int virable) {
        this.myVirable = virable;
    }

    @Override
    public boolean equals(Object obj) {
        if(obj instanceof MyClass) {
            MyClass o = (MyClass)obj;
            if (o.myVirable == this.myVirable) {
                return true;
            }
        }

        return false;
    }
}

MyClass obj1 = new MyClass(5);
MyClass obj2 = new MyClass(5);
obj1.equals(obj2); // return true


// 3. compareTo比较
public class MyCompareClass implements Comparable<MyCompareClass> {
    private int code;

    MyCompareClass(int code) {
        this.code = code;
    }

    @Override
    public int compareTo(MyCompareClass o) {
        if(code > o.code) {
            return 1;
        } else if(code < o.code) {
            return -1;
        } else {
            return 0;
        }
    }
}

MyCompareClass comp1 = new MyCompareClass(7);
MyCompareClass comp2 = new MyCompareClass(5);
MyCompareClass comp3 = new MyCompareClass(9);
MyCompareClass comp4 = new MyCompareClass(7);
comp1.compareTo(comp2); // return 1
comp1.compareTo(comp3); // return -1
comp1.compareTo(comp4); // return 0


// 4. comapre比较
public class MyCompareClass {
    int code;
    MyCompareClass(int code) {
        this.code = code;
    }
}

// 实现比较器接口
class MyComparator implements Comparator<MyCompareClass>{  
    @Override  
    public int compare(MyCompareClass o1, MyCompareClass o2) {  
        if(o1.code > o2.code){  
            return 1;  
        } else if(o1.code < o2.code){  
            return -1;  
        } else {  
            return 0;
        }  
    }  
}

MyCompareClass o1 = new MyCompareClass(7);
MyCompareClass o2 = new MyCompareClass(5);
MyCompareClass o3 = new MyCompareClass(9);
List<MyCompareClass>list=new ArrayList<MyCompareClass>();  
list.add(o1);  
list.add(o2);  
list.add(o3);
Collections.sort(list, new MyComparator());
for(MyCompareClass e:list){  
    System.out.println(e.code);  
}  
// 输出为:
// 5
// 7
// 9

另外在3.中类实现Comparable接口时,可直接使用Collections.sort(list进行排序。
参考:
http://www.cnblogs.com/CoolRandy/articles/3676695.html

  • 2
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值