Equals和==比較
总结一下:
对于字符串来说。两个比較的都是对象的值,而且是等效的,这是由于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和==比較的更多相关文章
- 【Java编码准则】の #11不要使用Object.equals()来比較密钥值
java.lang.Object.equals()函数默认情况下是不能用来比較组合对象的,比如密钥值.非常多Key类没有覆写equals()函数,因此,组合对象的比較必须单独比較里面的各个类型以保证正 ...
- JAVA中字符串比較equals()和equalsIgnoreCase()的差别
.使用equals( )方法比較两个字符串是否相等.它具有例如以下的一般形式: boolean equals(Object str) 这里str是一个用来与调用字符串(String)对象做比較的字符串 ...
- 【代码优化】equals深入理解
覆盖equals时,遵守通用约定 对equal方法的覆盖看起来非常easy,可是有很多情况是容易导致错误,最好的避免这些错误的办法 就是不覆盖equals方法. 必须遵循的原则: 自反性--对于不论什 ...
- 别样JAVA学习(五)继承上(1.0)Object类equals()
上一节继承下(一)我们进行抽象类.接口以及多态的学习. 接下来大家我们讲点特殊的东西就是object类, 我们一直在说继承,子继承了父,父还有没有父类呢, 为什么这么思考,大家想构造函数的第一行是不是 ...
- JAVA字符串比较equals()和equalsIgnoreCase()差异
.用equals( )方法比較两个字符串是否相等.它具有例如以下的一般形式: boolean equals(Object str) 这里str是一个用来与调用字符串(String)对象做比較的字符串( ...
- C#比較对象的相等性
对于相等的机制全部不同,这取决于比較的是引用类型还是值类型.以下分别介绍引用类型和值类型的相等性. 1.比較引用类型的相等性 System.Object定义了三种不同的方法,来比較对象的相等性:Ref ...
- ==和equals的差别
== 和 Equals 的差别 1. == 是一个运算符. 2.Equals则是string对象的方法.能够.(点)出来. 我们比較无非就是这两种 1.基本数据类型比較 2.引用对象比較 1.基本数据 ...
- java基金会成立Set
1.设置 当向集合Set中添加对象时.首先集合计算要添加对象的hashcode,依据该值得到一个位置用来存放当前的对象,当在该位置没有一个对象存在的时候,集合set觉得该对象在集合中不存在,直接添加进 ...
- java该HashTable,HashMap和HashSet
同一时候我们也对HashSet和HashMap的核心方法hashcode进行了具体解释,见<探索equals()和hashCode()方法>. 万事俱备,那么以下我们就对基于hash算法的 ...
随机推荐
- HDU 1312 Red and Black【DFS】
搜索虐我千万遍@_@-----一道搜索的水题,WA了好多好多次@_@发现是n,m搞反了-_- 题意-- 给出m行 n列的矩形,其中从@出发,不能跳到#,只能跳到'.'问最多能够跳到多少块'.' 直接搜 ...
- 洛谷P2045 方格取数加强版 最小费用流
Code: #include<cstdio> #include<cstring> #include<algorithm> #include<queue> ...
- 路飞学城Python-Day15
模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 支持多账户登录 支持账户间转账 记录每月日常消费流水 提供还 ...
- 51nod 1079 中国剩余定理模板
中国剩余定理就是同余方程组除数为质数的特殊情况 我直接用同余方程组解了. 记得exgcd后x要更新 还有先更新b1再更新m1,顺序不能错!!(不然会影响到b1的更新) #include<cstd ...
- HDU 4069 数独
好久没做题了,建图搞了好久…… 然后,判是否有多解的时候会把原来的答案覆盖掉…… 这里没注意,弄了一下午…… 代码: #include <iostream> #include <cs ...
- Qt之水平/垂直布局(QBoxLayout、QHBoxLayout、QVBoxLayout)
简述 QBoxLayout可以在水平方向或垂直方向上排列控件,由QHBoxLayout.QVBoxLayout所继承. QHBoxLayout:水平布局,在水平方向上排列控件,即:左右排列. QVBo ...
- jstack命令dump线程信息
jstack命令dump线程信息 D:\Java\jdk1.8.0_05\bin>jstack.exe 6540 > dump17 6540为java 线程pid: 出来的dump17文件 ...
- [MST] Restore the Model Tree State using Hot Module Reloading when Model Definitions Change
n this lesson, we will set up Hot Module Reloading(HMR), making it possible to load new definitions ...
- Android Application 类共享全局数据
android系统会为每一个程序执行时创建一个Application类的对象且仅创建一个.所以Application能够说是单例模式的一个类.且application对象的生命周期是整个程序中最长的, ...
- [Android] 使用Matrix矩阵类对图像进行缩放、旋转、对照度、亮度处理
前一篇文章讲述了Android拍照.截图.保存并显示在ImageView控件中,该篇文章继续讲述Android图像处理技术,主要操作包含:通过打开相冊里的图片,使用Matrix对图像进行缩放. ...