总结一下:

对于字符串来说。两个比較的都是对象的值,而且是等效的,这是由于MS重写了==运算符和Equals方法所致

            对于非字符串的其它引用类型(非匿名类型)两个比較的都是对象的引用。而且是等效的;

            对于匿名类型,Equal()方法比較的是类型的状态,假设两个类型的属性和值都同样,就返回true;==比較的是对象的引用。

对于判断类型(弱化类型、隐式类型),假设编译器判断为引用类型,则两个比較的都是对象的引用,而且是等效的,假设判断为值类型,则也是等效的。

    public class 鸡
{
public int 身高;
public int 体重;
public int 三围;
public 鸡(int _身高, int _体重, int _三围)
{
身高 = _身高;
体重 = _体重;
三围 = _三围;
} public 鸡()
{ }
public override string ToString()
{
return string.Format("身高:{0}。体重:{1},三围:{2}", 身高, 体重, 三围);
}
} class Program
{ static void Main(string[] args)
{
//值类型是存储在栈上,编译时分配内存
Console.WriteLine("值类型測试——————");
int a = 1;
int b = 1;
Console.WriteLine(string.Format("a={0},b={1}", a, b));
Console.WriteLine(a.Equals(b));//ture
Console.WriteLine(a == b);//ture b = 2;
Console.WriteLine(string.Format("a={0},b={1}", a, b));
Console.WriteLine(a.Equals(b));//false
Console.WriteLine(a == b);//false a = 1;
b = 1;
int temp_b = b;
Console.WriteLine(string.Format("a={0},temp_b={1}", a, temp_b));
Console.WriteLine(a.Equals(temp_b));//ture
Console.WriteLine(a == temp_b);//ture Console.WriteLine(string.Format("temp_b={0},b={1}", temp_b, b));
Console.WriteLine(temp_b.Equals(b));//ture
Console.WriteLine(temp_b == b);//ture //引用类型是存储在堆上,执行时分配内存
Console.WriteLine("引用类型測试——————");
鸡 xiao = new 鸡(1, 1, 1);
鸡 da = new 鸡(1, 1, 1);
Console.WriteLine(string.Format("xiao={0},da={1}", xiao, da)); Console.WriteLine(xiao.Equals(da));//false
Console.WriteLine(xiao == da);//false da = new 鸡(100, 100, 100);
Console.WriteLine(string.Format("xiao={0},da={1}", xiao, da));
Console.WriteLine(xiao.Equals(da));//false
Console.WriteLine(xiao == da);//false Console.WriteLine(string.Format("xiao和da是分配在不同堆上的,在内存中的地址不一样,Equals和==比較的是内存中的引用地址。")); 鸡 zhong = da;
Console.WriteLine(string.Format("zhong={0},da={1}", zhong, da));
Console.WriteLine(zhong.Equals(da));//ture
Console.WriteLine(zhong == da);//ture
Console.WriteLine("zhong指向da,所以引用的地址一样。故他们使用Equals和==是相等的");
Console.WriteLine("总结:对于非字符串类型的引用类型,这两种符号比較的都是变量的引用,并非值."); Console.WriteLine("string特殊引用类型測试——————");
string c = "1";
string d = "1";
Console.WriteLine(string.Format("c={0},d={1}", c, d)); Console.WriteLine(c.Equals(d));//ture
Console.WriteLine(c == d);//ture c = "2";
Console.WriteLine(string.Format("c={0},d={1}", c, d));
Console.WriteLine(c.Equals(d));//false
Console.WriteLine(c == d);//false string e = d;
Console.WriteLine(string.Format("e={0},d={1}", e, d));
Console.WriteLine(e.Equals(d));//ture
Console.WriteLine(e == d);//ture Console.WriteLine("匿名类型測试——————"); var v11 = new { 身高 = 10, 体重 = 10, 三围 = 10};
var w11 = new { 身高 = 10, 体重 = 10, 三围 = 10}; Console.WriteLine(string.Format("v11={0},w11={1}", v11, w11));
Console.WriteLine(v11.Equals(w11));//ture
Console.WriteLine(v11 == w11);//false var v1 = new { 身高 = 10, 体重 = 10, 三围 = 10, 年龄=100 };
var w1 = new { 身高 = 10, 体重 = 10, 三围 = 10, 年龄 = 100 }; Console.WriteLine(string.Format("v1={0},w1={1}", v1, w1));
Console.WriteLine(v1.Equals(w1));//ture
Console.WriteLine(v1 == w1);//false Console.WriteLine("判断类型(弱化类型、隐式类型)測试——————"); var v = 1;
var w = 1;
Console.WriteLine(string.Format("v={0},w={1}", v, w));
Console.WriteLine(v.Equals(w));//ture
Console.WriteLine(v == w);//ture var vv = new 鸡();
var ww = new 鸡();
vv.三围 = 10;
vv.身高 = 10;
vv.体重 = 10; ww.三围 = 10;
ww.身高 = 10;
ww.体重 = 10;
Console.WriteLine(string.Format("vv={0},ww={1}", vv, ww));
Console.WriteLine(vv.Equals(ww));//false
Console.WriteLine(vv == ww);//false vv = new 鸡(100,100,100);
ww = new 鸡(100, 100, 100);
Console.WriteLine(string.Format("vv={0},ww={1}", vv, ww));
Console.WriteLine(vv.Equals(ww));//false
Console.WriteLine(vv == ww);//false Console.WriteLine("对于字符串来说,两个比較的都是对象的值。而且是等效的,这是由于MS重写了==运算符和Equals方法所致");
Console.WriteLine();
Console.WriteLine("对于非字符串的其它引用类型(非匿名类型)两个比較的都是对象的引用,而且是等效的");
Console.WriteLine();
Console.WriteLine("对于匿名类型,Equal()方法比較的是类型的状态,假设两个类型的属性和值都同样,就返回true。==比較的是对象的引用。");
Console.WriteLine();
Console.WriteLine("对于判断类型(弱化类型、隐式类型),假设编译器判断为引用类型,则两个比較的都是对象的引用,而且是等效的,假设判断为值类型,则也是等效的。");
Console.WriteLine(); Console.ReadKey();
//对于字符串来说。两个比較的都是对象的值,而且是等效的,这是由于MS重写了==运算符和Equals方法所致
//对于非字符串的其它引用类型(非匿名类型)两个比較的都是对象的引用。而且是等效的。
//对于匿名类型。Equal()方法比較的是类型的状态。假设两个类型的属性和值都同样。就返回true;==比較的是对象的引用。
//对于判断类型(弱化类型、隐式类型)。假设编译器判断为引用类型,则两个比較的都是对象的引用。而且是等效的。假设判断为值类型。则也是等效的。 }
}

Equals和==比較的更多相关文章

  1. 【Java编码准则】の #11不要使用Object.equals()来比較密钥值

    java.lang.Object.equals()函数默认情况下是不能用来比較组合对象的,比如密钥值.非常多Key类没有覆写equals()函数,因此,组合对象的比較必须单独比較里面的各个类型以保证正 ...

  2. JAVA中字符串比較equals()和equalsIgnoreCase()的差别

    .使用equals( )方法比較两个字符串是否相等.它具有例如以下的一般形式: boolean equals(Object str) 这里str是一个用来与调用字符串(String)对象做比較的字符串 ...

  3. 【代码优化】equals深入理解

    覆盖equals时,遵守通用约定 对equal方法的覆盖看起来非常easy,可是有很多情况是容易导致错误,最好的避免这些错误的办法 就是不覆盖equals方法. 必须遵循的原则: 自反性--对于不论什 ...

  4. 别样JAVA学习(五)继承上(1.0)Object类equals()

    上一节继承下(一)我们进行抽象类.接口以及多态的学习. 接下来大家我们讲点特殊的东西就是object类, 我们一直在说继承,子继承了父,父还有没有父类呢, 为什么这么思考,大家想构造函数的第一行是不是 ...

  5. JAVA字符串比较equals()和equalsIgnoreCase()差异

    .用equals( )方法比較两个字符串是否相等.它具有例如以下的一般形式: boolean equals(Object str) 这里str是一个用来与调用字符串(String)对象做比較的字符串( ...

  6. C#比較对象的相等性

    对于相等的机制全部不同,这取决于比較的是引用类型还是值类型.以下分别介绍引用类型和值类型的相等性. 1.比較引用类型的相等性 System.Object定义了三种不同的方法,来比較对象的相等性:Ref ...

  7. ==和equals的差别

    == 和 Equals 的差别 1. == 是一个运算符. 2.Equals则是string对象的方法.能够.(点)出来. 我们比較无非就是这两种 1.基本数据类型比較 2.引用对象比較 1.基本数据 ...

  8. java基金会成立Set

    1.设置 当向集合Set中添加对象时.首先集合计算要添加对象的hashcode,依据该值得到一个位置用来存放当前的对象,当在该位置没有一个对象存在的时候,集合set觉得该对象在集合中不存在,直接添加进 ...

  9. java该HashTable,HashMap和HashSet

    同一时候我们也对HashSet和HashMap的核心方法hashcode进行了具体解释,见<探索equals()和hashCode()方法>. 万事俱备,那么以下我们就对基于hash算法的 ...

随机推荐

  1. [arc086e]snuke line

    题意: 有n个区间,询问对于$1\leq i\leq m$的每个i,有多少个区间至少包含一个i的倍数? $1\leq N\leq 3\times 10^5$ $1\leq M\leq 10^5$ 题解 ...

  2. windos环境python3.5安装 paramiko

    一.执行命令pip install paramiko,情况如下: C:\Users\ZFH>pip install paramikoCollecting paramiko  Downloadin ...

  3. 微信开发出现 redirect-uri參数错误原因是设置回调页面域名不要加HTTP://

    OAuth2.0 网页授权设置.回调页面域名不要加HTTP:// NND  微信的研发.你程序处理下非常麻烦吗?给个提示非常麻烦吗?让我查了1个多小时.

  4. spring揭秘 读书笔记 二 BeanFactory的对象注冊与依赖绑定

    本文是王福强所著<<spring揭秘>>一书的读书笔记 我们前面就说过,Spring的IoC容器时一个IoC Service Provider,并且IoC Service Pr ...

  5. Swift环境下实现UILabel居上 居中 居下对齐

    首先在Xcode中新建.h文件,将下面代码复制进去 // // myUILabel.h // // // Created by yexiaozi_007 on 3/4/13. // Copyright ...

  6. vs输出窗口,显示build的时间

    https://stackoverflow.com/questions/82128/displaying-build-times-in-visual-studio Tools... Options.. ...

  7. zzulioj--1804--ZY学长的密码(字符串)

    1804: ZY学长的密码 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 140  Solved: 53 SubmitStatusWeb Board ...

  8. HDU4825:Xor Sum 解题报告(0/1 Trie树)

    Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数. 随后 Prometheus 将向 Ze ...

  9. [学习笔记]node.js中的path.extname方法

    path.extname 返回path路径文件扩展名,如果path以 ‘.' 为结尾,将返回 ‘.',如果无扩展名 又 不以'.'结尾,将返回空值. path.extname('index.html' ...

  10. Edge浏览器开发人员工具

    UserAgent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Ch ...