Topic: hashCode 怎么会一样?!

  Print this page

1.hashCode 怎么会一样?! Copy to clipboard
Posted by: potomac
Posted on: 2004-06-01 17:02


public class TestString {

  public static void main(String[] args) {
    
    String p = new String("abc");
    String q = new String("abc");
    
    System.out.println(p.hashCode());
    System.out.println(q.hashCode());    
    
    
    System.out.println(q==p);
    
  }
}


两个String 对象的hashCode 一样,但是 q==p 又是false的 ?!
anybody explain for me ?
output =================

96354
96354
false

2.Re:hashCode 怎么会一样?! [Re: potomac] Copy to clipboard
Posted by: tangming
Posted on: 2004-06-01 17:37

p和q是两个引用,所有==为false,
hashCode一样,应该它们都是指向一个String对象的。

3.Re:hashCode 怎么会一样?! [Re: tangming] Copy to clipboard
Posted by: potomac
Posted on: 2004-06-01 17:55

tangming wrote:
p和q是两个引用,所有==为false,
hashCode一样,应该它们都是指向一个String对象的。


那么请问怎么显示 p, q两个引用变量的 内存映像?可以明确看出不同之处?

4.Re:hashCode 怎么会一样?! [Re: potomac] Copy to clipboard
Posted by: zhshfeng_xx
Posted on: 2004-06-01 20:27

如果你把p,q的形式写成

String p="abc";
String q="abc';

这样的话,你就会得到true;

5.Re:hashCode 怎么会一样?! [Re: potomac] Copy to clipboard
Posted by: michaelbeyond
Posted on: 2004-06-03 13:06

对于String的变量形式,hashCode是根据string来计算hash code的,如果是对象,则根据对象的内存地址来计算hash code。如果有些类重载hash功能的话,则根据对象计算出的hash code也会一样的。

可以看看core java 卷二中的collection介绍。

如有解释错误,请大侠斧正!

6.当然不一样了Re:hashCode 怎么会一样?! [Re: potomac] Copy to clipboard
Posted by: wfth
Posted on: 2004-06-03 17:42

p和q作为引用对象的变量来说,他们是不同的变量,所以p!=q,但是在讨论他们所引用的对象是否是同一个对象时,应该用p.equals(q)来判断,这就是你的错误所在。
程序改写如下:
public class TestString {
public static void main(String[] args) {
String p = new String("abc");
String q = new String("abc");
System.out.println(p.hashCode());
System.out.println(q.hashCode());
System.out.println(p.equals(q));
}
}
结果:
96354
96354
true

7.Re:hashCode 怎么会一样?! [Re: potomac] Copy to clipboard
Posted by: sevenFive
Posted on: 2004-06-03 20:22

==是判断两个对象引用是否相等,即是否指向同一个对象;

而hashcode是用于hash算法的,它的使用情况是对某些需要hash算法的collection进行操作时,默认Object对象的hash code是根据地址进行计算的,而String重载了hashCode方法,如下:
    public int hashCode() {
  int h = hash;
  if (h == 0) {
   int off = offset;
   char val[] = value;
   int len = count;

for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}

8.Re:hashCode 怎么会一样?! [Re: potomac] Copy to clipboard
Posted by: ringayumi
Posted on: 2004-06-04 00:09

When you use p.equals(q) get true , and The hashcode must same as well.

p == q , They're compare in stack , but both are object reference , not primitive type.

You can refer to the java.lang.Object API! It can help you.

9.Re:hashCode 怎么会一样?! [Re: potomac] Copy to clipboard
Posted by: zgd
Posted on: 2004-06-09 00:25

如果两个object是equals的话
它们的hashcode一定要相同

如果两个object的hashcode相同的话
它们不一定equals

就算全世界的object的hashcode都相同也没有关系
只是影响haseset的散列效果而已


   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923