gpt4 book ai didi

java - Java中字符串池的底层机制?

转载 作者:IT老高 更新时间:2023-10-28 20:33:01 26 4
gpt4 key购买 nike

我很好奇为什么不用调用 new String() 就可以创建字符串。 ,正如 API 所述,它是 Objectclass java.lang.String

那么我们如何使用 String s="hi"而不是 String s=new String("hi") ?

This post阐明了 == 的使用运算符和缺席 new并说这是由于String JVMinterned 或从文字池中获取的文字,因此 Strings是不可变的。

看到诸如

这样的陈述
String s="hi"

第一次真正发生了什么?

  1. JVM像这样替换它String s=new String("hi") ,其中创建了一个对象并且"hi"被添加到 String文字池 等后续调用,例如 String s1="hi"是从泳池里捞出来的?

  2. 这就是底层机制的运作方式吗?如果是,那么就是

    String s=new String("Test");
    String s1="Test";

    一样
    String s="Test";
    String s1="Test";

    在内存利用率和效率方面

  3. 另外,有什么方法可以访问字符串池检查有多少 String里面有文字,占用了多少空间等等?

最佳答案

Java 编译器对字符串文字有特殊的支持。假设它没有,那么在你的源代码中创建字符串真的很麻烦,你必须写这样的东西:

// Suppose that we would not have string literals like "hi"
String s = new String(new char[]{ 'h', 'i' });

回答您的问题:

  1. 或多或少,如果你真的想知道细节,你必须研究JVM的源代码,你可以在OpenJDK找到。 ,但请注意它庞大而复杂。

  2. 不,这两者不等价。在第一种情况下,您明确地创建了一个新的 String 对象:

    String s=new String("Test");

    其中将包含由文字 "Test" 表示的 String 对象的副本。请注意,从不在 Java 中编写 new String("some literal") - 字符串是不可变的,并且永远不需要复制字符串字面量。

  3. 我无法检查字符串池中的内容。

关于java - Java中字符串池的底层机制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27123131/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com