CSDNRGY 2016-12-17 02:32 采纳率: 87.5%
浏览 1037
已采纳

对于HashCode的一些疑问!

执行此程序

 public class Test {

    public static void main(String[] args) {
        Emp emp = new Emp();
        System.out.println(emp);
        System.out.println(emp.hashCode());
    }
}
class Emp{
    String id;
    String name;
}

输出

 Emp@15db9742
366712642

谁能解释一下,这两个值代表什么

366712642这个值代表的是emp对象的hashcode(hashcode是根据hash算法计算出来的)
那第一个值是什么东西?emp@后面为什么不是哈希值?

  • 写回答

3条回答 默认 最新

  • Readiay 2016-12-17 03:02
    关注

    首先我们把代码稍微改一下:

      public class Test {
    
        public static void main(String[] args) {
            Emp emp = new Emp();
            System.out.println(emp.toString());
            System.out.println(emp.hashCode());
        }
    }
    class Emp{
        String id;
        String name;
    }
    

    改的地方是main方法第二行,本来你写的是emp,改成emp.toString();

    你会发现执行结果和你的执行结果几乎可以说是一样。因为调用println方法,底层会默认调用toStrintg()

    所以现在我们只要 弄清hashCode()与 toString()方法有什么区别就行了。

    现在看看hashCode()方法,点进去,看代码注释:

    返回对象的哈希码值。支持该方法以利于哈希表,例如由java.util.HashMap提供的哈希表。

    hashCode的一般合同是:
    •无论何时在Java应用程序执行期间在同一对象上多次调用同一对象时,如果对对象的equals比较中使用的信息不被修改,则hashCode方法必须始终返回相同的整数。从应用程序的一个执行到相同应用程序的另一个执行,此整数不需要保持一致。
    •如果根据equals(Object)方法两个对象相等,则对这两个对象中的每一个调用hashCode方法必须产生相同的整数结果。
    •如果根据java.lang.Object.equals(java.lang.Object)方法,两个对象不相等,则不需要调用这两个对象中的每一个上的hashCode方法,这些方法必须产生不同的整数结果。然而,程序员应该意识到,为不等对象产生不同的整数结果可以提高散列表的性能。

    尽管合理实用,但Object类定义的hashCode方法会为不同对象返回不同的整数。 (这通常通过将对象的内部地址转换为整数来实现,但JavaTM编程语言不需要此实现技术。)

    从最后一句话你能看出,hashCode是根据对象内部地址获得的,你就简单理解为内存地址。

    toString呢?

         public String toString() {
            return getClass().getName() + "@" + Integer.toHexString(hashCode());
        }
    

    看见没,将hashCode转为16进制显示了。所以你的问题就能解答了。他们都是hashCode,只是不同进制而已,一个十进制,一个16禁止。
    值一样的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料