java освобождает память автоматически? - PullRequest
0 голосов
/ 03 апреля 2020

Я искал способ превратить байтовый массив в строку, единственный способ, который я нашел, это:

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

Итак, мои вопросы, есть ли другой способ конвертировать байтовый массив в строку без создания нового экземпляра строки? Также, если бы я неоднократно делал:

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

Занимал бы все больше и больше памяти, или он автоматически освобождается и перераспределяется? Если бы память была освобождена автоматически, мне больше не пришлось бы искать альтернативный метод для преобразования массива байтов в строку.

PS (я хочу, чтобы s2 был "лошадью") PS2 (Извините, мой плохой Engli sh)

Ответы [ 2 ]

2 голосов
/ 03 апреля 2020

Итак, мои вопросы: есть ли другой способ преобразовать байтовый массив в строку без создания нового экземпляра String?

Нет, не там. Java строки являются неизменяемыми. Это означает, что вы не можете обновить / заменить символов в строке. Преобразование байтового массива в существующую строку нарушит неизменность.

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

Будет занимать все больше и больше памяти, или он автоматически освобождается и перераспределяется?

Память автоматически восстанавливается сборщиком мусора (G C). G C запускается время от времени, идентифицирует объекты, которые больше не достижимы ; то есть, что программа не может найти больше. Эти объекты затем удаляются.

Это простая версия. В действительности не все «потерянные» объекты восстанавливаются одновременно, и есть некоторые специальные виды достижимости, которые обрабатываются по-разному.

В любом случае, в вашем примере, каждый раз, когда программа обходит l oop, создан новый объект String и ссылка на предыдущий String потеряна. Затем (при необходимости) G C находит и удаляет потерянные объекты.

Если бы память была освобождена автоматически, мне больше не пришлось бы искать альтернативный метод для преобразования массива байтов в строку.

Да, а вы нет.

В Java вы просто позволяете исполняющей системе иметь дело с выделением и освобождением памяти объекта. (Просто убедитесь, что объекты не становятся доступными случайно).

2 голосов
/ 03 апреля 2020

Комментарий Йоханнеса является хорошей отправной точкой, поскольку сборка мусора является ключевым понятием в Java.

Чтобы ответить на ваши вопросы, вам не нужно создавать новый экземпляр строки при инициализации с помощью байтового массива.

Во втором фрагменте кода:

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

У нас есть String 's', который является String указателем на ничто. Затем в вашем l oop вы указываете это на объект String в куче. Когда вы переназначаете 's' в l oop, это выделит больше памяти для вашей новой строки, а затем сборщик мусора заберет старый объект String из кучи. Это потому, что объект больше не ссылается на него.

Вот хорошая статья об неизменности строк.

...