cra*_*xel 1 java arrays string jvm
我在 api 上或通过搜索网络都找不到它。我知道 JVM 将其拥有的每个 String 对象保留在字符串池中,以优化内存使用。但是我不知道它如何将其保存在“幕后”,因为 String 是一个不可变的对象,使用 toCharArray 将为我提供存储在池中 String 对象上的内部数组的副本?(如果是这样,那么将字符串数组作为字符获取的每个操作都是 O(n)) - 使用 charAt(i) 使用字符串的内部数组?或者它是否将其复制到一个新数组并返回新复制数组的位置 i 处的字符?
当我们通过运算符创建一个String时new,Java编译器将创建一个新对象并将其存储在堆中。例如。
String str1= new String("Hello");\nRun Code Online (Sandbox Code Playgroud)\n\n当我们创建一个字符串变量并为其赋值时,JVM 会在池中搜索相等值的字符串。如果找到,Java编译器将简单地返回对其内存地址的引用,而不分配额外的内存。如果没有找到,则将其\xe2\x80\x99添加到池中,并返回其引用。
\n\nString str2= "Hello";\nRun Code Online (Sandbox Code Playgroud)toCharArray()char[]通过将原始数组的字符复制到新数组,在内部创建一个新数组。
charAt(int index)返回内部(原始)数组的指定索引的值char[]。
Java 9 提供了一种新的表示形式,称为紧凑字符串。这种新格式将根据存储的内容在 char[] 和 byte[] 之间选择适当的编码。由于新的 String 表示形式仅在必要时才使用 UTF-16 编码,因此堆内存量将显着降低,从而减少 JVM 上的垃圾收集器开销。
\n\n来源:\n http://www.baeldung.com/java-string-pool
\n