我们在编程的时候,经常会遇到判断两个对象是否相等的情况。说到判断两个对象是否相等,就不得不说对象的类型和对象在内存中的存储情况。

对象类型可以分为值类型和引用类型:

值类型包括:简单类型、结构类型、枚举类型
      引用类型包括:类、代表、数组、接口。

值类型是直接存储在内存的栈上的,引用类型在存储的时候有点特殊,会有一个对象引用和对象的值,对象的值存在堆上,对象引用也即对象值在堆上的地址存在栈上,

至于堆和栈在这里就不细说了。

先上代码:

#region 源代码
string str1 = "test";
string str2 = "test";
Console.WriteLine(str1 == str2);
Console.WriteLine(str1.Equals(str2));
Console.WriteLine("*********"); object o1 = str1;
object o2 = str2;
Console.WriteLine(o1 == o2);
Console.WriteLine(o1.Equals(o2));
Console.WriteLine("*********"); string str3 = new string(new char[] { 'A', 'B', 'C', 'D' });
string str4 = new string(new char[] { 'A', 'B', 'C', 'D' });
Console.WriteLine(str3 == str4);
Console.WriteLine(str3.Equals(str4));
Console.WriteLine("*********"); object ob1 = str3;
object ob2 = str4;
Console.WriteLine(ob1 == ob2);
Console.WriteLine(ob1.Equals(ob2));
Console.WriteLine("*********"); Person p1 = new Person("xiaosy");
Person p2 = new Person("xiaosy");
Console.WriteLine(p1 == p2);
Console.WriteLine(p1.Equals(p2));
Console.WriteLine("*********"); Person p3 = new Person("xiaosy");
Person p4 = p3;
Console.WriteLine(p3 == p4);
Console.WriteLine(p3.Equals(p4));
Console.WriteLine("*********");
Console.ReadKey();
#endregion

执行结果:

==对于值类型的比较,就是直接比较内容是否一样,如果内容一样直接返回true,如果内容不一样则返回false;而对于引用类型的比较,比较的则是两个变量的存储地址,即在栈里的内容是否一致。

Equal()比较的是两个对象是否是同一个对象引用,即堆中的内容是否相同。

而字符串是一个特殊的引用类型,因此,在上面的例子中,字符串str3和str4比较是相等的。因为object ob1和object ob2在内存中是两个不同的对象,所以存储的地址不同,故不相等。而equals比较的是两个对象存储地址对应的内存空间里的内容,故相等。

而object o1和object o2相等,因为系统并没有为s2分配内存,只是将“test"指向了s2.所以s1和s2指向的是同一个字符串。

对于p1和p2,也是内存中两个不同的对象,所以在内存中的地址肯定不相同,故p1==p2会返回false;又因为p1和p2是对不同对象的引用,所以调用equals方法也会返回false。

对于p3和p4,由于p4=p3,p3将对象的引用赋给了p4,p3和p4指向同一地址,是对同一个对象的引用,所以两个比较都返回true。

==和Equal()的区别的更多相关文章

  1. Java中equal和==区别及String创建过程

    Java中equal和==区别 1.起因 在一段Java代码中,使用了两种实现方式. //第一种命令行输入 int main (String[] args) { if(args[0] == " ...

  2. java的==和equal的区别(一)

    java的==和equal的区别 “==”是用来比较两个String对象在内存中的存放地址是否相同的.例如, 1 2 3 4 5 6 7 8 9 String test1 = "test&q ...

  3. == 和equal的区别?-005

    1,== 和equal的区别? ==比较两个值是否相等,equal比较对对象的引用是否一致 举例: int a = 2; int b = 2; System.err.println(a == b);/ ...

  4. java中 == 与 equal 的区别

    http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452156.html String str1 = new String("s ...

  5. equal与==区别

    对于String中的“equal方法”和“==”一直有点混肴,今天重新看了一下他们两点的区别,记录下来让自己以后不在忘记! 先说“==”: “==”是用来比较两个String对象在内存中的存放地址是否 ...

  6. C# 中==和Equal的区别

    http://new-fighter.iteye.com/blog/1634800 今天突然看到一种情况,颠覆了我对这比较使用方法的判断. 于是开始在网上找资料,但几乎都是Java的,好不容易找到一个 ...

  7. Java 关于 == 和 equal()的区别

    因为用new创建了两个对象,所以a和b指向两个不同的内存地址,所以返回false equal()是object的方法,所以只适用于对象,不使用于基本类型.不过equal()默认是用“==”比较两个对象 ...

  8. Java Script 中 ==(Equal) 和 === (Identity Equal) 的区别和比较算法逻辑

    判断两个变量是否相等在任何编程语言中都是非常重要的功能. JavaScript 提供了 == 和 === 两种判断两个变量是否相等的运算符,但我们开始学习的时候 JavaScript 的时候,就被一遍 ...

  9. 比较对象--"=="与"equal"的区别

    String stra=new String("你好"); String strb=new String("你好"); String strc=stra; bo ...

  10. java中==与equal()的区别

    ==和equal()都是用来判断两个变量是否相等的. (1)如果两个变量是基本类型变量,且都是数值型的(不一定数据类型相同),只要是值相同,将返回true; (2)如果两个变量是引用型变量,只有它们指 ...

随机推荐

  1. 【MVC+MySQL+EntityFramework】查询性能优化笔记

    通过在DbContext中定了表之间的关系,查询后在View中通过item.ProjectOverHour来显示关联表数据. modelBuilder.Entity<ProjectOverHou ...

  2. JMeter3.0配置

    解压apache-jmeter-3.0.zip文件至c盘,本文解压至C:\jmeter3目录下. 桌面上选择“我的电脑”(右键),高级, 环境变量, 在“系统变量”--->“新建”, 在变量名中 ...

  3. scott权限

    有时scott数据被破坏了  可以回复 以下为 安装路径 dos下   @G:\app\Administrator\product\11.2.0\dbhome_1\RDBMS\ADMIN\scott. ...

  4. 巧用FTP命令进行文件传输

    巧用FTP进行文件传输   Internet作为现代信息高速公路已深入我们的生活,其中它所提供的电子邮件Web网站信息服务已被越来越多的人所熟知和使用.FTP作为Internet的功能之一,虽然没有像 ...

  5. 网页中font-family的属性解析

    web中文字体的选择 web应用程序因其跨平台性被广泛应用,但是也为web应用程序运行带来了复杂的运行环境,比如各个系统字体的区别以及中英文字体显示的区别. 字体分类 网页常用字体通常分为5类:ser ...

  6. unity3d贴图2D

    在GUI上绘制图片步骤如下: 1.定义一个2D图片纹理变量: public Texture2D pic; 2.关联变量和贴图的关系: 在布局界面选中MainCamera,找到右侧属性列表中的pic选项 ...

  7. oracle事务块示例

    begin Insert into T_SYS_PAGEOPER (FOPERID,FPAGEID) values (152,22); Insert into T_SYS_PAGEOPER (FOPE ...

  8. Chrome应用技巧之颜色拾取

    之前在Chrome应用店找了个插件实现拾色功能.并且很不理想.不知道是不是曾经Chrome自带的开发工具没提供到拾色功能还是我没发现.今天无意中发现Chomer自带的开发工具可拾色,请看以下的GIF动 ...

  9. NOPcommerce研究

    http://www.cnblogs.com/gusixing/archive/2012/04/07/2435873.html

  10. Mysql各种类型字段长度

    1.数值类型 列类型 需要的存储量 TINYINT 1 字节 SMALLINT 2 个字节 MEDIUMINT 3 个字节 INT 4 个字节 INTEGER 4 个字节 BIGINT 8 个字节 F ...