首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果使用新关键字声明的字符串和相同的字符串使用赋值操作符分配另一个值,那么在java中会发生什么?

如果使用新关键字声明的字符串和相同的字符串使用赋值操作符分配另一个值,那么在java中会发生什么?
EN

Stack Overflow用户
提问于 2022-05-21 12:06:37
回答 2查看 174关注 0票数 0
代码语言:javascript
复制
String newString=new String("JAVA");
newString="JAVA8";

如果我们打印newString,我们知道输出只会是JAVA8,但是第2行在堆或常量池中创建了新的对象。它的内部行为

EN

回答 2

Stack Overflow用户

发布于 2022-05-21 12:54:31

在Java中,字符串是不可变的。

这意味着,一旦创建了一个字符串对象,它就不能被更新。

Java还有一个叫做的东西,它是Java存储String的内存位置。

为了最小化此字符串池所使用的内存空间,当使用以下语句创建新的字符串文本时,Java执行实习生操作。

代码语言:javascript
复制
String s = "apple";

Interning的意思是JVM在字符串池中查看字符串字面"apple“是否存在,如果它只传递对新变量的引用,则不创建新对象;如果不存在,则创建一个新对象传递其引用,如果创建另一个字符串具有相同的值,也可以传递相同的引用。例如:

代码语言:javascript
复制
String t= "apple";

如果您检查上面创建的两个字符串是否引用字符串池中的同一个字符串文本,您可以这样做:

代码语言:javascript
复制
System.out.println(s == t); // True

当使用新关键字创建字符串时,它总是在字符串池中创建一个新对象,即使字符串文本存在于字符串池中。

代码语言:javascript
复制
String u = new String("apple");

您可以通过以下语句检查是否创建了新对象:

代码语言:javascript
复制
System.out.println(s == u); // False
System.out.println(t == u); // False

在yoru的情况下,第一个语句在字符串池中创建了一个新对象,并传递了它的引用。第二行创建另一个对象并传递它的引用。第一个对象仍然在字符串池中,但没有被任何变量引用,最终它占用的内存将通过垃圾收集释放。

希望这能回答您的问题,您可以阅读有关Java字符串池来了解更多。

票数 0
EN

Stack Overflow用户

发布于 2022-05-21 13:45:32

首先,newString而不是aString

newString是对类String实例的引用!C程序员会将其命名为指针并编写String* newString

使用

代码语言:javascript
复制
String newString = new String( "JAVA" );

您可以声明类型为“对字符串的引用”的变量newString,并将该引用分配给(地址)新对象,该对象是通过从编译时常数"JAVA"调用类java.lang.String的构造函数创建的。

代码语言:javascript
复制
newString = "JAVA8";

现在,将对编译时间常数"JAVA8"的引用分配给先前创建的变量。同时,以前的引用对象被放弃(不再保留对该对象的引用),因此它现在已经准备好被垃圾收集了。

大多数Java实现都将编译时间常数存储在堆上,而字符串通常存储在字符串池中。而且,对new String()的调用可能永远不会执行;相反,编译器将直接使用对编译时间常数的引用。或者,它将被执行,得到的String对象存储在堆中,不管是否引用字符串池中的字符串值。

详细信息可以在各自版本的Java语言规范和JVM规范中找到,如果这样说是“依赖于实现”,则可以在各自JVM/Java实现的文档中找到。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72329388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档