六、对象比较
要对多个对象进行排序就必须解决两个对象间的大小比较问题。
提示:对象比较的关键是制定出确定对象大小的比较规则!支持大小比较的对象将其放入到一个标准集合中就直接支持排序和查找,使用起来非常方便。
6.1 IComparable接口
CompareTo()方法用于定义对象的比较规则,其返回值表明了比较结果。
CompareTo方法返回值代表含义,如下表所示:
CompareTo()方法返回值 | 含义 |
---|---|
<0 | 对象小 |
=0 | 对象相等 |
>0 | 对象大 |
6.2 Equals方法
如果只需要知道两个对象是否相等,不需要知道谁大谁小可以重写Object类的Equals()方法。
如果定义了CompareTo()方法,则通常会自己使用它来实现Equals()方法的功能。
6.2.1 Object.Equals方法的规则:
- 自反性(Reflexive):a.Equals(a)值为True。
- 对称性(Symmetric):a.Equals(b)的值与b.Equals(a)的值一致。
- 传递性(Transitive):如果a.Equals(b)的值为True,b.Equals(c)的值为True,则a.Equals(c)的值为True。
- 与null判等:a.Equals(null)的值为False。
6.2.2 重写GetHashCode方法
如果重写了Equals方法也必须重写GetHashCode方法,否则吃对象在放入需要使用对象Hash值的对象集合(如Hashtable)中时会出现问题。
重写要求:
- 如果两个对象的比较结果相等,这每个对象的GetHashCode方法都必须返回相同的值。
- 对象状态为改变时,多次调用她的GetHashCode方法必须返回相同的值。
- 为了获得最佳性能,选择的华西还是必须为所有输入生成随机分布。
6.2.3 运算符重载“==”
提示:运算符重载增加了代码的理解难度,建议慎用。
6.3 对象比较器
如果需要比较一些自身不能比较的大小的对象,我们可以通过定义一个第三方的类,实现IComparer或IComparer