java是否将String保留为char数组形式?

时间:2018-07-21 12:59:08

标签: java arrays string jvm

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

1 个答案:

答案 0 :(得分:4)

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

    String str1= new String("Hello");
    

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

    String str2= "Hello";
    
  3. toCharArray()通过将原始数组的字符复制到新数组来内部创建一个新的char[]数组。

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

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

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