Вход Java = “” то же как не вводится = пустой указатель?

Я недавно боролся с проблемами с чрезмерным вращением памяти. Если известно, что a и / или b обычно пусты, вот еще одна адаптация кода silvertab (также обобщенного):

private static <T> T[] concatOrReturnSame(T[] a, T[] b) {
    final int alen = a.length;
    final int blen = b.length;
    if (alen == 0) {
        return b;
    }
    if (blen == 0) {
        return a;
    }
    final T[] result = (T[]) java.lang.reflect.Array.
            newInstance(a.getClass().getComponentType(), alen + blen);
    System.arraycopy(a, 0, result, 0, alen);
    System.arraycopy(b, 0, result, alen, blen);
    return result;
}

Редактирование: в предыдущей версии этого поста говорилось, что повторное использование массива выглядит следующим образом должны быть четко документированы. Как указывает Мартен в комментариях, в целом было бы лучше просто удалить операторы if, что исключает необходимость иметь документацию. Но опять же, эти операторы if были главной целью этой конкретной оптимизации. Я оставлю этот ответ здесь, но будьте осторожны!

6
задан Henrik P. Hessel 29 July 2009 в 23:20
поделиться

6 ответов

Каждая переменная на самом деле является указателем на "Данные" в памяти.

input = "" назначает ввод строковому объекту. Он имеет длину (0) и пустой массив, а также несколько других связанных с ним данных.

input.length () вернет в этой точке 0.

input = null делает входную точку на "Инвалид". Null - это своего рода особый случай, который означает, что этот указатель указывает на НИЧЕГО, он не назначен.

input.length () теперь будет вызывать исключение, потому что вы вызываете .length ни с чем.

11
ответ дан 8 December 2019 в 03:54
поделиться

Использование StringBuffer могло бы быть лучшим подходом

На некоторые из этих вопросов уже был дан ответ здесь, в SO:

Построитель строк и StringBuffer в java

зачем использовать StringBuffer в java вместо оператора объединения строк

5
ответ дан 8 December 2019 в 03:54
поделиться

input = null удаляет (позволяет сборщику мусора удалить) объект в памяти, а input = "" создает экземпляр объекта String содержащая пустую строку "" . Установив для input значение null, вы сделаете input пустым объектом, поэтому он не займет какой-либо памяти, а при установке input = "" вы устанавливаете его для нового объекта , это определенно потребует некоторого объема памяти (очевидно, оно должно быть минимальным).

Вы можете изучить эту статью из IBM , где рассказывается о Java GC и производительности , что противоречит моей предыдущей рекомендации. В нем говорится:

Явное обнуление - это просто практика установки эталонных объектов обнулить, когда вы закончите с их. Суть обнуления заключается в том, что он помогает сборщику мусора, делать объекты недоступными раньше. Или по крайней мере, это теория.

Есть один случай, когда использование явное обнуление не только полезно, но практически требуется, и это где ссылка на объект охватывается более широко, чем используется, или считается действительным по программе спецификация. Это включает случаи например, использование статики или экземпляра поле для хранения ссылки на временный буфер, а не локальный переменной или используя массив для хранения ссылки, которые могут оставаться доступными по времени выполнения, но не по подразумеваемым семантика программы.

И, кроме того,

В сентябре 1997 года в колонке «Технические советы Java-разработчика по подключению» (см. Ресурсы) Sun предупредила об этом риске и объяснила, как явное обнуление необходимо в таких случаях, как pop () пример выше. К сожалению, программисты часто заходят слишком далеко, используя явное обнуление в надежде помочь сборщику мусора. Но в большинстве случаев это совсем не помогает сборщику мусора , а в некоторых случаях может фактически снизить производительность вашей программы.

5
ответ дан 8 December 2019 в 03:54
поделиться

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

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

Вот веб-страница, которая сообщает как это сделать: http://twit88.com/blog/2008/12/19/java-troubleshooting-memory-problem/

Удачи!


Еще одна идея: напишите короткую программу, которая ничего не делает, кроме создания больших String, а затем включите режим подробной сборки мусора, чтобы увидеть, что там происходит. Если вы можете воспроизвести поведение в небольшой программе, вам будет легче его изучить. Я думаю, вы можете обнаружить, что JVM на ПК может вести себя иначе, чем JVM в устройстве J2ME, таком как сотовый телефон.

3
ответ дан 8 December 2019 в 03:54
поделиться

В Java строки - это объекты, а имена переменных объектов всегда являются указателями. Если у вас есть String с именем input и введите input = null, это указывает input на пустое пространство в памяти. Если у вас есть input = "", он создает строку, не содержащую текста, пустую строку.

1
ответ дан 8 December 2019 в 03:54
поделиться

Я хотел бы добавить немного к ответу путешественника:

Относительно строк

Утверждение input = ""; с точки зрения сборки мусора - это то же самое, что запись input = "abcde ..."; , поскольку ни один из операторов не аннулирует экземпляр объекта input ], но оба просто изменяют содержимое входной переменной String . Кроме того, для точности и пояснения, input = something " изменяет содержимое input , а String input =" "; создает экземпляр input .

Если input == "", то 'if (input.isEmpty ()) будет истинным, но if (input == null) `будет ложным.

Относительно сборки мусора

Оператор input = null; уменьшает счетчик ссылок на этот конкретный экземпляр объекта, который, если это последняя ссылка на input , тогда input будет помечен для сборки мусора, которая будет происходить недетерминированно AKA, когда сборщик мусора доберется до него. Случай, когда input = null; фактически не помечает input для сборки мусора, будет: если input также был передан в коллекцию; до тех пор, пока вход не будет удален из коллекции, счетчик ссылок не будет уменьшаться и, следовательно, не будет собираться мусором.

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

-bn

уменьшает счетчик ссылок на этот конкретный экземпляр объекта, который, если это последняя ссылка на вход , тогда вход будет помечен для сборки мусора, которая будет происходить недетерминированно. AKA, когда до него добирается сборщик мусора. Случай, когда input = null; фактически не помечает input для сборки мусора, будет: если input также был передан в коллекцию; до тех пор, пока вход не будет удален из коллекции, счетчик ссылок не будет уменьшаться и, следовательно, не будет собираться мусором.

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

-bn

уменьшает счетчик ссылок на этот конкретный экземпляр объекта, который, если это последняя ссылка на вход , тогда вход будет помечен для сборки мусора, которая будет происходить недетерминированно. AKA, когда до него добирается сборщик мусора. Случай, когда input = null; фактически не помечает input для сборки мусора, будет: если input также был передан в коллекцию; до тех пор, пока вход не будет удален из коллекции, счетчик ссылок не будет уменьшаться и, следовательно, не будет собираться мусором.

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

-bn

если это последняя ссылка на вход , то вход будет помечен для сборки мусора, которая будет происходить недетерминированно AKA, когда сборщик мусора доберется до него. Случай, когда input = null; фактически не будет отмечать input для сборки мусора, будет: если input также был передан в коллекцию; до тех пор, пока вход не будет удален из коллекции, счетчик ссылок не будет уменьшаться и, следовательно, не будет собираться мусором.

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

-bn

если это последняя ссылка на вход , тогда вход будет помечен для сборки мусора, которая будет происходить недетерминированно AKA, когда сборщик мусора доберется до него. Случай, когда input = null; фактически не помечает input для сборки мусора, будет: если input также был передан в коллекцию; до тех пор, пока вход не будет удален из коллекции, счетчик ссылок не будет уменьшаться и, следовательно, не будет собираться мусором.

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

-bn

Случай, когда input = null; фактически не помечает input для сборки мусора, будет: если input также был передан в коллекцию; до тех пор, пока вход не будет удален из коллекции, счетчик ссылок не будет уменьшаться и, следовательно, не будет собираться мусором.

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

-bn

Случай, когда input = null; фактически не будет отмечать input для сборки мусора, будет: если input также был передан в коллекцию; до тех пор, пока вход не будет удален из коллекции, счетчик ссылок не будет уменьшаться и, следовательно, не будет собираться мусором.

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

-bn

2
ответ дан 8 December 2019 в 03:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: