2012-07-24 28 views
-1
String str="abc"; 
for (int i = 0; i < 100; i++) 
{ 
    System.out.println(str.hashCode()); 
} 

1)String是一个不可变的类,它的hashCode被缓存在它的私有变量hash中。String hashCode行为

2)由于字符串str是一个字面值,所以创建的字符串对象被添加到permgen空间的字符串池中。所以当参考str时,它应该给我同一个对象。

调试通过字符串的hashCode方法中的过程,当我调用str.hashCode()时,基于上述两点,它应该进入计算哈希只有一次,接下来99次它应该返回我“缓存哈希私人字符串对象的变量“。它不符合要点1.有人可以让我知道这种行为吗?

调试通过这个,你会注意到hashCode计算100次,我打印hashCode值,看看对象是否有相同的hashCode。

+4

你在哪里看到哈希码计算了100次? – mabbas 2012-07-24 16:06:59

+0

请原谅密切投票 - 我误解了问题。 – 2012-07-24 16:09:35

+0

你错了。它计算一次,除了计算为零的退化情况,例如零长度的字符串。 – EJP 2012-07-25 12:11:45

回答

0

我的不好。

发生了什么事情是因为我在开始调试时已经在hashCode中产生了断点,我的forloop没有调用hashCode方法,而是通过一些系统初始静态方法调用了String hashCode方法。

Admin's please close the quesiton

1

java.lang.String类对象确实缓存哈希值。它分配实例变量哈希第一次哈希码被调用时,见下图:

public int hashCode() { 
     int h = hash; 
     if (h == 0 && count > 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; 
    } 

任何进一步的请求hashCode时只返回小时,通过哈希,跳过计算。它的代码我可以看到它!

+0

我已经经历了我的问题所在的代码,如果您尝试调试并在if(h == 0 && count> 0)上设置断点并遍历循环,您将看到它会多次计算散列码。 – 2012-07-24 16:56:10

+0

@lordlupine它明目张胆地没有 – NimChimpsky 2012-07-24 17:13:32

+0

你甚至尝试过,因为我现在再试一次..任何看着代码的人都可以清楚地说,它并没有反复计算哈希码。你可以尝试在日食或其他地方,如果你可以? – 2012-07-24 17:21:51

1

的哈希码只计算一次,请参阅java.lang.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; 
    } 

第二次,你叫str.hashCode()变量h比和if语句体不同没有执行。