繁体   English   中英

Java中的堆内存和字符串常量池有什么区别

[英]What is the difference between Heap memory and string constant pool in java

在Java中

  1. 使用new运算符创建的对象将存储在堆内存中
  2. 使用字符串文字创建的对象存储在字符串常量池中

我正在运行以下代码来检查哈希码。

    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运算符和字符串文字创建的,并分别存储在堆内存和字符串常量池的不同位置。 然后内存地址如何相同。

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

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

让我们一步一步走:

  1. 由于Java 7字符串池位于堆内存中。 阅读更多

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

    JVM具有用于指定hashCode默认算法的arg

    -XX:hashCode=k

    数字k可能是以下之一:

    1. 帕克米勒RNG
    2. foo(地址,全局状态)
    3. 1(常量)
    4. 增量(++)
    5. 地址
    6. 线程本地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; } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM