java字符串中的内存管理?

java字符串中的内存管理?,java,Java,我已经创建了字符串对象,如下所示 案例1: String s1="mystring";//Address location is 1000 String s1="yourstring"; String s2="mystring"; 案例2: String s1=new String("mystring");//Address location is 1000 String s1=new String("yourstring"); String s2=new String

我已经创建了字符串对象,如下所示

案例1:

  String s1="mystring";//Address location is 1000
  String s1="yourstring";
  String s2="mystring";
案例2:

  String s1=new String("mystring");//Address location is 1000
  String s1=new String("yourstring");
  String s2=new String("mystring");


据我所知,这些字符串存储在具有特定内存位置的Case1的字符串常量池中,类似地,case2中的对象在堆内存中创建。如果我们将相同或不同的字符串分配给字符串对象,垃圾收集器将如何管理和释放这些内存应用程序将取决于最初分配给它的当前内存。如果创建新字符串,它将按照字符串大小分配内存。如果没有足够的内存,当堆耗尽时,它将抛出错误。一旦对象没有任何引用,垃圾收集器将释放内存。您无法对其进行任何控制


但目前,您当前的代码段不会编译,因为创建字符串时出错:)

字符串存储在Case1的字符串常量池中(文字字符串)。在案例2中,即使使用新对象创建字符串,也会检查对象的内容。若它等于文字字符串对象的内容,那个么对象引用将指向文字字符串对象

垃圾收集:
如果没有对象引用指向字符串文字对象“mystring”(在您的例子中),那么它将不会仍然被垃圾收集,这些对象将一直保留到程序生命周期。程序结束时,字符串文字对象将被删除。对于其他字符串对象,即使用关键字new,当没有对象引用指向该对象时,这些对象将被垃圾收集。

据我对Java的理解,在第一种形式中(即使用=运算符),字符串是从Java维护的字符串池中分配的。因此,在第一种情况下,当您将
“mystring”
分配给变量
s2
时,它将被分配对最初创建
s1
时存在的相同字符串的引用

但在使用构造函数的情况下,您将创建String对象的一个全新实例。所以现在有三个对三个不同字符串的引用


就内存而言,Java实现了一个垃圾收集器作为守护进程线程,只要JVM在运行,它就会运行。它将删除所有没有引用的对象。因此,在第一种情况下,将不进行垃圾收集,但在第二种情况下,将对一个字符串进行垃圾收集。

我认为您考虑的是字符串内部处理。但是,由于这两种情况都涉及字符串文字,所以您将看到在这两种情况下都有字符串实习。案例2当然不是案例1的内存优化


请看一个类似的问题,

类似于另一篇文章-这将给您提供更好的想法和澄清

我认为这将让您清楚地了解java编程中的字符串内存分配机制为什么这个问题的答案都不被接受?只要点击你最喜欢的答案左边的勾选框。。。