本帖最后由 fly51888 于 2011-11-14 18:02 编辑
hashcode是虚拟机根据类的成员变量和类的成员方法产生的哈希码,具体怎么产生的得问虚拟机老大哥了,我是不太清楚滴。
例如:内存中有这样的位置:0,1,2,3,4,5。记住长度不是5 是为6哦!一般一个类中都有一个唯一标示该类的哈希码,就是hashcode啦,
也就是我们常用的ID,假设ID=9。当我们想把一个类放在这六个位置中的一个时,用ID%6=3,那么就应该把这个类放在3的这个位置;如果ID=6,
则ID%6=0,就应该把类放在0这个位置。当然在实际的程序代码中ID的数字肯定不会这么小啦,比如64322323之类的,我只是为了易懂而已。
用哈希算法是因为存取效率相对比较高。
那么此时就会有人会问:如果遇到两个类有相同的hashcode怎么办? 此时就需要用到equals方法了。比如一个User类
public class User {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (id != other.id)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
如果两个类的hashcode码相同,但不是同一个类,那么equals方法就可以把把它们打回原形。
equals方法判断方法如下:
1,如果两个类同属一个类则返回true;
2,如果传递过来的类为null,则返回false;
3,如果两个类的字节码不相等,则返回false(注:字节码是反射里的内容,不懂的可以去查下,如果两个类是同一个类,那么它们使用同一个字节码);
4,如果两个类的ID不相等,则返回false。
5,如果两个类的name属性有一个为null,一个不为null,则返回false。
6,如果两个类的name属性都不为null,且值不相等也会返回false;
7,其余情况就会返回true; |