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条)

报告相同问题?

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。