"=="和equals

Posted 李赞启

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了"=="和equals相关的知识,希望对你有一定的参考价值。

"=="和equals方法都是比较两个对象是否相等的,但是这两个方法的本质是不同的,其实两个方法的比较久牵扯到值和址,提到这两个东西可能大多数都是懵逼的,我刚接触的时候更是懵逼,什么是值什么是址啊都什么跟什么啊!值是什么址又是什么。其实呢有些东西你深入进去了,你就会发现有些东西其实就是那么简单。说的再简单点其实就是会了不难(虽然说这句话很气人)。

值是什么?说的简单点,一个对象的值就类似与我们高中学的数学中X=20是一样的只不过说是在程序中在X的前面加了一个数据类型,而在我们学的程序中所说的值就是一个对象变量中实质上是存的什么东西,例如:int  a=12;那么12就是a这个对象的值,同时12是整型int。再举一个简单的例子 String a="aaaaa";这是时候可能很多人都会认为a的值就是“aaaaa”但是实质上a的值并不是“aaaaa”a的值是“aaaaa”这个对象在电脑内存中的引用地址,相对于我们生活来说就好比说是我们的家与家庭地址是一样的关系。家庭地址只是一连串的文字与数字的组合我们可以通过家庭地址找到我们的家或者是找到别人的家。那样这样我们就可以说家就是家庭地址吗。其实String a=“aaaaa”对应起来就是a就相当于家庭地址,而“aaaaa”这个对象才是真正的家。

也就是说a值是“aaaaa”的址。

==这个方法是在比较两个对象的值而不是址,这也是为什么我们对象跟对象看着“值”是一样的但是我们每次用“==”这个方法比较是总是会返回false。

例如:

String a=new String(“bbb”);

String b=new String(“bbb”);

a==b这时返回的就是falser。但是换一种方式看看:

String a=“bbb”;

String b=“bbb”;

a==b这时返回的就是true。

看到这可能很多人会懵逼,但是回去看看我们前面举的家的例子你就会明白个大概上面的例子:

第一个例子:看似是一样的但是仔细想想

String a=new String(“bbb”);

其实这句话就类似于我们在内存中盖了一间房子把“bbb”放进去这个房子了而把房子的地址给了a。

String b=new String(“bbb”);

这就话就相当于我们在内存中又盖了一间房子有把这间房子的地址给了b。

盖了两间房子住了同样的人但是两间房子的地址是不一样的所以我们在比较a和b的值得时候就会返回flase

我们再看第二个例子:

String a=“bbb”;

这句话的意思就是有一间房子有一个叫bbb的住进去了,然后把地址告诉了他的好朋友a。之后:String b=“bbb”;这句话是又把地址告诉了自己的好朋友b。

这种情况a和b都是bbb的好朋友都知道bbb的地址,所以a和b他们存的值是相等的都是bbb的地址,所以我们在比较的时候就是相等的,也就返回了flase;

而equals方法跟“==”方法有本质的区别,那就是equals不会管地址.

例如:

同样是上面的例子:

String a=new String(“bbb”);

String b=new String(“bbb”);

我们用a.equals(b)这时返回的就是true了。因为我们在用a.equals时就会直接跨过地址不理会地址直接找到与地址对应的相应的那块电脑内存直接比较内存中的存的东西看是否是相等的如果是那就返回true否则就返回flase。

这也是很我们在比较两个字符串对象是否相等的时候用equals方法而不用==的原因。

其实只要记住一点就行

那就是值和址的区别,知道了他们之间的区别也就会明白==和equals的区别所在

以上是关于"=="和equals的主要内容,如果未能解决你的问题,请参考以下文章

比较 $("#foo .bar") 和 $(".bar", "#foo") 的性能

[class$=" "] 和 [id*=" "] 有啥特殊性?

安全模式="Transport" 和安全模式="TransportCredentialOnly" 有啥区别

@Qualifier("beanName") 和 @Component("beanName") 的区别

mongodb,复制和错误: "$err" : "not master and slaveOk=false", "code" : 13435

NoReverse 匹配 "" Reverse for "" 参数 '()' 和关键字参数 ''