java自动分配内存吗?

问题描述 投票:-2回答:2

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

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 arrays string memory byte
2个回答
1
投票

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

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

在第二个代码段中:

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

我们拥有的是String's',它是没有内容的String指针。然后在循环中,将其指向堆上的String对象。当您在循环中重新分配“ s”时,它将为您的新String分配更多的内存,然后垃圾回收器将从堆中拾取旧的String对象。这是因为该对象不再有任何引用它。

Here's a good article on string immutability.


1
投票

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

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

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

会占用越来越多的内存,还是会自动释放并重新分配它?

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

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

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

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

是,但您没有。

在Java中,您只需让运行时系统处理分配和释放。 (只需确保您不会使物体意外接触即可。)


0
投票

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

不,没有。 Java字符串是不可变的,您不能更新/替换字符串中的characters

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

会占用越来越多的内存,还是会自动释放并重新分配它?

内存被垃圾收集器(GC)自动回收。 GC偶尔运行,标识不再reachable的对象;即该程序找不到了。这些对象然后被删除。

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

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

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

是,但您没有。

在Java中,您只需让运行时系统处理分配和释放。 (只需确保您不会使物体意外接触即可。)

© www.soinside.com 2019 - 2024. All rights reserved.