java是否将String以char数组的形式保存?

cra*_*xel 1 java arrays string jvm

我在 api 上或通过搜索网络都找不到它。我知道 JVM 将其拥有的每个 String 对象保留在字符串池中,以优化内存使用。但是我不知道它如何将其保存在“幕后”,因为 String 是一个不可变的对象,使用 toCharArray 将为我提供存储在池中 String 对象上的内部数组的副本?(如果是这样,那么将字符串数组作为字符获取的每个操作都是 O(n)) - 使用 charAt(i) 使用字符串的内部数组?或者它是否将其复制到一个新数组并返回新复制数组的位置 i 处的字符?

mal*_*are 5

    \n
  1. 在 Java 8 之前,字符串在内部表示为字符数组 \xe2\x80\x93 char[],以 UTF-16 编码,因此每个字符使用两个字节的内存。
  2. \n
  3. 当我们通过运算符创建一个String时new,Java编译器将创建一个新对象并将其存储在堆中。例如。

    \n\n
    String str1= new String("Hello");\n
    Run Code Online (Sandbox Code Playgroud)\n\n

    当我们创建一个字符串变量并为其赋值时,JVM 会在池中搜索相等值的字符串。如果找到,Java编译器将简单地返回对其内存地址的引用,而不分配额外的内存。如果没有找到,则将其\xe2\x80\x99添加到池中,并返回其引用。

    \n\n
    String str2= "Hello";\n
    Run Code Online (Sandbox Code Playgroud)
  4. \n
  5. toCharArray()char[]通过将原始数组的字符复制到新数组,在内部创建一个新数组。

  6. \n
  7. charAt(int index)返回内部(原始)数组的指定索引的值char[]

  8. \n
\n\n

Java 9 提供了一种新的表示形式,称为紧凑字符串。这种新格式将根据存储的内容在 char[] 和 byte[] 之间选择适当的编码。由于新的 String 表示形式仅在必要时才使用 UTF-16 编码,因此堆内存量将显着降低,从而减少 JVM 上的垃圾收集器开销。

\n\n

来源:\n http://www.baeldung.com/java-string-pool

\n