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)

相关推荐

  • sparksql查询的数据保存(sparksql命令行怎么保存数据)

    技术Spark SQL数据加载和保存的实例分析今天就跟大家聊聊有关Spark SQL数据加载和保存的实例分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、前置

    攻略 2021年12月17日
  • 美国电商服务器电商网站大多选择美国服务器

    技术美国电商服务器电商网站大多选择美国服务器由于跨境电商的业务属性,所以一般搭建电商独立站的时候首选的都是海外服务器,虽然有些用户针对自身业务情况会选择东南亚或者日本韩国地区的服务器,但是综合来看租用美国服务器部署网站还

    礼包 2021年10月22日
  • Apache Hudi 异步Compaction部署方式有哪些

    技术Apache Hudi 异步Compaction部署方式有哪些本篇文章为大家展示了Apache Hudi 异步Compaction部署方式有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希

    攻略 2021年11月18日
  • dickics,马丁靴品牌十大排名榜是怎样的

    技术dickics,马丁靴品牌十大排名榜是怎样的马丁靴品牌十大排名榜如下(名次不分先后)dickics: 1、Dr.Martens Dr.Martens的马丁靴,马丁靴鼻祖品牌,国内马丁靴名字的由来者,一般说马丁靴指的就

    2021年10月27日
  • sqliteselect详解(sqlite字段怎么设置)

    技术SQLite中的SELECT子句如何使用别名小编给大家分享一下SQLite中的SELECT子句如何使用别名,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!SQLite中的SELECT子句使用别名开发者

    攻略 2021年12月18日
  • 北风卷地白草折,北风卷地白草折打一生肖

    技术北风卷地白草折,北风卷地白草折打一生肖这个生肖是马北风卷地白草折。马在动物分类学中分类为:脊椎动物亚门(Vertebrata)、哺乳纲(Mammalia)、奇蹄目(Perissodactyla)、马科(Equidae

    生活 2021年10月30日