一、跟对象比较的几个相关的概念。
为了愈加审核的了解对象比较的含义以及多个比较方法之间的差别,笔者认为读者首先需求了解几个相关的概念,或者说几对关系。
一是类与对象的关系。类是具体的笼统,而对象是类的具体完成。这可能听起来还是有点模糊。做一个笼统的比喻,类就好像是用来制作塑料盒子的模具,只要将PVC料注入到这个模具中就可以生产对应外形的盒子。而对象就好像是生产出来的盒子。虽然模具同一个,但是生产出来的盒子彼此之间仍然是不同的。一方面先天分就是不同的。由于依据相对论可以说明世界上没有两个相同的东西。其次后天分的影响,也会招致其不同。如生产出来后,在两个盒子上分别贴上不同的条码,他们两个就代表不同的盒子了。了解这个类与对象之间的关系,对于了解对象之间进行比较,会有很大的协助。
二是需求知道类与对象在内存中的实际存储状况。当顺序员定义一个类时(不含有静态成员或者变量),普通不会在内存中给其分配一个存储结构。而只要定义对象时,才会在内存中分配存储结构。当利用同一个类定义不同的对象时,系统会在内存中为不同的对象创建不同的存储结构。也就是说,会对应不同的内存地址。虽然同一个类中定义出来的对象,其内容可能相同(成员变量、成员方法等等都相同),但是其内存中的地址仍然是不同的。
三是需求留意对象的复制问题。假设要创建几个内容相同的对象,即复制相同内容的对象,现在主要有两种方法。一是经过成员变量赋值来完成。如在依据同一个类创建对象时,分别给与他们相同的初始化值。那么这两个对象的内容就是相同的。二是经过地址赋值来完成。行将第一个对象在内存中的地址赋值给第二个对象。此时两个对象名字虽然不同,但是他们却指向内存中的同一块区域。此时就好像一个人有两个名字,其实是同一个人。所以这两个对象内容也就相同了。
二、利用==运算符与equals方法来比较对象。
在Java言语中,主要可以利用==运算符(两个等号)和equal函数来对对象进行比较。不过这两个符号其完成的机制不同。或者说,对于同样的两个对象,假设利用他们来进行比较的话,往往会有不同的后果。如String是Java自定义的对象,其主要用来存储字符串数据。现在笔者利用如下语句定义了三个String对象。
String str1=new String(“welcome”); //创建一个对象,给利用单词welcome初始化
String str2=new String(“welcome”); //创建一个对象,给利用单词welcome初始化
String str3=str1; //创建一个对象,并利用对象str1的地址赋值
以上三个对象,显而易见,其内容都是相同的。但是利用这个两种方式来对他们进行比较的时分,往往会有不同的后果。如利用==(两个等号)比较符号来进行比较,str1==str2,最后前往的结构是false,也就是他们是不相同的对象。可是假设比较str1==str3对象,则最后前往的后果却是true。但是利用equal函数来比较,则前往的后果是相同的。为什么对象的内容相同,它们前往的后果却是不同的呢?
要回答这个问题,就需求大家先回顾一下笔者上面谈到的几对关系。首先,对象str1与对象str2的关系,就好像是同一个模具出来的两个盒子,他们从外观看起来虽然相同,但是经过放大镜或者其他精密仪器仍然可以看到,两个盒子是不同的东西。这两个对象虽然内容相同,但是其在内存中分配的地址不同。也就是说,是同一个模具出来的外观看起来相同的不同的盒子。而对象str1与对象str3就好像是一个人有两个名字。虽然名字不同,但是实际上是同一个人。这主要是由于他们的身份证号码相同。其实这个身份证号码就好像是内存中发配的地址,而对象名字就好象是人的名字。一个人可以有好几个名字(一个对象有好几个名字),但是其身份证号码只要一个(内存分配地址只要一个)。在上面的语句中,经过str3=str1,其完成的功能,
斐格旗舰店并不是将对象str1的值赋值给对象str3。而是将对象str1在内存中的地址赋值给了对象str1(就好像是将一个人的身份证号码复制给了另外一个人)。所以从本质上说,str3并不是一个新树立的对象。由于系统并没有在内存中为其分配一个新的存储区域(即并没有发明一个新的人),而只是好像给对象另外取了一个别名。
所以说,在对象比较的时分,需求搞清楚一个问题。即现在要比较的是他们的内容还是在内存中指向的地址。普通来说,内容相同不一定他们在内存中指向的地址也是相同的。而不同的对象在内存中若指向同一个地址,则他们的内容一定是相同的(由于他们实际上就是同一个对象)。而==(两个等号)运算符与equal函数就是运来比较这两块内容的。其中==运算符是用来比较内存中的地址能否相同,即比较它们的身份证号码能否相同。而equal函数则只比较他们的内容。假设他们的内容相同,即使身份证号码不相同(内存中的地址不同),这个函数也人们他们是相同的,会前往TRUE值。这就是这个两个对象比较方式的最大不同。或者说,他们在对对象进行比较时,出发点不同。一个比较对象名字所指向的内存地址能否相同,另外一个比较的时 对象名字所指向的存储模块中的内容能否相同。所以他们就会前往不同的后果。