【问题标题】:java deallocates memory automatically?java自动释放内存?
【发布时间】:2020-04-03 15:30:18
【问题描述】:

我正在寻找一种将字节数组转换为字符串的方法,我找到的唯一方法是:

String s1="horse";
String s2;
byte[] b=s1.getBytes();
s2=new String(b);

所以我的问题是,有没有其他方法可以将字节数组转换为字符串而不创建新的 String 实例? 另外,如果我反复这样做:

String s;
while(true){
  s=new String();
}

会占用越来越多的内存,还是会自动释放再重新分配?如果内存被自动释放,我将不再需要寻找将字节数组转换为字符串的替代方法。

P.S.(我希望 s2 成为“马”) P.S.2(对不起我的英语不好)

【问题讨论】:

  • Java 有一个Garbage Collector。在您的第二个示例中,分配器将重用空间。
  • 如何创建一个在 not 之前不存在的 String 创建一个新的 String 实例?

标签: java arrays string memory byte


【解决方案1】:

Johannes 的评论是一个很好的起点,因为垃圾收集是 Java 中的一个关键概念。

不过,要回答您的问题,您需要在使用字节数组进行初始化时创建一个新的字符串实例。

在您的第二个代码 sn-p 中:

String s;
while(true){
  s=new String();
}

我们拥有的是一个 String 's',它是一个指向空的字符串指针。然后在你的循环中,你将它指向堆上的一个 String 对象。当您在循环中重新分配 's' 时,它将为您的新 String 分配更多内存,然后垃圾收集器将从堆中拾取旧 String 对象。这是因为该对象不再引用它。

Here's a good article on string immutability.

【讨论】:

    【解决方案2】:

    所以我的问题是,有没有其他方法可以将字节数组转换为字符串而不创建新的 String 实例?

    不,没有。 Java 字符串是不可变的。这意味着您不能更新/替换字符串中的 characters。将字节数组转换为现有字符串会违反不变性。

    String s;
    while (true) {
        s = new String();
    }
    

    会占用越来越多的内存,还是会自动解除分配再重新分配?

    内存由垃圾收集器 (GC) 自动回收。 GC 偶尔运行,识别不再可达的对象;即该程序无法再找到。然后删除这些对象。

    这是简单的版本。实际上,并非所有“丢失”的对象都会同时被回收,并且有一些特殊类型的可达性处理方式不同。

    无论如何,在您的示例中,每次程序循环时,都会创建一个新的String 对象,并且对先前String 的引用会丢失。然后稍后(根据需要)GC 找到并删除丢失的对象。

    如果内存被自动释放,我将不再需要寻找将字节数组转换为字符串的替代方法。

    是的,而你没有。

    在 Java 中,您只需让运行时系统处理对象内存的分配和释放。 (只要确保您不会让对象意外保持可触及。)

    【讨论】:

      猜你喜欢
      • 2012-09-24
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-04
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      相关资源
      最近更新 更多