javaSE中的==和equals的联系与区别是怎样的

技术javaSE中的==和equals的联系与区别是怎样的这篇文章给大家介绍javaSE中的==和equals的联系与区别是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。写在前面:==和equ

本文介绍了javaSE中==和equals之间的联系和区别,内容非常详细。感兴趣的朋友可以参考一下,希望对你有所帮助。

写在前面:

==和equals是我们面试中常见的问题。那么它们之间有什么联系和区别呢?今天就来聊聊吧!

典型问题

以下是一些典型的书面问题:

int x=

10;

int y=

10;

字符串str1=

新字符串(' ABC ');

字符串str2=

新字符串(' ABC ');

字符串str3=

ABC ';

字符串str4=

ABC ';

system . out . println(x==y);

//输出?

system . out . println(str 1==str 2);//输出?

system . out . println(str 1 . equals(str 2));//输出?

system . out . println(str 3==str 4);//输出?

system . out . println(str 1==str 3);//输出?

system . out . println(str 1 . equals(str 3));//输出?

整数f1=100,f2=100,f3=150,f4=150

system . out . println(f1==F2);//输出?

system . out . println(F3==F4);//输出?

主体

我们通常说“==”是用来判断两个变量之间的值是否相等。变量分为基本数据类型变量和引用类型。如果基本数据类型的变量直接比较值,而引用类型比较相应引用内存的第一个地址。一般来说,equals方法用于比较两个对象是否看起来相同。确定两个对象的某些特征(内容)是否相同。其实就是调用对象的equals方法进行比较。然后我们来看看equals方法!

equals方法实际上是一个属于Object类的方法。因为Object类是所有类的直接或间接父类,也就是说所有类中的equals()方法都是从Object类继承而来的,通过源代码我们发现Object类中equals()方法的底层实现实际上是'=='。

公共布尔等于(对象对象){ 0

return(this==obj);

}然后,在所有没有重写equals()方法的类中,调用equals()方法实际上和使用'=='符号是一样的,它也是要比较的对象的地址值。但是,在Java提供的所有类中,大多数类都重写了equals()方法,重写后的equals()方法一般会比较两个对象的值,比如String类、Date类等等。您可以看到字符串类的源代码:

公共布尔值

等于(对象变量1){ 0

if(this==var1){ 0

返回真;

}

else {

if(字符串的变量1实例){ 0

String var2=(String)var1;

int var3=

this . value . length;

if(var3==var2 . value . length){ 0

char[] var4=

这个值;

char[]var5=var2 . value;

(=NationalBureauofStandards)国家标准局

p;for(int var6 =
0; var3-- !=
0; ++var6) {
                       if (var4[var6] != var5[var6]) {
                           return false;
                       }
                   }
                   return true;
               }
           }
           return false;
       }
   }

解决

看了上面的描述,相信你可以做对或者回答起大多数这类的问题。但是还需要注意以下两点:

String str3 = 
"abc";
String str4 = "abc";
System.out.println(str3 == str4); // 输出true
  • 这里为什么会是true呢?按理说str3和str4是两个对象,"=="比较的是地址,应该会是false才对。如果你是这么想的,那你就不是很了解String类。String类,我们都知道它是不可变的字符序列,存储在常量池中,所以当你声明了一个str3=“abc"时,就会在常量池中开辟一个内存空间来存放"abc”,下次再声明时,就会在常量池中去找,有,就直接把当前地址赋给变量,没有,就再创建。因此,此处的str3和str4是指向的同一个内存地址。

Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
System.out.println(f1 == f2);// 输出true
System.out.println(f3 == f4);// 输出false
  • 看到上面的答案是不是感到十分的诧异。其实这里隐藏着一个知识点。就是包装类的缓存问题。下面简单描述一下:整型、char类型所对应的包装类,在自动装箱时,对于-128~127之间的值会进行缓存处理。当然其目的就是提高效率。缓存处理的原理为:如果数据在-128~127这个区间,那么在类加载时就已经为该区间的每个数值创建了对象,并将这256个对象存放到一个名为cache的数组中。每当自动装箱过程发生时(或者手动调用valueOf()时),就会先判断数据是否在该区间,如果在则直接获取数组中对应的包装类对象的引用,如果不在该区间,则会通过new调用包装类的构造方法来创建对象。此处以Integer类为例,源码参考:public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); // 超过范围就是new的Integer对象 } 这段代码中我们需要解释下面几个问题:1. IntegerCache类为Integer类的一个静态内部类,仅供Integer类使用,作用就是初始化数组cache的,这个过程会在类加载时完成。感兴趣可以去看哈源码,这里就不再粘贴了。 2. 一般情况下 IntegerCache.low为-128,IntegerCache.high为127,IntegerCache.cache为内部类的一个静态属性。

看到这,相信你对上面抛出的问题,已经可以迎刃而解。答案参考:

		int x = 
10;
       int y = 10;
       String str1 = new String("abc");
       String str2 = new String("abc");
       String str3 = "abc";
       String str4 = "abc";
       System.out.println(x == y); // 输出true
       System.out.println(str1 == str2); // 输出false
       System.out.println(str1.equals(str2)); // 输出true
       System.out.println(str3 == str4); // 输出true
       System.out.println(str1 == str3); // 输出false
       System.out.println(str1.equals(str3)); // 输出true

       Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
       System.out.println(f1 == f2);// 输出true
       System.out.println(f3 == f4);// 输出false

关于javaSE中的==和equals的联系与区别是怎样的就分享到这里了,希望

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/131715.html

(0)

相关推荐

  • 一筹莫展什么意思,一筹莫展,与,一愁莫展,的区别

    技术一筹莫展什么意思,一筹莫展,与,一愁莫展,的区别区别是一个词语是正确的,一个是错误的一筹莫展什么意思。正确词语是“一筹莫展”,意思是一点计策也施展不出,一点办法也想不出。“一愁莫展”这个词是现代人误写,是错误写法。

    生活 2021年10月29日
  • C++内联函数不宜使用情况的示例分析

    技术C++内联函数不宜使用情况的示例分析这篇文章将为大家详细讲解有关C++内联函数不宜使用情况的示例分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。C++语言中的各种应

    攻略 2021年10月27日
  • CentOS/RHEL 7上PostgreSQL如何安装配置

    技术CentOS/RHEL 7上PostgreSQL如何安装配置这篇文章主要介绍了CentOS/RHEL 7上PostgreSQL如何安装配置,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获

    攻略 2021年11月15日
  • 选择经济实惠的美国服务器如何影响业务增长

    技术选择经济实惠的美国服务器如何影响业务增长对于跨境企业来说,公司网站所体现出的在线形象对您来说非常重要。很多出于成本考虑租用共享服务器的企业可能并没有意识到他们的服务器被数百甚至数千个其他网站共同适用使用。实际上,无论

    礼包 2021年12月24日
  • 如何实现mvvmlight与icommand类

    技术如何实现mvvmlight与icommand类小编给大家分享一下如何实现mvvmlight与icommand类,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们

    攻略 2021年11月23日
  • 抖音刷赞平台,花钱刷点赞会被限流吗?

    技术抖音刷赞平台,花钱刷点赞会被限流吗?抖音大伙都知道,是目前最火爆的短视频APP了。饭馆里,地铁上,火车上,全国各地的人们拿着手机,疯狂的刷刷刷,对着手机哈哈大笑,没错,这肯定是在刷抖音,抖音的火爆程度难以想象。抖音也

    测评 2021年11月11日