Java字符串不变性和使用相同的字符串值创建新的字符串
我知道问题的标题不是很清楚,对此感到抱歉,不知道如何提出。我有一个非常基本的Java实现问题,我想着重于应用程序性能,但是它也涉及Java中的String创建模式。
我了解Java中字符串的不变性概念。我不确定的是,我在某处读到以下内容不会创建两个不同的String对象:
String name = "Sambhav";
String myName= "Sambhav";
我想知道Java是怎么做到的?它实际上是否在程序存储器中寻找一个String值并检查其是否存在,如果不存在则创建一个新的String对象?在那种情况下,显然可以节省内存,但存在性能问题。
还可以说我有这样的代码:
public void some_method(){
String name = "Sambhav";
System.out.println(name); // or any random stufff
}
现在,在每次调用此函数时,是否正在创建一个新的String并将其添加到内存中,或者我是否使用相同的String对象?我只是想知道所有事情的真相?
如果我们这样说
String name = "Sambhav";
String myName= "Sambhav";
不会因为引用而创建新对象,那
String name = new String("Sambhav");
String myName= new String("Sambhav");
Java是否仍然可以捕捉到该字符串相同,只是将myName指向与上一条语句中创建的对象相同的对象?
-
字符串是内部char数组,具有一些与基础char数组一起使用的固有功能。例如。subString(int),split(String)方法。
字符串是不可变的,这意味着更改字符串引用所做的任何努力都会创建一个新的字符串并为此分配内存。如下
line 1. String a = new String("SomeString"); line 2. a = "SomeStringChanged";
第1行使用变量a引用的“ SomeString”分配内存,并将“ SomeString ” 添加到 字符串池
第2行在 字符串池中 使用“ SomeStringChanged” 分配内存,并被aie a引用,现在不指向“ SomeString”,并且“
SomeString”占用的内存现在可用于 gc 。这里没有重复使用
line 3. String b = "SomeStringChanged";
现在,文字“ SomeStringChanged* ”被变量 a 和 b 重用 。也就是说,它们指的是 相同的内存位置
,实际上是指称为“ 字符串池 ”的位置。 ***line 4. a = new String("SomeStringChanged");
现在,新的分配完成包含“ SomeStringChanged ”,并引用 一个
有 没有再使用 ,现在发生的事情。(字符数组 SomeStringChanged的 字符串池中已经存在。因此,没有字符串池分配发生)
line 5. a = new String("SomeStringChanged").intern();
现在,在第4行中创建的分配将被丢弃,变量 a 和 b 指向包含“
SomeStringChanged”的字符串池中的相同位置。这里重复使用相同的char数组。功劳归于 intern() 方法line 6. String x = new String("SomeX"); line 7. String y = "SomeX";
第6 行将 在堆和字符串池中为 SomeX 创建一个分配。char数组已重复。
第7行不会为 SomeX 分配任何内存,因为它已经在字符串池中了
Line 8 String s = new String(someStringVariable);
第8行将仅在堆中分配单个内存位置,而不在字符串池中分配单个内存位置。
总之,只有在将String引用声明为文字或将String对象插入的情况下,才可以重用字符串的char数组,即只有这两个可以使用String池(这实际上是char数组重用的思想)。