java是否将字符串保持为char数组的形式



我在api上或在网上搜索都找不到它。。我知道JVM将它拥有的每个String对象都保存在一个字符串池中,以便优化内存使用。然而,我不知道它是如何"隐藏"的,因为String是一个不可变的对象,使用toCharArray会给我一个存储在池中String对象上的内部数组的副本吗?(如果是的话,那么将字符串数组作为char所涉及的每个操作都是O(n((还使用charAt(i(使用字符串的内部数组?还是将其复制到一个新数组,并在新复制数组的位置i返回char?

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

    String str1= new String("Hello");
    

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

    String str2= "Hello";
    
  3. CCD_ 2通过将原始数组的字符复制到新数组中,在内部创建一个新的CCD_。

  4. charAt(int index)返回内部(原始(char[]数组的指定索引的值。

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

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

最新更新