Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 哪些对象是垃圾收集的?_Java_Garbage Collection_Garbage - Fatal编程技术网

Java 哪些对象是垃圾收集的?

Java 哪些对象是垃圾收集的?,java,garbage-collection,garbage,Java,Garbage Collection,Garbage,还有,为什么要收集它们?你必须先问问自己,创建了多少个对象。 在代码段中,将创建三个字符串对象。由于是使用“”创建的,因此它们是字符串池的一部分。但是,在代码运行之后,垃圾收集器可以收集所有这三个对象。请注意,这并不保证它们确实被收集。 strMsg不在堆中,它将在Stringpool中。所以你不知道什么时候会收到 当您创建一个类似 String strMsg = "PM"; float price = 7.50f; price = 8.50f; strMsg = "AM"; strMsg =

还有,为什么要收集它们?

你必须先问问自己,创建了多少个对象。 在代码段中,将创建三个字符串对象。由于是使用“”创建的,因此它们是字符串池的一部分。但是,在代码运行之后,垃圾收集器可以收集所有这三个对象。请注意,这并不保证它们确实被收集。

strMsg
不在堆中,它将在Stringpool中。所以你不知道什么时候会收到

当您创建一个类似

String strMsg = "PM";
float price = 7.50f;
price = 8.50f;
strMsg = "AM";
strMsg = "MN";
price = 9.50f;;
您正在使用新操作符创建对象。当您使用new操作符创建
new String()
时,它将在堆内存中创建

通过使用遗留代码,如

 String input = new string("Hai");
它不会在堆内存中创建。它将在Stringpool中创建

垃圾收集:

String input = "Hai";
为什么收集它们?

   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.

s和s1都将指向相同的参考。因为Stringpool类似于常量,所以每当即将出现的值存在或不存在时,它都会进行检查。如果它可用,那么它将使用旧地址并分配给新变量。如果您更改变量的值,那么它将在Stringpool中创建一个新字符串。

编辑:似乎只有在您使用字符串构造函数创建字符串时,我对字符串的解释才是准确的(例如
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 s  = "Sample";
   String s1 = "Sample";



事实证明,基本类型(例如int、float、double、char等)实际上存储在变量中。这意味着如果执行
float x=10.3
,变量
x
实际上包含10.3。因此,如果稍后执行
x=8.9
,则变量
x
实际上已从10.3更改为8.9。这与更改引用不同,后者更改变量点的位置。因此,对于基元类型,不需要进行垃圾收集。在您的示例中,设置为
price
的浮点值都不会被垃圾收集

strMsg = "MN";

strMsg         "PM"
     |
     |         "AM"
     |
     ---------> "MN"



这里的任何内容都不会被垃圾收集。大致上可以,但在处理字符串常量时是错误的,在类本身被垃圾收集之前,字符串常量将一直存在(通常永远不会)。请随意编辑我的答案,将其包括在内。事实上,我对stringpool的事情了解不多,但我试图解释对象的一般要点。
strMsg = "AM";

strMsg        "PM"
     |
     --------> "AM"
strMsg = "MN";

strMsg         "PM"
     |
     |         "AM"
     |
     ---------> "MN"
float price = 7.50f;

price  | 7.50f |
price = 8.50f;

price  | 8.50f |
price = 9.50f;

price  | 9.50f |