Java 字符串哈希代码行为

Java 字符串哈希代码行为,java,string,hashcode,Java,String,Hashcode,1字符串是一个不可变类,其哈希代码缓存在其私有变量哈希中 2由于string str是一个文本,所以创建的这个string对象被添加到permgen空间的stringpool中。所以当引用str时,它应该给我相同的对象 通过string的hashCode方法中的进程调试,基于以上两点,当我调用str.hashCode时,它应该只进入计算哈希一次,接下来的99次它应该返回string对象的缓存哈希私有变量。它不符合第一点。有人能告诉我这种行为吗 通过此调试,您将注意到hashCode计算了100次

1字符串是一个不可变类,其哈希代码缓存在其私有变量哈希中

2由于string str是一个文本,所以创建的这个string对象被添加到permgen空间的stringpool中。所以当引用str时,它应该给我相同的对象

通过string的hashCode方法中的进程调试,基于以上两点,当我调用str.hashCode时,它应该只进入计算哈希一次,接下来的99次它应该返回string对象的缓存哈希私有变量。它不符合第一点。有人能告诉我这种行为吗


通过此调试,您将注意到hashCode计算了100次,我正在打印hashCode值,以查看对象是否具有相同的hashCode。

java.lang.String类对象缓存哈希值。它在第一次调用hashcode时分配实例变量hash,如下所示:

String str="abc";
for (int i = 0; i < 100; i++)
{
  System.out.println(str.hashCode());
}

任何对hashcode的进一步请求都只返回h,通过hash,跳过计算。它就在代码里,我可以看到

hashcode只计算一次,请参见java.lang.String.hashcode函数的主体:

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;
    }
第二次调用str.hashCode时,变量h不同于0,if语句的主体未执行。

My bad

发生的事情是,当您开始调试时,由于hashCode中有断点,所以hashCode方法不是由我的forloop调用的,而是由一些系统初始静态方法调用字符串hashCode方法


管理员请关闭该问题

您在哪里看到哈希代码被计算了100次?请原谅关闭投票-我误读了问题。您错了。它只计算一次,但在退化情况下计算为零,例如,一个长度为零的字符串。我已经检查了我的问题所在的代码,如果您尝试调试并在ifh==0&&count>0上放置一个断点,然后在循环中迭代,您将看到它多次计算哈希代码。@lordlupine它显然不允许您尝试,因为我现在再次尝试了。。任何查看代码的人都可以清楚地说,它不会反复计算哈希代码。如果可以的话,你能在eclipse或其他地方试试吗?很多人都会这么说。如果您误读了调试器,调试器将跳过if语句并直接转到return语句;
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;
    }