String strMsg = "PM";
float price = 7.50f;
price = 8.50f;
strMsg = "AM";
strMsg = "MN";
price = 9.50f;;
另外,他们为什么要收集?
答案 0 :(得分:0)
首先要问问自己创建了多少个对象。 在您的代码片段中,创建了三个String对象。因为你用""创建了它们。它们是String池的一部分。但是,在代码运行之后,垃圾收集器将收集所有这三个对象的ELIGBLE。请注意,这并不能保证实际收集它们。
答案 1 :(得分:0)
strMsg
不在Heap中,它将在Stringpool中。所以你不知道什么时候会收集。
创建类似
的字符串时 String input = new string("Hai");
您正在使用new运算符来创建对象。当您使用new运算符创建new String()
时,它将在堆内存中创建。
使用遗留代码,如
String input = "Hai";
它不会在堆内存中创建。它将在Stringpool中创建。
垃圾收集:
If the String will not have any reference, then it will be collected.
为何收集它们?
Because of memory optimization. Unwanted memory occupation will be releaved by using Garbage Collection, upto your program will stops.
如果您创建两个具有相同值的String,如
String s = "Sample";
String s1 = "Sample";
s and s1
都指向相同的引用。因为Stringpool类似于常量,所以每次可能存在即将到来的值时都会检查它。如果可用,则接受旧地址并分配给新变量。如果更改变量的值,则会在Stringpool中创建一个新的String。
答案 2 :(得分:0)
编辑:只有使用String构造函数创建字符串(例如String str = new String("cat");
)时,我对字符串的解释似乎才准确。我的解释没有涉及字符串的一些小问题。有关字符串的更多常规信息,请查看@newuser的答案。我的解释应该适用于大多数Java对象。
在Java中,变量实际上是对其他对象的引用。 (在其他语言中,引用称为“指针”。)例如,如果变量s
由String s = "hello"
创建,则s
实际上不包含“hello”。 s
包含对hello的引用。区别是微妙的,但很重要。这意味着如果您的代码稍后执行s = "bye"
,则变量s
现在指向“bye”,而不是“hello”。但是,字符串对象“hello”仍在内存中浮动,但您没有引用它。所以现在你无法访问“hello”对象。垃圾收集器意识到这一点并删除“hello”对象以便您节省内存。所以在你的例子中,“PM”,“AM”是垃圾收集的,因为没有对这些对象的引用(没有变量指向那些对象)。
以下是我正在尝试解释的更详细的图形表示:
String strMsg = "PM";
strMsg ------> "PM"
strMsg = "AM";
strMsg "PM"
|
--------> "AM"
strMsg = "MN";
strMsg "PM"
|
| "AM"
|
---------> "MN"
事实证明,原始类型(例如int,float,double,char等)实际上存储在变量中。这意味着,如果您执行float x = 10.3
,则变量x
实际上包含10.3。因此,如果您稍后执行x = 8.9
,则变量x
实际上已从10.3更改为8.9。这与更改引用不同,引用会更改变量所指向的位置。因此,在原始类型的情况下,不需要垃圾收集。在您的示例中,您设置为price
的浮点值都不会被垃圾回收。
float price = 7.50f;
price | 7.50f |
price = 8.50f;
price | 8.50f |
price = 9.50f;
price | 9.50f |