• <legend id='9D8fT'><style id='9D8fT'><dir id='9D8fT'><q id='9D8fT'></q></dir></style></legend>

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

    1. <tfoot id='9D8fT'></tfoot>

          <bdo id='9D8fT'></bdo><ul id='9D8fT'></ul>
      1. <i id='9D8fT'><tr id='9D8fT'><dt id='9D8fT'><q id='9D8fT'><span id='9D8fT'><b id='9D8fT'><form id='9D8fT'><ins id='9D8fT'></ins><ul id='9D8fT'></ul><sub id='9D8fT'></sub></form><legend id='9D8fT'></legend><bdo id='9D8fT'><pre id='9D8fT'><center id='9D8fT'></center></pre></bdo></b><th id='9D8fT'></th></span></q></dt></tr></i><div id='9D8fT'><tfoot id='9D8fT'></tfoot><dl id='9D8fT'><fieldset id='9D8fT'></fieldset></dl></div>
      2. java中重写equals和重写hashCode()

        时间:2023-12-11

        <tfoot id='GC9bX'></tfoot>

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

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

          <tbody id='GC9bX'></tbody>
              • <bdo id='GC9bX'></bdo><ul id='GC9bX'></ul>

                  Java中的equals()方法用于比较两个对象是否是相同的,而hashCode()则用于给对象生成一个唯一的哈希值。在某些情况下,需要重写这两个方法来确保正确的对象比较和哈希码生成。

                  重写equals和hashCode()方法的原因

                  默认情况下,Java对象的equals()方法比较的是对象的引用。也就是说,只有当两个对象的引用指向同一个内存地址时,它们才被认为是相同的。但是在实际场景中,很多情况下需要比较的是对象的某些属性。例如,比较两个人是否是同一个人,应该比较的是它们的身份证号码,而不是它们在内存中的地址。

                  因此,我们需要重写equals()方法,以便在对象比较时比较它们的属性值而不是引用地址。而hashCode()方法与之配合使用,它生成的哈希值用于快速比较两个对象是否相等,从而提高了程序的性能。

                  重写equals()方法的步骤

                  1. 判断两个对象是否引用同一个内存地址,是则返回true。
                  2. 判断对象是否为null,是则返回false。
                  3. 判断两个对象的类是否相同,如果不是则返回false。
                  4. 将对象转换为相应的类类型,判断属性值是否相等,如果相等则返回true,否则返回false。

                  示例1

                  下面是一个Person类示例,其中重写了equals()方法:

                  public class Person {
                      private String name;
                      private int age;
                  
                      @Override
                      public boolean equals(Object obj) {
                          if (obj == this) {
                              return true;
                          }
                          if (!(obj instanceof Person)) {
                              return false;
                          }
                          Person person = (Person) obj;
                          return this.name.equals(person.name) && this.age == person.age;
                      }
                  
                      @Override
                      public int hashCode() {
                          return Objects.hash(name, age);
                      }
                  }
                  

                  在上面的例子中,equals()方法首先检查两个对象是否是同一个引用,如果是则返回true。然后检查传入的对象是否是Person类型,如果不是则返回false。最后比较两个对象的属性值,如果相等则返回true。

                  在HashCode()方法中,使用了Java 7新增的Objects.hashCode(Object…values)方法,它可以根据属性值来生成哈希码值。

                  重写hashCode()方法的步骤

                  hashCode()方法的重写要求同一个类的两个对象必须生成同样的哈希码值,如果生成不同的哈希值,那么在使用哈希表等数据结构时就会出现错误。

                  1. 声明一个int类型的变量result,并将其初始化为初始值,例如17。
                  2. 将对象的属性值和result组合成一个 hash code。
                  3. 如果属性值为引用类型,递归调用它的hashCode()方法。
                  4. 返回result。

                  示例2

                  下面是一个User类示例,其中重写了hashCode()方法:

                  public class User {
                      private String username;
                      private String password;
                  
                      @Override
                      public boolean equals(Object obj) {
                          if (obj == this) {
                              return true;
                          }
                          if (!(obj instanceof User)) {
                              return false;
                          }
                          User user = (User) obj;
                          return this.username.equals(user.username) && this.password.equals(user.password);
                      }
                  
                      @Override
                      public int hashCode() {
                          int result = 17;
                          result = 31 * result + username.hashCode();
                          result = 31 * result + password.hashCode();
                          return result;
                      }
                  }
                  

                  在上面的例子中,hashCode()方法中组合了username和password属性的哈希值,采用了经典的31倍数加法算法,这种算法能够避免生成相同的哈希值。

                  上一篇:Java HashSet(散列集),HashMap(散列映射)的简单介绍 下一篇:java 对数和指数计算方式

                  相关文章

                1. <small id='6rwJk'></small><noframes id='6rwJk'>

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