对象的比较与排序(四):对象的相等判断Equals和IEquatable<T>
2012-02-03 16:50
429 查看
本节覆盖了以下知识点:
一、Object.Equals()方法;
二、“==”,“!=”运算符重载;
三、IEquatable<T> 接口。
一、重写Equals方法。
众所周知,Object类型有一个名为Equals的实例方法可以用来确定两个对象是否相等。Object的Equals的默认实现比较的是两个对象的引用等同性。而Object的派生类ValueTpye重写了Equals方法,它比较的是两个对象的逻辑等同性。也就是说,在C#里,引用类型的默认Equals版本关注的是引用等同性,而值类型关注的是逻辑等同性。当然,这并不总能满足我们的要求。所以每当我们更在意引用类型的逻辑等同性的时候,我们就应该重写Equals方法。
上一个日记通过实现IComparable<T>接口的对象可以相互比较,但比较结果是0,1和-1,显得不直观,在许多情况下,可能只需要知道两个对象是否相等,而不需要知道这两个对象
“谁大谁小”,这时,可以重写object类的 Equals方法。
可以看到,Equals方法的内部调用CompareTo方法进行对象比较。
总结:
C#中有两种不同的相等:引用相等和值相等。值相等,即两个对象包含相同的值。例如,两个值为2的整数数具有值相等性。引用相等意味着要比较的两个对象不是两个对象,而是两个“对象引用”,这两个“对象引用”引用的是同一个对象。
1、对于值类型
对于值类型,如果对象的值相等,则相等运算符 (==) 返回 true,否则返回 false。
2、对于引用类型
对于string 以外的引用类型,如果两个对象引用同一个对象,则 == 返回 true。对于 string 类型,== 比较字符串的值。
==操作比较的是两个变量的值是否相等。
equals()方法比较的是两个对象的内容是否一致.equals也就是比较引用类型是否是对同一个对象的引用。
首先我们看一段程序:
测试代码
一、Object.Equals()方法;
二、“==”,“!=”运算符重载;
三、IEquatable<T> 接口。
一、重写Equals方法。
众所周知,Object类型有一个名为Equals的实例方法可以用来确定两个对象是否相等。Object的Equals的默认实现比较的是两个对象的引用等同性。而Object的派生类ValueTpye重写了Equals方法,它比较的是两个对象的逻辑等同性。也就是说,在C#里,引用类型的默认Equals版本关注的是引用等同性,而值类型关注的是逻辑等同性。当然,这并不总能满足我们的要求。所以每当我们更在意引用类型的逻辑等同性的时候,我们就应该重写Equals方法。
上一个日记通过实现IComparable<T>接口的对象可以相互比较,但比较结果是0,1和-1,显得不直观,在许多情况下,可能只需要知道两个对象是否相等,而不需要知道这两个对象
“谁大谁小”,这时,可以重写object类的 Equals方法。
public override bool Equal(object obj) { if(this.CompareTo(obj)==0) return true; else return false; }
可以看到,Equals方法的内部调用CompareTo方法进行对象比较。
总结:
C#中有两种不同的相等:引用相等和值相等。值相等,即两个对象包含相同的值。例如,两个值为2的整数数具有值相等性。引用相等意味着要比较的两个对象不是两个对象,而是两个“对象引用”,这两个“对象引用”引用的是同一个对象。
1、对于值类型
对于值类型,如果对象的值相等,则相等运算符 (==) 返回 true,否则返回 false。
2、对于引用类型
对于string 以外的引用类型,如果两个对象引用同一个对象,则 == 返回 true。对于 string 类型,== 比较字符串的值。
==操作比较的是两个变量的值是否相等。
equals()方法比较的是两个对象的内容是否一致.equals也就是比较引用类型是否是对同一个对象的引用。
首先我们看一段程序:
测试代码
using System; using System.Collections.Generic; using System.Text; namespace ObjectCompare { class Program { static void Main(string[] args) { Circle obj1 = new Circle { Radius = 100.1 }; Circle obj2 = new Circle { Radius = 100.9 }; //测试覆盖的方法 Console.WriteLine(obj1.GetHashCode());//100100 Console.WriteLine(obj2.GetHashCode());//100900 Console.WriteLine(obj1.CompareTo(obj2)); //-1 Console.WriteLine(obj1.Equals(obj2));//false //测试重载的运算符 Console.WriteLine(obj1 == obj2); //false Console.WriteLine(obj1 != obj2); //true Console.WriteLine(obj1 >= obj2); //false //以下测试Circle对象数组的排序功能 Circle[] circles = new Circle[10]; //创建Circle对象数组 Random ran = new Random(); for (int i = 0; i < 10; i++) { circles[i] = new Circle { Radius = ran.Next(1, 1000)/100.0 }; } Console.WriteLine("原始数组:"); Array.ForEach<Circle>(circles, (circle) => { Console.WriteLine("圆对象的哈希代码:{0},半径:{1}", circle.GetHashCode(), circle.Radius); }); Console.WriteLine("\n排序之后:"); Array.Sort(circles); Array.ForEach<Circle>(circles, (circle) => { Console.WriteLine("圆对象的哈希代码:{0},半径:{1}", circle.GetHashCode(), circle.Radius); }); Console.ReadKey(); } } }
相关文章推荐
- 对象的比较与排序(四):对象的相等判断Equals和IEquatable<T>(转)
- 比较一个对象list中的id值和List<Integer>的值是否相等
- 对象的比较与排序(三):实现IComparable<T>和IComparer<T>泛型接口
- 对象的比较与排序(三):实现IComparable<T>和IComparer<T>泛型接口(转)
- 对象的比较与排序(三):实现IComparable<T>和IComparer<T>泛型接口
- 对象的比较与排序(七):对泛型列表进行排序和搜索:Comparison<T>和Predicate<T>的应用
- 根据部分属性判断List<实体bean>中是否含有某个实体bean-重写equals方法
- IEquatable<T>.Equals 是Object.Equals方法的泛型版本
- C# 如何判断 List<T> 中包含某个属性的对象? 就是说,List<Person> 中如何判 断是否包含某一值
- java 判断两个对象是否相等 equals 和 hashcode() 的必要性
- 直接比较两个对象是否相等返回false和List中判断是否包含某个对象的问题
- 如何判断对象包含List<T>中的类型
- 对一个List<B>类型的对象进行排序
- 面向对象 < const > 常量定义 与 < instanceof > 判断实例化
- equals和hashcode方面判断对象是否相等是很重要的
- List<T>在搜索和排序时采用不同方法的性能比较
- 判断两个对象内容相等与equals方法
- 判断比较两个对象是否是一个对象(equals方法)
- 判断是否是同一人的方法——equals()?在Person类中提供一个比较的方法compare()返回boolean值?对象自己和自己比?
- 默认的Equals并非是判断两个对象相等,而是判断是否是同一引用