我正在寻找一种将字节数组转换为字符串的方法,我发现的唯一方法是:
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(对不起,我的英语不好)
Johannes的评论是一个很好的起点,因为垃圾收集是Java中的关键概念。
不过,要回答您的问题,不,在使用字节数组初始化时,您将不需要创建字符串的新实例。
在第二个代码段中:
String s;
while(true){
s=new String();
}
我们拥有的是String's',它是没有内容的String指针。然后在循环中,将其指向堆上的String对象。当您在循环中重新分配“ s”时,它将为您的新String分配更多的内存,然后垃圾回收器将从堆中拾取旧的String对象。这是因为该对象不再有任何引用它。
所以我的问题是,有没有其他方法可以将字节数组转换为字符串而无需创建String的新实例?
不,没有。 Java字符串是不可变的。这意味着您无法更新/替换字符串中的characters。将字节数组转换为existing字符串会违反不变性。
String s; while (true) { s = new String(); }
会占用越来越多的内存,还是会自动释放并重新分配它?
内存被垃圾收集器(GC)自动回收。 GC偶尔运行,标识不再reachable的对象;即该程序无法找到。这些对象然后被删除。
这是简单的版本。实际上,并非所有“丢失的”对象都可以同时回收,并且某些特殊的可到达性以不同的方式处理。
无论如何,在您的示例中,每次程序在循环中循环时,都会创建一个新的String
对象,并且对先前String
的引用也会丢失。然后,GC(根据需要)将删除该对象。
如果内存是自动释放的,我将不再需要寻找将字节数组转换为字符串的替代方法。
是,但您没有。
在Java中,您只需让运行时系统处理分配和释放。 (只需确保您不会使物体意外接触即可。)
所以我的问题是,有没有其他方法可以将字节数组转换为字符串而无需创建String的新实例?
不,没有。 Java字符串是不可变的,您不能更新/替换字符串中的characters。
String s; while (true) { s = new String(); }
会占用越来越多的内存,还是会自动释放并重新分配它?
内存被垃圾收集器(GC)自动回收。 GC偶尔运行,标识不再reachable的对象;即该程序找不到了。这些对象然后被删除。
这是简单的版本。实际上,并非所有“丢失的”对象都可以同时回收,并且某些特殊的可到达性以不同的方式处理。
无论如何,在您的示例中,每次程序在循环中循环时,都会创建一个新的String
对象,并且对先前String
的引用也会丢失。然后,GC(根据需要)将删除该对象。
如果内存是自动释放的,我将不再需要寻找将字节数组转换为字符串的替代方法。
是,但您没有。
在Java中,您只需让运行时系统处理分配和释放。 (只需确保您不会使物体意外接触即可。)