2021-02-14

还傻傻分不清楚equals和==的区别吗?看完就明白了

解决一个问题的最好方法就是发现一个问题产生的根源,即发现最本质的东西,再去解决它。

Java语言里面的equals()方法是交给开发者们自己去覆盖重写编写功能的,即让开发者去定义当满足什么条件时,两个Object是相等的。

equals方法是由Object提供的,允许子类进行重写。

equals()的原始代码实现如下:

public boolean equals(Object obj) { return (this == obj);}

而有一些博客说equals()是比较具体的内容是不是相同的,这个说法其实不太准确,以偏概全。这个说法的来源是很多教程都是以String类中的equals()为参照物进行举例,String类的equals()重写了Object对象的原始equals方法,只会比较具体的内容。

String类的equals()的具体实现代码如下:

public boolean equals(Object anObject) { if (this == anObject) {  return true; } if (anObject instanceof String) {  String anotherString = (String)anObject;  int n = count;  if (n == anotherString.count) {   char v1[] = value;   char v2[] = anotherString.value;   int i = offset;   int j = anotherString.offset;   while (n-- != 0) {    if (v1[i++] != v2[j++])     return false;   }   return true;  } } return false;}

而 == 是比较两个引用在内存中指向的是不是同一个对象,也就是在内存中的存储地址是不是一样的,两个对象的引用相同时(指向的是同一个对象),则 == 会返回true,否则返回false。

所以 == 是和Object类的原始equals()方法是等价的。

现在很多类都对equals进行了重写,这里用常见的String类来编写个测试Demo

public class TestString {	public static void main(String[] args) { 		String string_1 = "codevald";		String string_2 = "codevald";		System.out.println(string_1 == string_2); //结果为true				String string_3 = new String("codevald");		String string_4 = "code" + new String("vald");		System.out.println(string_3 == string_4); //结果为false		System.out.println(string_3.equals(string_4)); //结果为true		}}

可以看到Demo中第一个输出语句结果为true

String string_1 = "codevald"会现在栈中创建一个对String类的引用变量string_1,然后会去字符串常量池中寻找有没有"codevald",因为是第一次创建没有,则会将"codevald"存放进字符串常量池。

String string_2 = "codevald" 又在栈中创建了String类的引用变量string_2,然后会去字符串常量池中寻找有没有"codevald",如果没有,则会创建并存放进常量池,并将string_2指向"codevald",如果已经有了,则直接令string_2指向"codevald"。上面的代码已经将字符串存储进了常量池,所以两个引用(string_1和string_2)指向同一个"codevald",返回true。

String string_3 = new String("codevald")会在堆中创建一个对象,并将在栈中存在的对象引用指向堆中的对象,而String string_4则是分别用了常量池中的字符串和存放对象的堆中的字符串,做 + 的时候会进行动态调用,最后创建完生成的对象仍然存放在堆中,而两个对象在堆中的地址是不一样的,所以 == 会返回false。

而String类重写了equals方法,比较的是内存中存放的数据的具体内容是不是相同的,这里存放的都是"codevald",所以会返回true。

总结

对于字符串变量来说,使用""和"equals"比较字符串时,其比较方法不同。""比较两个变量本身的值,即两个对象在内存中的首地址,"equals"比较字符串包含内容是否相同。

对于非字符串变量来说,如果没有对equals()进行重写的话,"==" 和 "equals"方法的作用是相同的,都是用来比较对象在堆内存中的首地址,即用来比较两个引用变量是否指向同一个对象。









原文转载:http://www.shaoqun.com/a/553577.html

跨境电商:https://www.ikjzd.com/

Sunrate:https://www.ikjzd.com/w/2685

bestbuy:https://www.ikjzd.com/w/394


解决一个问题的最好方法就是发现一个问题产生的根源,即发现最本质的东西,再去解决它。Java语言里面的equals()方法是交给开发者们自己去覆盖重写编写功能的,即让开发者去定义当满足什么条件时,两个Object是相等的。equals方法是由Object提供的,允许子类进行重写。equals()的原始代码实现如下:publicbooleanequals(Objectobj){return(this=
亚马逊 海外购:亚马逊 海外购
tineye:tineye
美元汇率突破6.8关口,特朗普指责《华盛顿邮报》和USPS:美元汇率突破6.8关口,特朗普指责《华盛顿邮报》和USPS
亚马逊大卖这么多,我等小卖家还有生存空间吗?:亚马逊大卖这么多,我等小卖家还有生存空间吗?
订单突然下滑,卖家应该如何应对?:订单突然下滑,卖家应该如何应对?

No comments:

Post a Comment