cuiwenb
NE丶Passion
采纳率33.3%
2017-08-10 02:53 阅读 4.4k
已采纳

java中 HashCode到底是什么?

hashCode是万物的十六进制地址.(这里引用编程思想一句话 "万物都是对象").

hashCode既然是万物的地址.那么我在新建的一个类里 重写Object的hashCode方法
equals方法,依然返回false.
class A{
public int hashCode(){
return 1;
}
public boolean equals(Object obj){
return true;
}
}
public class Test{
public static void main(String[]args){
A a1=new A();
A a2=new A();
output(a1==a2);--->false
output(a1.equals(a2));-->true
}
}

求大师解惑

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

8条回答 默认 最新

  • 已采纳
    qq_37800836 qq_37800836 2017-08-10 04:49

    ==比较的是对象的内存地址
    System.identityHashCode(Object obj)会返回obj的精确hash值,根据obj的内存地址计算得到。

    点赞 1 评论 复制链接分享
  • zengxianzi 昭杏之念 2017-08-10 03:40

    不知道楼主有没有了解过数据结构中的哈希表,Object类中hashCode方法的实现就是哈希函数,而你的覆写return 1也是哈希函数。
    hashCode的返回值所映射到的地址如果已经有了值(即hashCode方法返回值相同,Object类中hashCode方法的返回值也有可能有相同的),就会通过‘开发地址法’或‘链地址法’
    去找下一个没有存放值的地址空间。java中==比较的是地址是否相同,而不同对象的地址肯定是不同的(尽管hashCode相同)。

    点赞 1 评论 复制链接分享
  • qq_35728177 Tsui丶 2017-08-10 02:55

    你的equals方法不是返回的 true吗? ==比较的是内存地址, a1 a2是new出来的两个对象他们的内存地址当然是不同的,所以返回false

    点赞 评论 复制链接分享
  • cuiwenb NE丶Passion 2017-08-10 03:01

    首先 == 比较的是内存地址,我在上面已经写的非常清楚,既然hashCode是内存地址!
    我都重写了hashCode返回值了.为什么还是报错

    点赞 评论 复制链接分享
  • zy841958835 cloudyzhao 2017-08-10 03:17

    ==比较的是等式两边的地址,

    点赞 评论 复制链接分享
  • chenbaige legendCoder 2017-08-10 03:23

    1、hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的;
    2、如果两个对象相同,就是适用于equals(Java.lang.Object) 方法,那么这两个对象的hashCode一定要相同;
    3、如果对象的equals方法被重写,那么对象的hashCode也尽量重写,并且产生hashCode使用的对象,一定要和equals方法中使用的一致,否则就会违反上面提到的第2点;
    4、两个对象的hashCode相同,并不一定表示两个对象就相同,也就是不一定适用于equals(java.lang.Object) 方法,只能够说明这两个对象在散列存储结构中,如Hashtable,他们“存放在同一个篮子里”。

    点赞 评论 复制链接分享
  • dcxy0 Q544471255 2017-08-10 03:28
    点赞 评论 复制链接分享
  • Small_Mouse0 鼠小 2017-08-10 03:40

    hashcode是java对对象的一个标识,,便于实现,,Hashtable,HashMap等,,

    不是唯一标识,,知识一种标识(可以存在hash冲突)

    点赞 评论 复制链接分享

相关推荐