Java字符串池存储疑点

时间:2014-02-23 05:28:59

标签: java string jvm hashcode

为什么hashcode与字符串对象相同???

我正在努力理解字符串池是如何工作的。我经历了很多网站,最后我现在更加困惑了。让我在这里放下我的疑虑。有人帮助我理解它们。

class cov {

    public static void main(String[] args) {
        String s = "abc"; //Object on string pool  
        System.out.println(s.hashCode());
        String str = new String("abc"); //This statement does two things  
        System.out.println(str.hashCode());


    }
}

3 个答案:

答案 0 :(得分:3)

字符串的hashCode()方法是根据它包含的字符计算的。如果两个String对象包含具有相同大小且相同顺序的相同字符,那么它们将具有相同的hashCode()

答案 1 :(得分:3)

String类有一个hashCode方法,可以根据内容而不是内存位置计算哈希码。因此,如果两个字符串相同(但不一定相同),则它们将具有相同的哈希码。

如果不是这种情况,HashSet<String>这样的结构将无法使用 - 每个新的String都不会出现在集合中,即使String与{{1}}已经添加了相同的字符。

答案 2 :(得分:1)

以下是用于生成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;
}

如其他答案中所述,hashCode是从String的内容生成的,而不是它所在的位置。例如堆栈或常量池