• 「JavaSE 重新出发」05.01.02 hashCode 方法、toString 方法


    hashCode 方法

    • 散列码(hash code)是由对象导出的一个整形值(可以是负数)。其是没有规律的,如果x与y是两个不同的对象,则x.hashCode()与y.hashCode()基本上不会相同。
    • hashCode 方法定义在 Object 类中,因此每个对象都有一个默认的散列码方法,其返回结果是对象的存储地址。
    • 一个例子:
      String string1 = "hiwangzi";
      StringBuilder stringBuilder1 = new StringBuilder(string1);
      System.out.println(string1.hashCode() + " " + stringBuilder1.hashCode());
      
      String string2 = new String("hiwangzi");
      StringBuilder stringBuilder2 = new StringBuilder(string2);
      System.out.println(string2.hashCode() + " " + stringBuilder2.hashCode());
      
      输出结果:
      -1232882509 1975012498
      -1232882509 1808253012
      
      可以看到,String对象的散列码是相同的,这是因为字符串的散列码是由内容导出的;而StringBuffer对象散列码不同,这是因为StringBuffer类没有定义hashCode()方法,它的散列码是由默认的Object类的默认hashCode()方法导出的对象存储地址。
    • 如果重新定义 equals 方法,就必须重新定义 hashCode 方法,以便于可以将对象插入到散列表中。
    • 可以调用 Objects.hash 方法并提供多个参数得到散列码(这种做法比较好):
      public int hashCode(){
          return Objects.hash(name, salary, hireDay);
      }
      
    • equals 与 hashCode 定义必须一致,即 x.equals(y) 与 x.hashCode() == y.hashCode() 结果一致。

    toString 方法

    • 绝大多数的 toString 方法都遵循这样的格式:类的名字,随后一对方括号括起来的域值。
      public String toString(){
          return getClass().getName()
              + "[name=" + name
              + ",salary=" + salary
              + ",hireDay=" + hireDay
              + "]";
      }
      
  • 相关阅读:
    关于我 — About Me
    《这样说就对了》读书笔记
    LOMA280保险原理读书笔记
    .NET单元测试的艺术-3.测试代码
    .NET单元测试的艺术-2.核心技术
    .NET单元测试的艺术-1.入门
    《人人都该买保险》读书笔记
    借助 Lucene.Net 构建站内搜索引擎(下)
    借助 Lucene.Net 构建站内搜索引擎(上)
    自己动手写一个简单的MVC框架(第二版)
  • 原文地址:https://www.cnblogs.com/hiwangzi/p/7635819.html
Copyright © 2020-2023  润新知