String newString=new String("JAVA");
newString="JAVA8";如果我们打印newString,我们知道输出只会是JAVA8,但是第2行在堆或常量池中创建了新的对象。它的内部行为
发布于 2022-05-21 12:54:31
在Java中,字符串是不可变的。
这意味着,一旦创建了一个字符串对象,它就不能被更新。
Java还有一个叫做的东西,它是Java存储String的内存位置。
为了最小化此字符串池所使用的内存空间,当使用以下语句创建新的字符串文本时,Java执行实习生操作。
String s = "apple";Interning的意思是JVM在字符串池中查看字符串字面"apple“是否存在,如果它只传递对新变量的引用,则不创建新对象;如果不存在,则创建一个新对象传递其引用,如果创建另一个字符串具有相同的值,也可以传递相同的引用。例如:
String t= "apple";如果您检查上面创建的两个字符串是否引用字符串池中的同一个字符串文本,您可以这样做:
System.out.println(s == t); // True当使用新关键字创建字符串时,它总是在字符串池中创建一个新对象,即使字符串文本存在于字符串池中。
String u = new String("apple");您可以通过以下语句检查是否创建了新对象:
System.out.println(s == u); // False
System.out.println(t == u); // False在yoru的情况下,第一个语句在字符串池中创建了一个新对象,并传递了它的引用。第二行创建另一个对象并传递它的引用。第一个对象仍然在字符串池中,但没有被任何变量引用,最终它占用的内存将通过垃圾收集释放。
希望这能回答您的问题,您可以阅读有关Java字符串池来了解更多。
发布于 2022-05-21 13:45:32
首先,newString是而不是aString!
newString是对类String实例的引用!C程序员会将其命名为指针并编写String* newString。
使用
String newString = new String( "JAVA" );您可以声明类型为“对字符串的引用”的变量newString,并将该引用分配给(地址)新对象,该对象是通过从编译时常数"JAVA"调用类java.lang.String的构造函数创建的。
newString = "JAVA8";现在,将对编译时间常数"JAVA8"的引用分配给先前创建的变量。同时,以前的引用对象被放弃(不再保留对该对象的引用),因此它现在已经准备好被垃圾收集了。
大多数Java实现都将编译时间常数存储在堆上,而字符串通常存储在字符串池中。而且,对new String()的调用可能永远不会执行;相反,编译器将直接使用对编译时间常数的引用。或者,它将被执行,得到的String对象存储在堆中,不管是否引用字符串池中的字符串值。
详细信息可以在各自版本的Java语言规范和JVM规范中找到,如果这样说是“依赖于实现”,则可以在各自JVM/Java实现的文档中找到。
https://stackoverflow.com/questions/72329388
复制相似问题