2017-05-25 84 views
0

在Java中使用new操作符将被存储在堆 内存是什么堆内存和字符串常量池之间的Java

  1. 对象创建的差异。
  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 

这两个对象正在使用新的运营商和字符串创建文字,并存储在不同的地方相应堆存储器和字符串常量池。那么内存地址是如何相同的。

请有关概念的解释,如果我错了

+8

一个'String'的哈希码是无关的内存地址。哈希码基于字符串的*值*。两个具有相同值*的字符串*必须具有相同的哈希码。 – khelwood

+0

http://www.journaldev。com/797/what-is-java-string-pool这可能会帮助 –

+0

@khelwood:谢谢兄弟,知道我明白了 –

回答

2

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

让我们一步一步来:

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

  2. 的hashCode是不相关的内存地址*

    JVM有一个ARG指定的hashCode默认算法

    -XX:hashCode=k

    k可能是一个:

    1. Park-Miller RNG
    2. FOO(地址,全局状态)
    3. 1(常数)
    4. 增量(++)
    5. 地址
    6. 线程局部Xorshift(默认在热点,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; 
    } 
    
相关问题