String newString=new String("JAVA");
newString="JAVA8";
如果我们打印newString,这里会发生什么,我们知道输出将仅为JAVA8,但第2行在堆或常量池中创建了新对象。它在内部的行为如何
首先,新闻字符串不是字符串!!!
<代码>新闻字符串<代码>是对类<代码>字符串<代码>实例的引用!C程序员会将其命名为指针并编写字符串*新字符串。
具有
String newString = new String( "JAVA" );
您声明变量newString
的类型"引用字符串",并将引用分配给(地址)新对象,该对象是通过调用类java.lang.String
的构造函数从编译时常量"JAVA"
创建的。
newString = "JAVA8";
现在,将编译时常量“JAVA8”的引用指定给之前创建的变量。同时,以前的引用对象被放弃(不再保留对该对象的引用),因此现在可以对其进行垃圾收集。
大多数Java实现确实不将编译时常量存储在堆中,并且字符串通常存储在字符串池中。也有可能永远不会执行对new String()
的调用;相反,编译器将直接使用对编译时常量的引用。或者它将被执行,生成的String
对象存储在堆中,无论是否引用字符串池中的字符串值。
详细信息可以在相应版本的Java语言规范和JVM规范中找到,如果说“依赖于实现”,请在相应JVM/Java实现的留档中找到。
在Java中,字符串是不可变的。
这意味着一旦创建了字符串对象,它就无法更新。
Java还有一种称为Java字符串池的东西,Java存储字符串的内存位置。
为了最小化这个字符串池使用的内存空间,当使用以下语句创建新的字符串文本时,Java会执行Interning。
String s = "apple";
Interning的意思是,JVM在字符串池中查找字符串文字“apple”是否存在,如果存在,则只将其引用传递给新变量,不创建新对象,如果不存在,则创建一个新对象并传递其引用,如果使用相同值创建另一个字符串,则还可以传递相同的引用。例如:
String t= "apple";
如果检查上面创建的两个字符串是否引用了字符串池中的相同字符串文字,则可以按如下方式执行:
System.out.println(s == t); // True
使用new关键字创建字符串时,它总是在字符串池中创建新对象,即使字符串池中存在字符串文字。
String u = new String("apple");
您可以通过以下语句检查新对象是否已创建:
System.out.println(s == u); // False
System.out.println(t == u); // False
在yoru情况下,第一条语句在字符串池中创建了一个新对象,并传递了它的引用。第二行创建了另一个对象并传递了其引用。第一个对象仍在字符串池中,但没有被任何变量引用,最终它所占用的内存将被垃圾收集释放。
希望这能回答您的问题,您可以阅读Java字符串池了解更多。
问题内容: 我知道问题的标题不是很清楚,对此感到抱歉,不知道如何提出。我有一个非常基本的Java实现问题,我想着重于应用程序性能,但是它也涉及Java中的String创建模式。 我了解Java中字符串的不变性概念。我不确定的是,我在某处读到以下内容不会创建两个不同的String对象: 我想知道Java是怎么做到的?它实际上是否在程序存储器中寻找一个String值并检查其是否存在,如果不存在则创建一
s代表“hi”,s1代表hi所在的内存位置? 请帮帮忙?
我正在学习颤振(主要来自Youtube) 为什么我们需要在赋值运算符后面使用关键字,因为我们已经将其设置为
我只需要从方法中检索,然后以字符串形式返回该值。
问题内容: 我是Java的新手,正在尝试学习Maps的概念。 我想出了下面的代码。但是,我想同时打印“键字符串”和“值字符串”。 我只能找到只打印“键字符串”的方法。 问题答案: 有多种方法可以实现此目的。这是三个。 输出量
我知道字符串文字和新字符串对象之间的区别,也知道它在内部是如何工作的。但我的问题是,这有点超前。当我们使用new关键字as创建字符串对象时 在本例中,我们传递的是字符串类型的参数。我的问题是这个字符串是在哪里生成的-堆还是字符串常量池还是其他地方? 据我所知,这个参数是一个字符串文字,所以它应该在字符串常量池中。如果是这样的话,那么intern方法的用途是什么?只需将变量str链接到常量池?因为“