将空括号分配给String引用变量

时间:2014-04-28 08:30:07

标签: java oop object reference

将空括号值分配给Java中的String时会发生什么?

String s = "";

对象引用变量s是否引用堆内存中携带String值为nothing的对象?

是什么让我问这个问题,当打印对象的哈希码时,我得到零,这对我来说没有意义!

System.out.println("hash code is = " + s.hashCode());

哈希码= 0

7 个答案:

答案 0 :(得分:6)

来自String doc:

  

返回此字符串的哈希码。 String的哈希码   对象计算为        s [0] * 31 ^(n-1)+ s [1] * 31 ^(n-2)+ ... + s [n-1]

由于你的字符串是空的,因此会产生0.

答案 1 :(得分:3)

查看String.hashCode()进行计算,这将有意义......

来自Java 1.8

/** Cache the hash code for the string */
private int hash; // Default to 0

...

public int hashCode() {
    int h = hash;
    if (h == 0 && value.length > 0) {
        char val[] = value;

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

答案 2 :(得分:2)

doc说明了一切:hashcode直接依赖于String值,而计算使得空字符串为0。

如果您对字符串对字符串的确切有疑问,那么检查其实现there可能会有所帮助。

并不意味着堆中的对象代表您的String。

答案 3 :(得分:2)

来自String的hashCode文档。

 /**
         * Returns a hash code for this string. The hash code for a
         * <code>String</code> object is computed as
         * <blockquote><pre>
         * s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
         * </pre></blockquote>
         * using <code>int</code> arithmetic, where <code>s[i]</code> is the
         * <i>i</i>th character of the string, <code>n</code> is the length of
         * the string, and <code>^</code> indicates exponentiation.
         * (The hash value of the empty string is zero.) // look at this line
         *
         * @return  a hash code value for this object.
         */
        public int hashCode() {// some code
}

答案 4 :(得分:1)

那是the code

if (h == 0 && count > 0) { 
   ...
   for (int i = 0; i < len; i++) {
       h = 31*h + val[off++];
   }
   ...
}
return h; //0

String为空,结果为0.另请参阅docs

enter image description here

答案 5 :(得分:1)

用它实例化一个空字符串并将其分配给变量s

来自http://www.docjar.com/html/api/java/lang/String.java.html

/** Cache the hash code for the string */
 private int hash; // Default to 0

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;
 }

如果count == 0(空字符串)

,则返回0

答案 6 :(得分:1)

是的,String s =“”将在内存中占用空间。

关于哈希码计算,下面是String类的哈希码方法。 “hash”的默认值为0; if条件

if (h == 0 && len > 0) {

失败,因此您将获得0作为哈希码值。

public int hashCode(){ int h = hash;     int len = count; if(h == 0&amp;&amp; len&gt; 0){     int off = offset;     char val [] = value;

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

}