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)

相关推荐

  • linux下常见问题有哪些

    技术linux下常见问题有哪些这篇文章将为大家详细讲解有关linux下常见问题有哪些,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.user ss is current

    攻略 2021年10月22日
  • 第一次国内革命战争时期,第一次革命和第二次革命时间

    技术第一次国内革命战争时期,第一次革命和第二次革命时间第一次工业革命的时间:18世纪60年代~19世纪40年代第一次国内革命战争时期。第二次工业革命的时间:19世纪60年代后期。
    第一次工业革命极大地提高了生产力,巩固了

    生活 2021年10月25日
  • 大数据中如何进行文件上传漏洞的分析

    技术大数据中如何进行文件上传漏洞的分析今天就跟大家聊聊有关大数据中如何进行文件上传漏洞的分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。一、环境:dvwa二、选

    攻略 2021年12月10日
  • jquery相比js有哪些优势

    技术jquery相比js有哪些优势这篇文章主要讲解了“jquery相比js有哪些优势”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“jquery相比js有哪些优势”吧!

    攻略 2021年11月16日
  • 怎么解决php.ini时区修改无效问题

    技术怎么解决php.ini时区修改无效问题本篇内容介绍了“怎么解决php.ini时区修改无效问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔

    攻略 2021年10月29日
  • TP中怎么按照周来实现将数据分类

    技术TP中怎么按照周来实现将数据分类本篇内容主要讲解“TP中怎么按照周来实现将数据分类”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“TP中怎么按照周来实现将数据分类”吧!具体

    攻略 2021年12月4日