hashcode的简单简析

来源:互联网 发布:仿苹果软件 编辑:程序博客网 时间:2024/05/16 09:23
这两天突然遇到了一个很久都没有遇到的问题,谈到equals 和hashCode的关系,大概整理一下,以备学习
1.equals 和 hashCode 本身都是Object的方法,equals.用来比较两个变量的值.hashCode返回的是变量存储的物理地址的标示(可姑且认为是物理地址,其实不是)
2.基本数据类型(及其包装类)和String 都重写了equals和hashCode的方法,我把源码粘贴出来以备参考
a> String.java 
public int hashCode() {int h = hash;        int len = count;if (h == 0 && len > 0) {    int off = offset;    char val[] = value;            for (int i = 0; i < len; i++) {                h = 31*h + val[off++];            }            hash = h;        }        return h;    }public boolean equals(Object anObject) {if (this == anObject) {    return true;}if (anObject instanceof String) {    String anotherString = (String)anObject;    int n = count;    if (n == anotherString.count) {char v1[] = value;char v2[] = anotherString.value;int i = offset;int j = anotherString.offset;while (n-- != 0) {    if (v1[i++] != v2[j++])return false;}return true;    }}return false;    }
<span style="font-size: 12px; line-height: 22.75px; font-family: 'Hiragino Sans GB W3', 'Hiragino Sans GB', Arial, Helvetica, simsun, 宋体; background-color: rgb(255, 255, 255);"></span>
<span style="font-size: 12px; line-height: 22.75px; font-family: 'Hiragino Sans GB W3', 'Hiragino Sans GB', Arial, Helvetica, simsun, 宋体; background-color: rgb(255, 255, 255);">public int hashCode() {</span>
return value;
 }
 public boolean equals(Object obj) {
if (obj instanceof Integer) {
    return value == ((Integer)obj).intValue();
}
return false;
  }
从代码中可以看到对于String的hashCode返回的是第一个字任加上所有字符的ASCII*31相加.Integer 返回的是当前值.而对于equals方法,两者都比较的是内容.

3.对于未重写equals和hashCode的类的对象.当使用equals时其实比较的是,两个对象的引用地址是否一致.所以和”==“的结果是一样的,而hashCode是其物理地址的一个标示

4.重写equals的时候,一般都要重写hashCode.其中的原理是因为.当我们使用集合的时候.比如Set 集合.它是需要对存储的元素进行判重的.那么集合是如何知道这个元素是否重复呢.
a>首先set会拿着要放入的对象obj的hashcode进行地址寻址
b>如果地址为空,则将对象放入对应的地址
c>如果地址不是空,则比较地址对象和现有的对象的equals是否相同,如果相同则元素覆盖原来的元素.如果不相同则将现有的元素插入

0 0
原创粉丝点击