java

时间:2017-05-25 10:25:20

标签: java string

在Java中

  1. 使用 new operator 创建的对象将存储在堆中 存储器即可。
  2. 使用字符串文字创建的对象存储在 字符串常量池
  3. 我正在运行以下代码来检查哈希码。

        String nameOne = "Deepak";
        String nameTwo = new String("Deepak");
        System.out.println("nameOne address    -- "+nameOne.hashCode());
        System.out.println("nameTwo address    -- "+nameTwo.hashCode());
    

    代码的输出是

    nameOne address    -- 2043177526
    nameTwo address    -- 2043177526
    

    两个对象都是使用new运算符和字符串文字创建的,并相应地存储在堆内存和字符串常量池的不同位置。那么内存地址是如何相同的。

    如果我错了,请解释一下这个概念

1 个答案:

答案 0 :(得分:2)

比较堆和常量池是不正确的。特别是使用hashCode

让我们一步一步走:

  1. 由于Java 7字符串池在堆内存中。 Read more

  2. Java中的HashCode与内存地址无关*

    JVM有一个arg来指定hashCode默认算法

    -XX:hashCode=k

    号码k可以是以下之一:

    1. Park-Miller RNG
    2. foo(地址,全球州)
    3. 1(常数)
    4. incremental(++)
    5. 地址
    6. thread-local Xorshift(HotSpot中的默认值,java 8)
  3. 字符串覆盖默认hashCode实现。它基于字符串内容。 java.lang.String

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