字符串是内部char数组,具有一些与基础char数组一起使用的固有功能。例如。subString(int),split(String)方法。
字符串是不可变的,这意味着更改字符串引用所做的任何努力都会创建一个新的字符串并为此分配内存。如下
line 1. String a = new String("SomeString");
line 2. a = "SomeStringChanged";
第1行使用变量a引用的“ SomeString”分配内存,并将“ ” 添加到
第2行在 使用“ SomeStringChanged” 分配内存,并被aie a引用,现在不指向“ SomeString”,并且“ SomeString”占用的内存现在可用于 。
这里没有重复使用
line 3. String b = "SomeStringChanged";
现在,文字“ SomeStringChanged* ”被变量 和 。也就是说,它们指的是 ,实际上是指称为“ ”的位置。 ***
line 4. a = new String("SomeStringChanged");
现在,新的分配完成包含“ ”,并引用
有 ,现在发生的事情。(字符数组 字符串池中已经存在。因此,没有字符串池分配发生)
line 5. a = new String("SomeStringChanged").intern();
现在,在第4行中创建的分配将被丢弃,变量 和 指向包含“ SomeStringChanged”的字符串池中的相同位置。这里重复使用相同的char数组。功劳归于 方法
line 6. String x = new String("SomeX");
line 7. String y = "SomeX";
第6 在堆和字符串池中为 创建一个分配。char数组已重复。
第7行不会为 分配任何内存,因为它已经在字符串池中了
Line 8 String s = new String(someStringVariable);
第8行将仅在堆中分配单个内存位置,而不在字符串池中分配单个内存位置。
总之,只有在将String引用声明为文字或将String对象插入的情况下,才可以重用字符串的char数组,即只有这两个可以使用String池(这实际上是char数组重用的思想)。