• <legend id='mCe2P'><style id='mCe2P'><dir id='mCe2P'><q id='mCe2P'></q></dir></style></legend>
    <tfoot id='mCe2P'></tfoot>

        <i id='mCe2P'><tr id='mCe2P'><dt id='mCe2P'><q id='mCe2P'><span id='mCe2P'><b id='mCe2P'><form id='mCe2P'><ins id='mCe2P'></ins><ul id='mCe2P'></ul><sub id='mCe2P'></sub></form><legend id='mCe2P'></legend><bdo id='mCe2P'><pre id='mCe2P'><center id='mCe2P'></center></pre></bdo></b><th id='mCe2P'></th></span></q></dt></tr></i><div id='mCe2P'><tfoot id='mCe2P'></tfoot><dl id='mCe2P'><fieldset id='mCe2P'></fieldset></dl></div>
          <bdo id='mCe2P'></bdo><ul id='mCe2P'></ul>

        <small id='mCe2P'></small><noframes id='mCe2P'>

      1. 关于重写equals()方法和hashCode()方法及其简单的应用

        当我们需要比较两个对象的内容是否相同时,就需要用到equals()方法。而在使用equals()方法时,如果我们没有重写该方法,那么默认的实现是比较两个对象的内存地址是否相同。
        <i id='vXmmR'><tr id='vXmmR'><dt id='vXmmR'><q id='vXmmR'><span id='vXmmR'><b id='vXmmR'><form id='vXmmR'><ins id='vXmmR'></ins><ul id='vXmmR'></ul><sub id='vXmmR'></sub></form><legend id='vXmmR'></legend><bdo id='vXmmR'><pre id='vXmmR'><center id='vXmmR'></center></pre></bdo></b><th id='vXmmR'></th></span></q></dt></tr></i><div id='vXmmR'><tfoot id='vXmmR'></tfoot><dl id='vXmmR'><fieldset id='vXmmR'></fieldset></dl></div>

            • <bdo id='vXmmR'></bdo><ul id='vXmmR'></ul>
              <legend id='vXmmR'><style id='vXmmR'><dir id='vXmmR'><q id='vXmmR'></q></dir></style></legend>

                  <tbody id='vXmmR'></tbody>

                <tfoot id='vXmmR'></tfoot>
                • <small id='vXmmR'></small><noframes id='vXmmR'>

                • 当我们需要比较两个对象的内容是否相同时,就需要用到equals()方法。而在使用equals()方法时,如果我们没有重写该方法,那么默认的实现是比较两个对象的内存地址是否相同。

                  然而,有时候我们并不想比较内存地址,而是希望比较对象的内容是否相同。这时就需要重写equals()方法了。下面是重写equals()方法的攻略:

                  为什么需要重写equals()方法

                  需要重写equals()方法的主要原因是当我们对自定义的类进行比较时,默认的equals()方法无法判断对象的内容是否相同。

                  例如,假设我们有一个Employee类,里面包含了员工编号、姓名等基本信息。当我们需要比较两个Employee对象时,如果不重写equals()方法,那么默认的比较方式就只会比较两个对象的内存地址,而不会比较对象的内容是否相同。这样就会导致我们无法得到正确的比较结果。

                  如何重写equals()方法

                  重写equals()方法需要遵守以下原则:

                  1. 对称性:如果x.equals(y)返回true,那么y.equals(x)也应该返回true
                  2. 自反性:x.equals(x)永远返回true
                  3. 传递性:如果x.equals(y)返回true,并且y.equals(z)也返回true,那么x.equals(z)也应该返回true
                  4. 一致性:如果x和y的内容没有发生改变,那么无论调用多少次x.equals(y),都应该得到相同的结果
                  5. 对null的处理:x.equals(null)永远返回false

                  以下是一个示例Employee类的重写equals()方法的实现:

                  public boolean equals(Object obj) {
                      if (obj == null) {
                          return false;
                      }
                      if (getClass() != obj.getClass()) {
                          return false;
                      }
                      final Employee other = (Employee) obj;
                      if (!Objects.equals(this.empId, other.empId)) {
                          return false;
                      }
                      if (!Objects.equals(this.firstName, other.firstName)) {
                          return false;
                      }
                      if (!Objects.equals(this.lastName, other.lastName)) {
                          return false;
                      }
                      return true;
                  }
                  

                  在这个实现中,我们先判断传入的对象是否为null,然后再判断两个对象的类是否相同。最后,我们逐一比较每个属性,如果所有属性均相同就返回true,否则返回false。

                  为什么需要重写hashCode()方法

                  Java中,每个对象都有一个对应的哈希码(hashCode),它是一个32位整数。当我们需要将对象存储到集合类中时,往往需要根据对象的hashCode来快速找到该对象在集合中的位置。

                  Java中的集合类(如HashMap、HashSet)在实现时,使用哈希表(hash table)来存储对象。哈希表的实现需要利用对象的哈希码来确定对象在哈希表中所处的位置。

                  默认情况下,每个对象的hashCode是根据对象的内存地址自动生成的。也就是说,如果我们不重写该方法,那么相同内容的对象在哈希表中还是会被保存成不同的实例,不同内容的对象可能被映射到同一个位置,从而影响效率。

                  为了解决这个问题,我们需要重写hashCode()方法。

                  如何重写hashCode()方法

                  在重写hashCode()方法时,我们需要遵守以下原则:

                  1. 如果两个对象通过equals()方法比较相等,那么它们的hashCode()方法的返回值也应该相等
                  2. hashCode()方法的返回值应该具有足够的随机性,以便在哈希表中能够均匀分布

                  以下是一个示例Employee类的重写hashCode()方法的实现:

                  public int hashCode() {
                      int hash = 7;
                      hash = 71 * hash + Objects.hashCode(this.empId);
                      hash = 71 * hash + Objects.hashCode(this.firstName);
                      hash = 71 * hash + Objects.hashCode(this.lastName);
                      return hash;
                  }
                  

                  在这个实现中,我们先定义了一个base值为7,然后将每个属性的hashCode()值(使用Objects.hashCode()方法计算)乘以一个常数(这里是71),并将结果与base值相加,最终得到一个整型值。这个整型值就是该对象的哈希码。

                  本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                  相关文档推荐

                  Lambda表达式是Java 8中引入的新特性之一,它是一个匿名函数,可以捕获参数并表现为一个代码块,而不像方法一样需要一个固定的名称。它主要用于传递行为或代码块以及事件处理等操作。
                  下面为您详细讲解基于Java的回调函数。
                  在Java中,equals()是用来比较两个对象是否相等的函数。equals()方法是Object类中的方法,因此所有Java类都包含equals()方法。在默认情况下,equals()方法比较对象的引用地址是否相同,即两个对象是否是同一个实例。但是,我们可以覆盖equals()方法,来定义自
                  JavaWeb是Java在Web领域的应用,是目前非常热门的技术之一。但是JavaWeb涉及到的技术非常广泛,初学者很容易迷失方向。本文总结了JavaWeb的基础知识,为初学者提供了一份学习笔记分享,希望能够帮助大家快速入门。
                  在Java编程中,字符串操作是很常见的,而替换字符串是其中常用的操作之一。Java提供了三种函数用于替换字符串:replace、replaceAll和replaceFirst。这篇文章将为您详细介绍它们的用法。
                  进制是数学中一种表示数值大小的方法,常见的进制有10进制、2进制、16进制等。
                    <bdo id='9oPPN'></bdo><ul id='9oPPN'></ul>

                    <small id='9oPPN'></small><noframes id='9oPPN'>

                      <tfoot id='9oPPN'></tfoot><legend id='9oPPN'><style id='9oPPN'><dir id='9oPPN'><q id='9oPPN'></q></dir></style></legend>
                      <i id='9oPPN'><tr id='9oPPN'><dt id='9oPPN'><q id='9oPPN'><span id='9oPPN'><b id='9oPPN'><form id='9oPPN'><ins id='9oPPN'></ins><ul id='9oPPN'></ul><sub id='9oPPN'></sub></form><legend id='9oPPN'></legend><bdo id='9oPPN'><pre id='9oPPN'><center id='9oPPN'></center></pre></bdo></b><th id='9oPPN'></th></span></q></dt></tr></i><div id='9oPPN'><tfoot id='9oPPN'></tfoot><dl id='9oPPN'><fieldset id='9oPPN'></fieldset></dl></div>

                          <tbody id='9oPPN'></tbody>