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 2122 Ice_cream’s world III【最小生成树】
解题思路:基础的最小生成树反思:不明白为什么i从1开始取,就一直WA,难道是因为村庄的编号是从0开始的吗 Ice_cream’s world III Time Limit: 3000/1000 MS ...
- 《Unix环境高级编程》读书笔记 第8章-进程控制
1. 进程标识 进程ID标识符是唯一.可复用的.大多数Unix系统实现延迟复用算法,使得赋予新建进程的ID不同于最近终止所使用的ID ID为0的进程通常是调度进程,也常被称为交换进程.它是内核的一部分 ...
- python编程基础
Date: 2019-05-27 Author: Sun 1. 程序 为了完成某种特定功能,以某种程序设计语言编写的有序指令的集合.程序是指挥cpu工作的"工作手册".计算机只能执 ...
- HDU-2087 剪花布条 字符串问题 KMP算法 查匹配子串
题目链接:https://cn.vjudge.net/problem/HDU-2087 题意 中文题咯 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条, ...
- 紫书 例题 11-1 UVa 12219 (表达式树)
这道题看了刘汝佳的代码真的是天秀, 很值得学习. 具体看代码 #include<cstdio> #include<iostream> #include<cctype> ...
- 现代C++
C++ 是世界上最常用的编程语言之一. 编写良好的 C++ 程序是快速.高效的. 该语言比其他语言更加灵活,因为你可以使用它来创建各种应用,包括有趣刺激的游戏.高性能科学软件.设备驱动程序.嵌入式程序 ...
- C++ 数字、string 简便互转
一.数字转为 string 类型 借用 sprintf 函数: char buffer[256]; int counter = 10; sprintf(buffer,"%04i", ...
- 实时监控Cat之旅~对请求是否正常结束做监控(分布式的消息树)
对基于请求的分布式消息树的分析 在MVC时有过滤器System.Web.Mvc.ActionFilterAttribute,它可以对action执行的整个过程进行拦截,执行前与执行后我们可以注入自己的 ...
- zookeeper图形界面工具zooinspector
链接: https://pan.baidu.com/s/1rabrwuC 密码: trwa zooinspector下载地址 解压后进入
- python3.x学习笔记2(基础知识)
1.元组元组其实跟列表差不多,也是存一组数,只是它一旦创建,便不能在修改,所以又叫只读列表语法:names =('shgd','sjdh') 它只有两个方法,一个是count,一个是index 2.字 ...