iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >javaSE中的==和equals的联系与区别是怎样的
  • 387
分享到

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

2023-06-03 15:06:11 387人浏览 八月长安
摘要

这篇文章给大家介绍javaSE中的==和equals的联系与区别是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。写在前面:==和equals是我们面试中经常会碰到的问题。那么它们之间有什么联系和区别呢?今天我们就

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

写在前面:

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

典型问题

这里先抛出一些比较典型笔试问题:

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); // 输出?
System.out.println(str1 == str2); // 输出?
System.out.println(str1.equals(str2)); // 输出?
System.out.println(str3 == str4); // 输出?
System.out.println(str1 == str3); // 输出?
System.out.println(str1.equals(str3)); // 输出?

Integer 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()方法底层实现其实就是是"=="号。

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

那么,在所有没有重写equals()方法的类中,调用equals()方法其实和使用"=="号的效果一样,也是比较的对象地址值,然而,Java提供的所有类中,绝大多数类都重写了equals()方法,重写后的equals()方法一般都是比较两个对象的值,比如String类,Date类,基本数据类型的包装类等。可以看哈String类的源码:

    public boolean equals(Object var1) {
       if (this == var1) {
           return true;
       } else {
           if (var1 instanceof String) {
               String var2 = (String)var1;
               int var3 = this.value.length;
               if (var3 == var2.value.length) {
                   char[] var4 = this.value;
                   char[] var5 = var2.value;
                   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的联系与区别是怎样的就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: javaSE中的==和equals的联系与区别是怎样的

本文链接: https://www.lsjlt.com/news/234643.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • javaSE中的==和equals的联系与区别是怎样的
    这篇文章给大家介绍javaSE中的==和equals的联系与区别是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。写在前面:==和equals是我们面试中经常会碰到的问题。那么它们之间有什么联系和区别呢?今天我们就...
    99+
    2023-06-03
  • javaSE中的==和equals的联系与区别是什么
    本篇内容主要讲解“javaSE中的==和equals的联系与区别是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“javaSE中的==和equals的联系与区别是什么”吧!问题这里先抛出一些比...
    99+
    2023-06-16
  • 怎样分析cookie与SESSION的区别和联系
    怎样分析cookie与SESSION的区别和联系,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在一些投票之类的场合,我们往往因为公平的原则要求每人只能投一票,在一些WEB开发中...
    99+
    2023-06-03
  • has、ohasd、crs、cluster区别和联系是怎样的
    这篇文章将为大家详细讲解有关has、ohasd、crs、cluster区别和联系是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 ...
    99+
    2022-10-19
  • DIV和table页面布局的区别和联系是怎样的
    这期内容当中小编将会给大家带来有关DIV和table页面布局的区别和联系是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。向大家描述一下DIV和Table页面布局的区...
    99+
    2022-10-19
  • Centos和Redhat的区别与联系
    CentOS的简介   CentOS是Community ENTerprise Operating System的简称,我们有很多人叫它社区企业操作系统,不管你怎么叫它,它都是Linux操作系统的一个发行版本。   CentO...
    99+
    2022-06-05
    Centos Redhat
  • CSS中absolute与relative的区别和联系
    本篇内容主要讲解“CSS中absolute与relative的区别和联系”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CSS中absolute与relative...
    99+
    2022-10-19
  • Python中__new__和__init__的区别与联系
    __new__ 和 __init__ 的区别主要表现在: __new__ 负责对象的创建而 __init__ 负责对象的初始化。 __new__:创建对象时调用,会返回当前对象的一...
    99+
    2022-11-12
  • java中volatile和synchronized的区别与联系
    java中volatile和synchronized的区别与联系这个可能是最好的对比volatile和synchronized作用的文章了。volatile是一个变量修饰符,而synchronized是一个方法或块的修饰符。所以我们使用这两...
    99+
    2023-05-31
    volatile synchronized ava
  • unix和linux的区别与联系是什么
    这篇文章主要介绍“unix和linux的区别与联系是什么”,在日常操作中,相信很多人在unix和linux的区别与联系是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”unix和linux的区别与联系是什么...
    99+
    2023-06-14
  • JSP和serverlet的区别与联系是什么
    JSP(JavaServer Pages)和Servlet(Java Servlet)是Java Web开发中常用的两种技术,有以下...
    99+
    2023-08-15
    JSP serverlet
  • Session和Cookie的区别与联系是什么
    Session和Cookie是两种不同的机制,用于在Web应用中保存用户状态信息。区别:1. 存储位置:Cookie存储在客户端(浏...
    99+
    2023-08-15
    Session Cookie
  • LR和SVM的联系与区别是什么
    这篇文章主要介绍“LR和SVM的联系与区别是什么”,在日常操作中,相信很多人在LR和SVM的联系与区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”LR和SVM的联系与区别是什么”的疑惑有所帮助!接下来...
    99+
    2023-06-19
  • tomcat与apache的区别与联系是什么
    Tomcat和Apache是两个不同的软件,但也可以配合使用。1. Tomcat是一个独立的Web应用服务器,它专门用于运行Java...
    99+
    2023-09-21
    Tomcat apache
  • Java中使用==和equals的区别是什么
    这篇“Java中使用==和equals的区别是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java中使用==和equa...
    99+
    2023-06-29
  • ​​​​​​​Rxjs map, mergeMap 和 switchMap 的区别与联系
    目录前言mapmergeMapswitchMap前言 map、mergeMap 和 switchMap 是 RxJS 中的三个主要运算符,在 SAP Spartacus 开发中有着广...
    99+
    2022-11-13
  • 详谈Array和ArrayList的区别与联系
    昨天去了一个java的实习面试,发现有好多java最基础的数据结构对于博主来说反而感到陌生,在面试官问一些常见的例如HashMap这样的数据结构,博主能回答的头头是道,但是在问到Array和ArrayList的区别和联系之后,却让博主一脸懵...
    99+
    2023-05-31
    array arraylist 区别
  • java中实例与对象的区别和联系
    对象是抽象的说法,你可以把它看作一个符合它自身定义的所有实例的代表,而实例则是对象的现实体现。你可以说一个实例是一个对象,但你不能说一个对象是一个实例。因为定义对象时只是把自身的规则和逻辑定义好,实例可以通过输入不同的数据使得自己和其他实例...
    99+
    2018-12-10
    java入门 java 实例 对象 区别 联系
  • Python中bytes和str的区别与联系详解
    目录Bytes和Str的区别Bytes与Str间的转换读写文件的注意事项总结Bytes和Str的区别 在Python3中,字符序列有两种类型:bytes和str。bytes类型是无符...
    99+
    2022-11-10
  • 详解pandas中Series()和DataFrame()的区别与联系
    区别: series,只是一个一维数据结构,它由index和value组成。dataframe,是一个二维结构,除了拥有index和value之外,还拥有column。 联系: da...
    99+
    2023-01-11
    pandas Series() pandas DataFrame()
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作