1

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

情况1:

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

案例二:

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

参考

据我所知,这些字符串存储在具有特定内存位置的 Case1 的字符串常量池中,类似地,在堆内存中创建 case2 对象。如果我们将相同或不同的字符串分配给 String 对象,这些内存将如何被垃圾收集器管理和释放。

4

6 回答 6

2

如果你来自 C++,一切都在堆上。此外,字符串在 Java 中是不可变的(创建后无法更改)。由于有垃圾收集器,因此不需要显式释放任何内容。

于 2012-05-02T07:05:22.997 回答
1

应用程序将取决于最初分配给它的当前内存。如果您创建一个新字符串,它将分配一个具有字符串大小的内存。如果没有足够的内存,它将在您的堆已用完时抛出错误.它是垃圾收集器,一旦对象没有任何引用,它就会释放内存。您无法控制它。

但是目前,您当前的代码不会在创建 String 时出现错误:)

于 2012-05-02T07:09:09.723 回答
0

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

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

就内存而言,Java 将垃圾收集器实现为守护线程,只要 JVM 处于运行状态,它就会运行。它将删除所有没有引用的对象。所以在第一种情况下,不会有 Garbage Collection,但在第二种情况下,一个字符串会被 Garbage Collected。

于 2012-05-02T07:28:32.173 回答
0

我认为您正在考虑字符串实习。但是,由于这两种情况都涉及字符串文字,因此您将在这两种情况下看到字符串实习。案例 2 肯定不是案例 1 的内存优化。

看看一个类似的问题,Java 中表达式“new String(...)”的目的是什么?

于 2012-05-02T07:39:20.470 回答
0

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

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

于 2012-05-02T07:10:08.687 回答
0

与另一篇文章类似 - 这将为您提供更好的想法和说明String s = "something"; 之间的区别是什么?和 String s = new String("something");

于 2014-04-10T13:26:42.447 回答