总结一下:

对于字符串来说。两个比較的都是对象的值,而且是等效的,这是由于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. 关于zabbix 的lld的web界面的配置

    lld脚本在配置文件中例子: UserParameter=lldisk,/bin/bash /script/lldisk.sh disk_count 1.监控项 2.监控项原型

  2. H5中 input消除默认,取消在手机上的点击高亮效果

    input消除默认,代码如下    input{             -webkit-tap-highlight-color: rgba(255, 255, 255, 0);            ...

  3. H5中嵌入flash

    <object height="900px" width="100%" classid="clsid:D27CDB6E-AE6D-11cf-96 ...

  4. 壹、js的概述

    一.js的起源 1992年的时候,一家名为Nomnas的公司开发出了c减减的嵌入式脚本语言:然后利用分享的方式,扩大其市场. 之后,Netscape为了扩展浏览器的功能,开发了一个名为LiveScri ...

  5. BZOJ 2555: SubString 后缀自动机_LCT

    很水的一道题,就是有些细节没注意到. 比如说将调试信息误以为是最终结果而多调了20分钟QAQ ..... 我们注意到,每新加一个节点,改变的是该节点沿着 Parent 走一直走到根节点. 对应的,在 ...

  6. React+Webpack+ES6环境搭建(自定义框架)

    引言 目前React前端框架是今年最火的.而基于React的React Native也迅速发展.React有其独特的组件化功能与JSX的新语法,帮助前端设计有了更好的设计与便捷,而React Nati ...

  7. VBA 中Dim含义

    楼主是个初学者,在应用vba时遇到了dim方面的问题,查了很多资料后想把关于dim的这点儿知识简单整理出来 首先,从我遇到的问题作为切入点吧, (不得不承认我遇到的错误是很低级的) 具体的情境就不还原 ...

  8. linux磁盘管理与分区 转载

    原文:http://zhengjianglong.leanote.com/post/linux%E7%A3%81%E7%9B%98%E5%88%86%E5%8C%BA 一.基础知识 一块磁盘可以分为多 ...

  9. python学习笔记:第五天

    day05: 1.字符串格式化输出: 1.占位符:%s (字符串)    %d(整型)   %f (浮点型) 打印格式:print("字符串为%s" %s) 2.字符串:判断是否是 ...

  10. Tarjan 割点割边【模板】

    #include <algorithm> #include <cstring> #include <cstdio> using namespace std; +); ...