ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 08.11.2023

Просмотров: 21

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Java/Типы данных


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


Типы с плавающей точкой



Логический тип




char:

В Java для char используется кодировка Unicode и для хранения Unicode-символов используется 16 бит или 2 байта. Диапазон допустимых значений - от 0 до 65536 (отрицательных значений не существует).Тип char - это обыкновенный целочисленный арифметический тип и все арифметические операции применимы к нему, также как и любому другому целочисленному арифметическому типу.

Но в тоже время, большинство арифметических операций не будут работать непосредственно в рамках типа char, а сначала выполняет автоматическое преобразование операндов к типу int (или, теоретически, unsigned int) и вычисления уже будут производить в рамках типа int.

То же самое относится и к типу short.
Явные и неявные приведения типов в Java:

В Java существует много типов данных. В большинстве случаев при кодировании необходимо изменить тип данных, чтобы понять обработку переменной, и это называется приведением типа.
Что такое приведение типов в Java?

Приведение типов в Java – это присвоение значения одного примитивного типа данных другому. Вы должны знать о совместимости этого типа данных. Если они совместимы, тогда Java выполнит преобразование, известное как автоматическое преобразование типов, а если нет, то их необходимо явно преобразовать.

В Java есть два типа приведения:

Расширение приведения (автоматически) – преобразование меньшего типа данных в больший размер типа. byte -> short -> char -> int -> long -> float -> double


Сужение приведения (вручную) – преобразование данных большего размера в тип меньшего размера. double -> float -> long -> int -> char -> short -> byte



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

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

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

Кроме того, char и boolean не совместимы друг с другом.
Явное

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

Что такое классы обертки?

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


Значение null используется для ссылочных типов, когда значение не определено.
Autoboxing происходит:

  1. При присвоении значения примитивного типа переменной соответствующего класса-обёртки.

  2. При передаче примитивного типа в параметр метода, ожидающего соответствующий ему класс-обёртку.

Автораспаковка (Unboxing)


Это преобразование класса-обёртки в соответствующий ему примитивный тип. Если при распаковке класс-обёртка был равен null, произойдет исключение java.lang.NullPointerException.
Unboxing происходит:

  1. При присвоении экземпляра класса-обёртки переменной соответствующего примитивного типа.

  2. В выражениях, в которых один или оба аргумента являются экземплярами классов-обёрток (кроме операции == и !=).

  3. При передаче объекта класса-обёртки в метод, ожидающий соответствующий примитивный тип.


Пул строк (String Pool) — это множество строк в кучи (Java Heap Memory). Мы знаем, что String — особый класс в java, с помощью которого мы можем создавать строковые объекты.

На диаграмме ниже мы видим как я именно строковый пул расположен в памяти Java Heap. И как разные способы создания строк влияют на расположение их в памяти.



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

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

String – неизменяемая строка. StringBuffer — потокобезопасная изменяемая строка. StringBuilder – изменяемая строка с высокой производительностью, но без синхронизации.

Массив — упорядоченный набор элементов, каждый из которых хранит одно значение, идентифицируемое с помощью одного или нескольких индексов. В простейшем случае массив имеет постоянную длину и хранит единицы данных одного и того же типа, а в качестве индексов выступают целые числа. Поскольку индекс массива — int, приблизительное значение индекса может быть 2^31 — 1. Исходя из этого приближения, мы можем сказать, что массив теоретически может содержать 2 147 483 647 элементов .

Метод — это именованный блок кода, объявляемый внутри класса. Он содержит некоторую законченную последовательность действий (инструкций), направленных на решение отдельной задачи, который можно многократно использовать. Иными словами, метод — это некоторая функция: что-то, что умеет делать ваш класс. В других языках тоже присутствуют функции. Только в Java они являются членами классов.

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


Чем отличается декремент от инкремента? Инкремент — это операция во многих языках программирования, которая выполняет увеличение переменной. Чаще всего под инкрементом подразумевается увеличение переменной на 1 единицу. Обратной операцией называют декремент. Декремент — это уменьшение переменной. Чаще всего также на единицу.

Оператор (++) называется инкремент. Он увеличивает значение целочисленной переменной на единицу. Обратный оператор (--) зовётся декремент. Он значение переменной на один уменьшает.

В Java доступны следующие логические операции:

  • Логическое отрицание, оно же NOT или инверсия. В Java обозначается символом “!” перед операндом. Применяется к одному операнду.

  • Логическое и, оно же AND или конъюнкция. Обозначается символом “&” между двумя операндами, к которым применяется.

  • Логическое или в Java, оно же — OR, оно же — дизъюнкция. В Java обозначается символом “|” между двумя операндами.

  • Исключающее или, XOR, строгая дизъюнкция. В Java обозначается символом “^” между двумя операндами.

  • В Java к логическим операторам можно отнести условное или, обозначаемое как ||, а также условное и — &&.





Известны такие виды циклов: Циклы с предусловием: условие выполнения определяется перед первой итерацией. Циклы с постусловием: условие выполнения определяется после первой итерации (поэтому они всегда выполняются минимум один раз).

Оператор break - завершает ближайший оператор или оператор итерации switch . Оператор continue - запускает новую итерацию ближайшего включающего оператора итерации. Оператор return : завершает выполнение функции, в которой она отображается, и возвращает управление вызывающему объекту.

Рекурсия – это такой способ задания функции, при котором результат возврата из функции для данного значения аргумента определяется на основе результата возврата из той же функции для предыдущего (меньшего или большего) значения аргумента.
Другими словами, рекурсия – это вызов функции самой себя для перехода к следующему шагу рекурсии. Чтобы следующий шаг рекурсии отличался от предыдущего, значение как минимум одного из параметров функции должно изменяться в процессе рекурсивного вызова.
Преимущества и недостатки использования рекурсии

Рекурсию часто сравнивают с итерацией. Организация циклического процесса с помощью рекурсии имеет свои преимущества и недостатки.

Можно выделить следующие взаимосвязанные преимущества рекурсии:

  • естественность (натуральность) выражения сложных, на первый взгляд, алгоритмов.

  • рекурсивный алгоритм более читабелен в сравнении с итерационным;

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

Недостатки рекурсии состоят в следующем:

  • по сравнению с итерацией многократный вызов рекурсивной функции работает дольше. Это связано с тем, что при вызове рекурсивного метода его параметры копируются в стек. Также запоминаются временные значения локальных внутренних переменных. При завершении вызова рекурсивной функции предыдущие значения параметров вытягиваются из стека, что приводит к лишним операциям. Итерационный алгоритм для такой же задачи работает быстрее;

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