Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 字符串池与常量池_Java_String_Jvm_Constants - Fatal编程技术网

Java 字符串池与常量池

Java 字符串池与常量池,java,string,jvm,constants,Java,String,Jvm,Constants,让我们看一下下面的代码片段: String s1 = "Hello"; String s2 = "Hello"; 由于内部原因,两个变量引用同一个对象。因为字符串是不可变的,所以只创建一个对象,并且两个对象都引用同一个对象 常量池也是一种东西,它保存类中声明的所有常量(整数、字符串等)。它是针对每个类的 System.out.println("Hello"); // I believe this Hello is different from above. 问题: string

让我们看一下下面的代码片段:

  String s1 = "Hello";
  String s2 = "Hello"; 
由于内部原因,两个变量引用同一个对象。因为字符串是不可变的,所以只创建一个对象,并且两个对象都引用同一个对象

常量池也是一种东西,它保存类中声明的所有常量(整数、字符串等)。它是针对每个类的

 System.out.println("Hello");  // I believe this Hello is different from above.
问题:

  • string pool
    是否引用常量池中常量字符串对象的池
  • 如果是,字符串池在整个应用程序中是通用的还是特定于一个类

  • 只有一个字符串池,并且所有字符串文本都会自动插入。
    此外,还有其他用于自动装箱等的池

    常量池是为类放置这些文本的地方

    我的问题是,

  • 字符串池是否引用常量池中常量字符串对象的池
  • 没有

    “常量池”是指类文件中的一个特殊格式的字节集合,它对Java类加载器有意义。其中的“字符串”是,它们不是Java对象。还有很多种常量,不仅仅是字符串

    Java虚拟机指令不依赖于类、接口、类实例或数组的运行时布局。相反,指令引用
    常量\u池中的符号信息

    相反,“字符串池”是在运行时使用的(不仅仅是在类加载期间),只包含字符串,而字符串池中的“字符串”是java对象。 “字符串池”是一个线程安全的弱映射,从
    java.lang.string
    实例到
    java.lang.string
    实例用于插入字符串

    字符串文字是对类
    string
    (§4.3.1,§4.3.3)实例的引用

    此外,字符串文字总是指类
    string
    相同的实例。这是因为使用方法
    string.intern
    ,字符串文字(或者更一般地说,是常量表达式(§15.28)的值的字符串)被“插入”以共享唯一实例


    此字符串池存储位置的可能重复项?As-link声称,插入的字符串存储在堆中。那么,它是与其他对象所在的堆相同还是不同?任何指向javadocs或java规范的链接都会受到欢迎。@nanosoft有一个分代垃圾收集器,可以在中分配新对象,但插入的字符串通常是长期存在的,因此实现可以跳过由类装入器分配的字符串的托儿所。JVM是否这样做是一个实现决策,而不是Java虚拟机规范所要求的。Java语言规范是Java规范的另一半,但在内存管理问题上主要委托给JVM规范?JVM规范中没有任何信息可以证明这一点。你是怎么发现的?您能提供一些openjdk源代码的参考资料或任何其他官方参考资料来证明这一点吗?