В какой области памяти хранятся Java-примитивы

Обновлено: 21.11.2024

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

short: короткий тип данных представляет собой 16-разрядное целое число в дополнении до двух со знаком. Он имеет минимальное значение -32 768 и максимальное значение 32 767 (включительно). Как и в случае с byte , применяются те же рекомендации: вы можете использовать short для экономии памяти в больших массивах в ситуациях, когда экономия памяти действительно имеет значение.

int: по умолчанию тип данных int представляет собой 32-разрядное целое число в дополнении до двух со знаком, минимальное значение которого равно -2 31, а максимальное - 2 31 -1. В Java SE 8 и более поздних версиях можно использовать тип данных int для представления 32-разрядного целого числа без знака, минимальное значение которого равно 0, а максимальное — 2 32 -1. Используйте класс Integer, чтобы использовать тип данных int как целое число без знака. Дополнительную информацию см. в разделе Классы чисел. В класс Integer добавлены статические методы, такие как compareUnsigned ,divideUnsigned и т. д., которые поддерживают арифметические операции для целых чисел без знака.

long: тип данных long представляет собой 64-битное целое число с дополнением до двух. Signed long имеет минимальное значение -2 63 и максимальное значение 2 63 -1. В Java SE 8 и более поздних версиях вы можете использовать тип данных long для представления беззнакового 64-битного типа long, который имеет минимальное значение 0 и максимальное значение 2 64 -1. Используйте этот тип данных, когда вам нужен диапазон значений, более широкий, чем предоставленный int . Класс Long также содержит такие методы, как compareUnsigned ,divideUnsigned и т. д., для поддержки арифметических операций с unsigned long.

float: тип данных float представляет собой 32-разрядное число с плавающей запятой одинарной точности IEEE 754. Его диапазон значений выходит за рамки этого обсуждения, но указан в разделе Типы, форматы и значения с плавающей запятой Спецификации языка Java. Как и в случае с рекомендациями для byte и short , используйте float (вместо double ), если вам нужно сохранить память в больших массивах чисел с плавающей запятой. Этот тип данных никогда не следует использовать для точных значений, таких как валюта. Для этого вам нужно будет использовать класс java.math.BigDecimal. Numbers and Strings охватывает BigDecimal и другие полезные классы, предоставляемые платформой Java.

double: тип данных double представляет собой 64-разрядное число с плавающей запятой двойной точности IEEE 754. Его диапазон значений выходит за рамки этого обсуждения, но указан в разделе Типы, форматы и значения с плавающей запятой Спецификации языка Java. Для десятичных значений этот тип данных обычно используется по умолчанию. Как упоминалось выше, этот тип данных никогда не следует использовать для точных значений, таких как валюта.

boolean: логический тип данных имеет только два возможных значения: true и false . Используйте этот тип данных для простых флагов, которые отслеживают истинные/ложные условия. Этот тип данных представляет один бит информации, но его «размер» точно не определен.

char: тип данных char представляет собой один 16-битный символ Unicode. Он имеет минимальное значение '\u0000' (или 0) и максимальное значение '\uffff' (или 65 535 включительно).

В дополнение к восьми перечисленным выше примитивным типам данных язык программирования Java также обеспечивает специальную поддержку строк символов через класс java.lang.String. Заключение вашей строки символов в двойные кавычки автоматически создаст новый объект String; например, String s = "это строка"; . Строковые объекты являются неизменяемыми, что означает, что после создания их значения нельзя изменить. Класс String технически не является примитивным типом данных, но, учитывая особую поддержку, предоставляемую ему языком, вы, вероятно, склонны считать его таковым. Вы узнаете больше о классе String в простых объектах данных

Значения по умолчанию

При объявлении поля не всегда необходимо присваивать значение. Поля, которые объявлены, но не инициализированы, будут установлены компилятором в разумные значения по умолчанию. Вообще говоря, это значение по умолчанию будет равно нулю или null , в зависимости от типа данных. Однако полагаться на такие значения по умолчанию обычно считается плохим стилем программирования.

В следующей таблице приведены значения по умолчанию для вышеуказанных типов данных.

< td headers="h2">false
Тип данных Значение по умолчанию (для полей )
byte 0
короткий 0
int 0
long 0L
float 0.0f
двойной 0 .0d
char '\u0000'
Строка (или любой объект) null
логическое значение

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

Литералы

Вы могли заметить, что ключевое слово new не используется при инициализации переменной примитивного типа. Примитивные типы — это специальные типы данных, встроенные в язык; они не являются объектами, созданными из класса. Литерал — это представление исходного кода фиксированного значения; литералы представлены непосредственно в вашем коде, не требуя вычислений. Как показано ниже, можно присвоить литерал переменной примитивного типа:

Целые литералы

Целочисленный литерал имеет тип long, если он заканчивается буквой L или l; в противном случае он имеет тип int . Рекомендуется использовать заглавную букву L, поскольку строчную букву l трудно отличить от цифры 1 .

Значения целочисленных типов byte , short , int и long могут быть созданы из литералов int. Значения типа long, выходящие за пределы диапазона int, могут быть созданы из длинных литералов. Целочисленные литералы могут быть выражены следующими системами счисления:

  • Десятичный: основание 10, цифры которого состоят из чисел от 0 до 9; это система счисления, которую вы используете каждый день
  • Шестнадцатеричный формат: 16 с основанием, цифры которого состоят из цифр от 0 до 9 и букв от A до F.
  • Двоичный: основание 2, цифры которого состоят из чисел 0 и 1 (вы можете создавать двоичные литералы в Java SE 7 и более поздних версиях)

Для программирования общего назначения десятичная система, вероятно, будет единственной системой счисления, которую вы когда-либо будете использовать. Однако, если вам нужно использовать другую систему счисления, в следующем примере показан правильный синтаксис. Префикс 0x указывает на шестнадцатеричный формат, а 0b указывает на двоичный:

Литералы с плавающей запятой

Литерал с плавающей запятой имеет тип float, если он заканчивается буквой F или f ; в противном случае он имеет тип double и может заканчиваться буквой D или d .

Типы с плавающей запятой ( float и double ) также могут быть выражены с использованием E или e (для научного представления), F или f (32-битный литерал с плавающей запятой) и D или d (64-битный двойной литерал; это по умолчанию и по соглашению опущен).

Символьные и строковые литералы

Литералы типов char и String могут содержать любые символы Юникода (UTF-16). Если ваш редактор и файловая система это позволяют, вы можете использовать такие символы непосредственно в своем коде. Если нет, вы можете использовать «побег Unicode», например «\ u0108» (заглавная C с циркумфлексом) или «S\u00ED Se\u00F1or» (Sí Señor на испанском языке). Всегда используйте одинарные кавычки для символьных литералов и двойные кавычки для строковых литералов. Управляющие последовательности Unicode могут использоваться в других местах программы (например, в именах полей), а не только в символьных или строковых литералах.

Язык программирования Java также поддерживает несколько специальных escape-последовательностей для символьных и строковых литералов: \b (возврат), \t (табуляция), \n (перевод строки), \f (перевод страницы), \r (перевод строки). return), \" (двойная кавычка), \' (одинарная кавычка) и \\ (обратная косая черта).

Есть также специальный нулевой литерал, который можно использовать в качестве значения для любого ссылочного типа. null может быть присвоен любой переменной, кроме переменных примитивных типов. Мало что можно сделать с нулевым значением, кроме проверки его наличия. Поэтому null часто используется в программах как маркер, указывающий на то, что какой-то объект недоступен.

Наконец, существует также особый вид литералов, называемый литералом класса, образованный путем взятия имени типа и добавления " .class" ; например, String.class . Это относится к объекту (типа Class ), который представляет сам тип.

Использование символов подчеркивания в числовых литералах

В Java SE 7 и более поздних версиях между цифрами в числовом литерале может стоять любое количество символов подчеркивания ( _ ). Эта функция позволяет вам, например. для разделения групп цифр в числовых литералах, что может улучшить читаемость кода.

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

В следующем примере показаны другие способы использования символа подчеркивания в числовых литералах:

Знаки подчеркивания можно ставить только между цифрами; вы не можете размещать символы подчеркивания в следующих местах:

  • В начале или конце номера
  • Рядом с десятичной точкой в ​​литерале с плавающей запятой
  • Перед суффиксом F или L
  • В позициях, где ожидается строка цифр

Следующие примеры демонстрируют допустимые и недопустимые места размещения подчеркивания (выделенные) в числовых литералах:

Примитивные типы, объявленные локально, будут находиться в стеке, а примитивные типы, определенные как часть экземпляра объекта, хранятся в куче. Локальные переменные хранятся в стеке, а экземпляры и статические переменные — в куче.

Что такое примитивы в Java?

Примитивные типы данных. В Java определены восемь примитивов: int, byte, short, long, float, double, boolean и char — они не считаются объектами и представляют необработанные значения. Они хранятся непосредственно в стеке (ознакомьтесь с этой статьей для получения дополнительной информации об управлении памятью в Java).

Как хранятся объекты Java?

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

Как выделяется память для примитивных типов данных?

➲ В Java все типы данных для переменных примитивного типа хранятся в стеке. ➲ Для ссылочных типов данных стек содержит указатель на объект в куче.

Почему локальные примитивные переменные хранятся в стеке?

5 ответов. При вызове метода в стек помещаются определенные данные. . Следовательно, если у вас есть переменная, которая должна пережить выполнение создавшего ее метода, она должна находиться в куче. Это относится как к любым объектам, которые вы создаете, так и к любым примитивам, хранящимся в этих объектах.

Типы данных примитивов в Java — все примитивы и что они делают

Найдено 30 связанных вопросов

Что такое стек и куча?

Стек — это линейная структура данных, а куча — иерархическая структура данных. Память стека никогда не будет фрагментирована, тогда как память кучи может стать фрагментированной, поскольку блоки памяти сначала выделяются, а затем освобождаются. Stack имеет доступ только к локальным переменным, тогда как Heap позволяет вам обращаться к переменным глобально.

Переменные экземпляра хранятся в стеке или в куче?

Стек — это область памяти, в которой хранятся методы и локальные переменные. (ссылки на переменные либо на примитивы, либо на объекты также хранятся в стеке). Куча — это место в памяти, где хранятся объекты и их переменная экземпляра.

Почему объекты хранятся в куче?

Пространство кучи в Java используется для динамического выделения памяти для объектов Java и классов JRE во время выполнения. Новые объекты всегда создаются в куче, а ссылки на эти объекты хранятся в памяти стека. Эти объекты имеют глобальный доступ и могут быть доступны из любой точки приложения.

Какие существуют 8 примитивных типов данных?

В язык Java встроено 8 примитивных типов данных. К ним относятся: int, byte, short, long, float, double, boolean и char.

Как примитивы хранятся в памяти?

Память стека хранит примитивные типы и адреса объектов. Значения объекта хранятся в куче памяти. Ссылка на объект в стеке — это только адрес, который относится к месту в куче памяти, где хранится этот объект. . Объект test2 в куче все еще существует, но к нему нельзя получить доступ.

Где в Java хранятся переменные?

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

Где Java хранит память?

Стек и куча используются для выделения памяти в Java. Однако стек используется для примитивных типов данных, временных переменных, адресов объектов и т. д. Куча используется для хранения объектов в памяти.

Что такое Java-мусор?

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

Что такое короткий тип данных в Java?

Короткий тип данных представляет собой 16-разрядное целое число в дополнении до двух со знаком. Его диапазон значений составляет от -32 768 до 32 767 (включительно). Его минимальное значение равно -32 768, а максимальное — 32 767. Его значение по умолчанию равно 0. Тип коротких данных также можно использовать для экономии памяти, как и тип данных byte.

Какие 4 примера непримитивных типов данных?

Класс, объект, массив, строка и интерфейс в Java называются непримитивными типами данных. Эти типы данных не определены в Java заранее.

Является ли строка типом данных?

Строка обычно считается типом данных и часто реализуется как структура данных массива байтов (или слов), в которой хранится последовательность элементов, обычно символов, с использованием некоторой кодировки символов.

Что такое примитивный тип данных Java?

Примитивный тип данных: в Java примитивные типы данных — это предопределенные типы данных Java. Они определяют размер и тип любых стандартных значений. Java имеет 8 примитивных типов данных, а именно byte, short, int, long, float, double, char и boolean.

Как данные хранятся в куче?

Распределение кучи: память выделяется во время выполнения инструкций, написанных программистами. . Молодое поколение — это часть памяти, в которой создаются все новые данные (объекты) для выделения пространства, и всякий раз, когда эта память полностью заполняется, остальные данные сохраняются в сборке мусора.

Все ли объекты хранятся в куче?

Пространство кучи содержит все созданные объекты, а стек содержит все ссылки на эти объекты. К объектам, хранящимся в куче, можно получить доступ во всем приложении. Доступ к примитивным локальным переменным осуществляется только в тех блоках памяти стека, которые содержат их методы.

Есть ли куча Java в оперативной памяти?

Куча Java находится в оперативной памяти (без учета виртуальной памяти :). Вы можете изменить исходный размер кучи по умолчанию и максимальный размер кучи с помощью аргументов виртуальной машины -Xms и -Xmx соответственно.

Является ли динамическая память частью оперативной памяти?

Стек и куча — это детали реализации, но они также находятся в оперативной памяти. Несмотря на то, что память загружена в ОЗУ, она не адресуется напрямую.

Почему стековая память быстрее кучи?

Поскольку данные добавляются и удаляются в порядке поступления и удаления, выделение памяти на основе стека очень просто и, как правило, намного быстрее, чем выделение памяти на основе кучи (также известное как динамическое выделение памяти), обычно выделяемое с помощью маллок . Обычно это намного дешевле, чем вызов malloc, и в любом случае бесплатно.

Какие переменные хранятся в стеке?

Стек используется для динамического выделения памяти, а локальные переменные хранятся в верхней части стека в кадре стека. Указатель кадра используется для ссылки на локальные переменные в кадре стека. Рис. 110. Кадр стека до и после инструкции LINK.

➲ В Java все типы данных для переменных примитивного типа хранятся в стеке.

➲ Для ссылочных типов данных стек содержит указатель на объект в куче. При установке переменной ссылочного типа равной другой переменной ссылочного типа создается копия только указателя.

➲ Невозможно управлять некоторыми типами объектов в куче.

Давайте разберемся во всех этих моментах на одном простом примере, как показано на рисунке ниже.

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

<р>1. В первой строке кода мы объявили переменную примитивного типа int a = 3;. Поскольку «a» — это переменная примитивного типа, тип данных которой — int. Таким образом, все данные будут размещены в памяти стека, как показано во втором блоке рисунка выше.

<р>2. Во второй строке кода мы объявили переменную типа int b = a;. Поскольку «b» — это переменная примитивного типа, а «a» — тоже примитивный тип. Поэтому JVM просто копирует данные из a в b.

<р>3. В третьей строке мы просто изменили значение переменной b, равное 100. В этом случае JVM сохранит запись 100 в стеке вместо

<р>4. Возьмем некоторую переменную ссылочного типа, т. е. непримитивный тип. В строке 4 «c» — это переменная ссылочного типа, объявленная как целочисленный массив.

Массив целых чисел — это объект. Итак, JVM установит c в стеке и укажет указатель на объект в куче.

Этот объект представляет собой массив размера четыре со значениями 1, 2, 3, 4 в индексе, как показано на рисунке выше. Индекс начинается с 0, 1, 2 и 3. Только данные, хранящиеся в c в стеке, являются указателем.

<р>5. В пятой строке переменная d также объявлена ​​как целочисленный тип массива и установлена ​​равной c. Таким образом, в этом случае JVM скопирует адрес данных c в d в памяти стека. Таким образом, c и d будут указывать на один и тот же объект в куче.

<р>6. В шести строках кода объявляется целочисленный массив e, указывающий на новый объект в куче.

<р>7. Снова создается целочисленный массив f, указывающий на новый объект в куче. На приведенном выше рисунке вы заметите, что значения одинаковы, но и e, и f указывают на разные объекты в куче. В этом случае адрес данных e не будет скопирован в f в памяти стека.

<р>8.В последней строке кода переменная g объявлена ​​как строковый тип данных, который является непримитивным типом данных и указывает на «hello» в куче.

Итак, вы видели, что все примитивные типы данных хранятся в стеке, а в случае ссылочного типа стек содержит указатель на объект в куче. Здесь мы описали только основные идеи, связанные с концепцией выделения памяти для типов данных.

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

Надеюсь, что это руководство охватило основные моменты, связанные с выделением памяти для примитивных и непримитивных типов данных в java. Я надеюсь, что вы поняли основную концепцию и вам понравилось.
Спасибо за чтение.
Далее ⇒ Переменные в Java ⇐ НазадСледующее ⇒

Узнайте о различных типах данных в Java. Изучите различия между примитивными типами данных и непримитивными типами данных (или ссылочными типами данных). Мы также узнаем о размерах типов данных и рекомендациях по использованию типов данных в Java.

1. Объявления переменных

В Java обычно типы данных связаны с переменными. Объявление переменной состоит из трех частей:

  1. Имя переменной (также называемое идентификатором) для ссылки на ячейку памяти
  2. Тип переменной, хранящийся в ячейке памяти (называется тип данных)
  3. Ячейка памяти для хранения значения переменной.

Второе свойство называется типом данных.

Тип данных Java

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

Например, для переменной типа данных 'int' выделяется 32 бита памяти.

Java – это язык со статической типизацией. Это означает, что все переменные ДОЛЖНЫ быть объявлены до того, как их можно будет использовать.

2. Типы данных

Java поддерживает два типа типов данных:

  1. Примитивный тип данных
  2. Непримитивный или ссылочный тип данных.

2.1. Примитивные типы данных

  • Примитивный тип данных непосредственно хранит значение в памяти. Например, число или символ.
  • Примитивные типы данных не являются объектами, как и ссылки на объекты.
  • Значения, хранящиеся в примитивах, называются литералами.

Литерал — это представление исходного кода фиксированного значения; литералы представлены непосредственно в вашем коде, не требуя вычислений.

В Java есть восемь примитивных типов данных.

В Java SE 7 и более поздних версиях между цифрами числового литерала может стоять любое количество символов подчеркивания ( '_' ). например 10_000_000 — допустимое число в Java. Подробнее

Преобразование типов между примитивами

За исключением boolean, мы можем присвоить примитивное значение другому примитивному типу. Однако иногда это может привести к потере данных, когда примитиву с большим объемом памяти назначается примитив с меньшим объемом памяти.

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

Обратите внимание, что когда Java обнаруживает, что преобразование типов может привести к потере данных (больший тип данных к меньшему), затем выдает ошибку несоответствия типов и явно запрашивает приведение типов (например, присваивание «int» к «short»). Это помогает обнаруживать и устранять случаи случайной потери данных.

2.2. Непримитивные типы данных

Непримитивный или ссылочный тип данных содержит ссылку на объект в памяти. Используя ссылку, хранящуюся в переменной, вы можете получить доступ к полям и методам объекта, на который указывает ссылка.

Например, java.lang.String — это класс, определенный в библиотеке Java, и вы можете использовать его для управления текстом (последовательностью символов). Вы объявляете ссылочную переменную типа String как:

Что происходит при выполнении этого кода?

  • Сначала выделяется блок памяти, и имя переменной str связывается с этой ячейкой памяти. Этот процесс аналогичен объявлению переменной примитивного типа данных.
  • Вторая часть кода создает в памяти новый объект String с текстом "Hello World !!" и сохраняет ссылку (или адрес памяти) объекта String в переменную 'str' .

Несколько переменных могут ссылаться на один и тот же объект

Вы также можете присвоить ссылку на объект, хранящийся в одной ссылочной переменной, другой ссылочной переменной. В таких случаях обе ссылочные переменные будут ссылаться на один и тот же объект в памяти.

Существует ссылочная константа (также известная как ссылочный литерал) null, которую можно присвоить любой ссылочной переменной. Если ссылочной переменной присваивается значение null, это означает, что эта ссылочная переменная не ссылается ни на какой объект в памяти.

3. Классы-оболочки

Класс-оболочка — это класс, объект которого является оболочкой или содержит примитивные типы данных. Другими словами, мы можем обернуть примитивное значение в объект класса-оболочки.

Обратите внимание, что в Java есть один класс-оболочка, сопоставленный каждому примитивному типу данных.

Например, класс java.lang.Integer является объектной версией типа данных int. Точно так же у нас есть всего 8 классов-оболочек для всех 8 примитивных типов данных.

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

Эти классы-оболочки: Boolean , Byte , Short , Character , Integer , Long , Float и Double .

4. Автобокс

В Java можно напрямую присвоить значение примитивного типа классу-оболочке.

Например, вы можете присвоить значение int ссылке на класс Interger.

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

Читайте также: