Куча и стек — очень важные понятия в структуре данных Java. В этой статье более подробно анализируется разница между ними. Для справки. Подробности следующие:
Куча Java — это область данных времени выполнения, из которой объекты класса выделяют пространство. Эти объекты создаются с помощью таких инструкций, как new, newaray, anewarray и multianewarray, и они не требуют явного освобождения программного кода. Куча собирается с помощью сборки мусора. Ответственный, преимущество кучи заключается в том, что она может динамически выделять размер памяти, и время жизни не нужно сообщать компилятору заранее, поскольку она динамически выделяет память во время выполнения, а сборщик мусора Java автоматически соберет те, которые больше не используются. data, но недостатком является то, что из-за необходимости динамического выделения памяти во время выполнения скорость доступа низкая.
Преимущество стека в том, что скорость доступа выше, чем у кучи, уступая только регистру, и данные стека могут быть разделены. Но недостатком является то, что размер и время жизни данных, хранящихся в стеке, должны быть определены, а также отсутствует гибкость. В стеке в основном хранятся некоторые базовые типы переменных (int, short, long, byte, float, double, boolean, char) и дескрипторы объектов.
Очень важной особенностью стека является возможность совместного использования данных, хранящихся в стеке. Предположим, мы также определяем:
интервал а = 3;
интервал б = 3;
Компилятор сначала обрабатывает int a = 3; сначала он создает ссылку на переменную a в стеке, а затем проверяет, есть ли в стеке значение 3. Если оно не найдено, он сохраняет 3, а затем указывает на a. 3. Затем обработайте int b = 3; после создания ссылочной переменной b, поскольку в стеке уже есть значение 3, b будет указывать непосредственно на 3. Таким образом, возникает ситуация, когда a и b одновременно указывают на 3.
В это время, если a=4 установлено снова; тогда компилятор повторно проверит, есть ли в стеке значение 4. Если нет, он сохранит 4 и установит точку на 4, если она уже существует; прямо укажет на этот адрес. Следовательно, изменение значения a не повлияет на значение b.
Следует отметить, что этот вид совместного использования данных отличается от совместного использования ссылок двух объектов, указывающих на один объект одновременно, поскольку в этом случае модификация a не влияет на b, ее завершает компилятор, который выгодно экономить место. Если переменная ссылки на объект изменяет внутреннее состояние объекта, это повлияет на другую переменную ссылки на объект.
Строка — это особый тип данных-оболочки. Может использоваться:
String str = new String("abc");String str = "abc";
Есть два способа его создания. Первый — использовать new() для создания нового объекта, который будет храниться в куче. Новый объект создается каждый раз при его вызове.
Второй метод — сначала создать в стеке ссылочную переменную объекта str класса String, а затем проверить, хранится ли в стеке «abc». Если нет, сохранить «abc» в стеке и сделать так, чтобы строка указывала на «abc». "., если уже есть "abc", напрямую укажите str на "abc".
При сравнении того, равны ли значения в классе, используйте методquals(); при проверке того, указывают ли ссылки двух классов-оболочек на один и тот же объект, используйте == Следующий пример иллюстрирует приведенную выше теорию.
Строка str1 = "abc"; Строка str2 = "abc"; System.out.println(str1==str2);
Видно, что str1 и str2 указывают на один и тот же объект.
Строка str1 = новая строка ("abc"); String str2 = новая строка ("abc"); System.out.println(str1==str2);
Использование new означает создание различных объектов. Генерируйте по одному.
Таким образом, если вы используете первый метод для создания нескольких строк «abc», в памяти фактически находится только один объект. Такой способ записи выгоден для экономии места в памяти. В то же время он может повысить скорость работы. программе в определенной степени, поскольку JVM автоматически определит, необходимо ли создавать новый объект, исходя из фактического положения данных в стеке. Для кода String str = new String("abc"); новые объекты всегда создаются в куче, независимо от того, равны ли их строковые значения или необходимо создавать новые объекты, тем самым увеличивая нагрузку на программа.
С другой стороны, обратите внимание: когда мы определяем класс, используя такой формат, как String str = "abc";, мы всегда предполагаем, что создается объект str класса String. Бойтесь ловушек! Возможно, объект не был создан! Вместо этого он может просто указывать на ранее созданный объект. Только с помощью метода new() мы можем гарантировать, что каждый раз создается новый объект.
Из-за неизменяемой природы класса String, когда переменной String необходимо часто менять свое значение, вам следует рассмотреть возможность использования класса StringBuffer для повышения эффективности программы.
Я надеюсь, что описание этой статьи будет полезно каждому при изучении программирования на Java.