Процедурная Java Flashcards

1
Q

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

A

В Java существует 8 примитивных типов данных:

byte (целые числа, 1 байт)
short (целые числа, 2 байта)
int (целые числа, 4 байта)
long (целые числа, 8 байтов)
float (вещественные числа, 4 байта)
double (вещественные числа, 8 байтов)
char (символ Unicode, 2 байта)
boolean (значение истина/ложь, 1 байт)
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Что такое char?

A

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

Есть три способа присвоить литералу значение типа char, и все три требуют включения значения в одинарные кавычки:

  • используя один печатный символ на клавиатуре (например ‘&’).
  • используя формат Unicode с шестнадцатеричной нотацией (например, ‘\u0061’, который эквивалентен десятичному числу 97 и идентифицирует символ ‘a’).
  • используя специальный escape-символ (например, ‘\n’ который указывает символ перевода строки).
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Сколько памяти занимает boolean?

A

В современных архитектурах ЭВМ байт является минимальной адресуемой единицей хранения информации. Т. е. Каждый байт имеет свой адрес в RAM, по которому с ним можно работать. Действительно, для хранения булева значения, достаточно одного бита, но получить к нему доступ именно к этому биту в RAM сразу невозможно.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

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

A

Обёртка над необъектным типом (boxed type) — объектный тип данных, призванный хранить значение необъектного типа.
Объекты классов-оберток являются неизменяемыми (Immutable).
- Локальные примитивы хранятся в стеке. Коллекции хранят свои значения через ссылку на ячейку памяти объекта в куче.
Зачем
-Разрешает значения null.
-Может использоваться в коллекции, например List, Map и т.д.
-Может использоваться в методах, которые принимают аргументы типа Object.
-Может быть создан как объекты с помощью new ClassName(), как и другие объекты:
-Делает доступными все функции класса Object, такие как clone(), equals(), hashCode(), toString() и т.д.

Классы Wrapper могут быть созданы двумя способами:

Использование конструктора:

Integer i = new Integer("1"); //new object is created
Использование valueOf() статических операторов:

Integer i = Integer.valueOf(“100”); //100 is stored in variable
Рекомендуется использовать второй способ создания классов-оболочек, поскольку он занимает меньше памяти, поскольку новый объект не создается.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Что такое автоупаковка и автораспаковка?

A

Автоупаковка - это механизм неявной инициализации объектов классов-оберток значениями соответствующих им исходных примитивных типов без явного использования конструктора класса.
Автоупаковка происходит при прямом присваивании примитива классу-обертке (с помощью оператора =), либо при передаче примитива в параметры метода (типа класса-обертки).
Точно так же переменной примитивного типа можно присваивать объект класса-обертки. Этот процесс называется автораспаковкой (autounboxing).

Автоупаковка переменных примитивных типов требует точного соответствия типа исходного примитива типу класса-обертки. Например, попытка упаковать переменную типа byte в Short, без предварительного явного приведения byte в short вызовет ошибку компиляции.
Автоупаковка констант примитивных типов допускает более широкие границы соответствия. В этом случае компилятор способен предварительно осуществлять неявное расширение/сужение типа примитивов:
неявное расширение/сужение исходного типа примитива до типа примитива соответствующего классу-обертке (для преобразования int в Byte, сначала компилятор самостоятельно неявно сужает int к byte)
автоупаковку примитива в соответствующий класс-обертку. Однако, в этом случае существуют два дополнительных ограничения: a) присвоение примитива обертке может производится только оператором = (нельзя передать такой примитив в параметры метода без явного приведения типов) b) тип левого операнда не должен быть старше чем Character, тип правого не должен старше, чем int: допустимо расширение/сужение byte в/из short, byte в/из char, short в/из char и только сужение byte из int, short из int, char из int. Все остальные варианты требуют явного приведения типов).
Дополнительной особенностью целочисленных классов-оберток созданных автоупаковкой констант в диапазоне -128 … +127 является то, что они кэшируются JVM.
Поэтому такие обертки с одинаковыми значениями будут являться ссылками на один объект.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Что такое явное и неявное приведение типов? В каких случаях в java нужно
использовать явное приведение?

A
Приведения типов:
Тождественное (identity).
Расширение (повышение, upcasting) 
Сужение (понижение, downcasting)
Неявное преобразование типов выполняется в случае если выполняются условия: Оба типа совместимы Длина целевого типа больше или равна длине исходного типа. Во всех остальных случаях должно использоваться явное преобразование типов.

Расширение объектного типа (widening reference). Означает неявное восходящее приведение типов или переход от более конкретного типа к менее конкретному, т.е. переход от потомка к предку. Разрешено всегда и происходит Автоматически.Сужение объектного типа (narrowing reference). Означает нисходящее приведение, то есть приведение от предка к потомку (подтипу). Возможно только если исходная переменная является подтипом приводимого типа. При несоответствии типов в момент выполнения выбрасывается исключение ClassCastException. Требует явного указания типа.
Преобразование к строке (to String). Любой тип может быть приведен к строке, т.е. к экземпляру класса String.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Что такое пул интов?

A

Для более эффективного использования памяти. Когда мы создаем Integer объект не используя new, объект помещается в пул, и в последствии, если мы захотим создать такой же объект (не используя new), новый объект создан не будет, а мы просто получим ссылку на наш объект их пула. Integer pool от -128 до 127

public class Temp {
    public static void main(String []args){
        Integer i1 = 10;
        Integer i2 = 10;
        System.out.println(i1 == i2);
    }
}
Как думаете, что он напечатает? А напечатает он true.

А вот еще один код:

public class Temp {
    public static void main(String []args){
        Integer i1 = 130;
        Integer i2 = 130;
        System.out.println(i1 == i2);
    }
}
Этот код уже выведет false.

На первый взгляд странно, не так ли? Сейчас объясню.

В Java есть пул(pool) целых чисел в промежутке [-128;127]. Т.е. если мы создаем Integer в этом промежутке, то вместо того, чтобы каждый раз создавать новый объект, JVM берет их из пула. Таким образом, в первом примере i1 и i2 указывают на один и тот же объект из пула, а во втором - создаются два разных объекта. Отсюда и результат. Стоит заметить, что в приведенных выше примерах не использовалось ключевое слово new.

Пример:

public class Temp {
    public static void main(String []args){
        Integer i1 = new Integer(10);
        Integer i2 = new Integer(10);
        System.out.println(i1 == i2);
    }
}
Результатом будет false. Тут мы уже явно говорим, что хотим создать новый(new) объект, так что ссылки разные.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Какие нюансы у строк в Java?

A
  • Все строковые классы — final (следовательно от них нельзя унаследоваться).
  • String является неизменяемым (immutable) созданный объект класса String не может быть изменен.
  • Для экономии памяти JVM хранит строки в пуле строк. При создании новой строки JVM проверяет ее значение и указывает на существующий объект. Если в пуле нет строки с этим значением, то JVM создаёт новую строку.
  • Оператор “==” сравнивает ссылки на объект. Метод equals() сравнивает значения строк. То же правило будет применяться ко всем объектам.
  • При использовании оператора new будет создана новая строка в хипе (Прим. переводчика — в оригинале написано, что в пуле, но это не так, спасибо zagayevskiy), даже если есть строка с тем же значением.

Изменяемые:
StringBuffer может быть использован в многопоточных средах, так как все необходимые методы являются синхронизированными.
StringBuilder, который работает намного быстрее в большинстве реализаций. Единственное отличие — StringBuilder не синхронизирован. Это означает, что его использование в многопоточных средах нежелательно.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Что такое пул строк?

A

Пул строк (string pool) в Java, как понятно из описания, это некий пул (или список) объектов класса String, который хранится в специальном месте кучи (Java Heap).
Когда мы создаем строку через присваивание - сначала происходит поиск по пулу строк. И если там уже найдена такая строка - то присваивается ссылка на уже созданный объект
Если создавать строку через new() то будет создан новый объект в куче.
Но мы можем попросить поискать существующий объект
String a = new String(“abc”).intern();
В данном случае, если у нас уже есть такая строка в пуле строк, то будет возвращена ссылка на строку из пула строк, и новый объект создан не будет.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Почему не рекомендуется изменять строки в цикле? Что рекомендуется
использовать?

A

Строки не изменяемы (immutable). Каждый раз создается объект строки заново.

Выполняется целых 3 операции: создается StringBuilder на основе строки s, вызывается метод конкатенации append, после конкатенации вызывается метод toString

Использовать StringBuilder и StringBuffer.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

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

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Почему String неизменяемый и финализированный класс?

A

Причины неизменяемости String в Java это безопасность и наличие пула строк (String pool):

  • можно передавать строку между потоками не опасаясь, что она будет изменена
  • отсутствуют проблемы с синхронизацией потоков
  • отсутствие проблем с утечкой памяти
  • отсутствие проблем с доступом и безопасностью при использовании строк для передачи параметров авторизации, открытия файлов и т.д.
  • её hashcode кэшируется в момент создания и нет никакой необходимости рассчитывать его снова.
  • Экономия памяти при использовании пула строк для хранения повторяющихся строк.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Почему строка является популярным ключом в HashMap в Java?

A

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

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Что делает метод intern() в классе String?

A

Этот метод всегда возвращает строку, которая имеет то же значение, что что и текущая строка, но гарантирует что это будет строка из пула уникальных строк.
Если пул строк уже содержит строку, эквивалентную к нашему объекту, что подтверждается методом equals(Object), тогда возвращается ссылка на строку из пула. В противном случае объект строки добавляется в пул и ссылка на этот объект возвращается.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Можно ли использовать строки в конструкции switch?

A

Java7 расширяет возможности оператора switch для использования строк, ранние версии Java не поддерживают этого.

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

Можно использовать оператор switch, если используете Java7 или поздние версии.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Какая основная разница между String, StringBuffer, StringBuilder?

A

String – неизменяемая строка.

StringBuffer — потокобезопасная изменяемая строка.

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

17
Q

Существуют ли в java многомерные массивы?

A

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

18
Q

Какими значениями инициируются переменные по умолчанию?

A

Числа инициализируются 0 или 0.0. Объекты (в том числе String) – null, char – \u0000; boolean – false.

19
Q

Что такое сигнатура метода?

A

Весь код, который описывает метод, называется объявлением метода. Сигнатура метода включает название метода и типы параметров в определенном порядке. Имя плюс типы параметров (упорядоченные). Сигнатура однозначно идентифицирует метод.

Возвращаемое значение не входит в сигнатуру, а порядок следования параметров – входит.

20
Q

Расскажите про метод main

A

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

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

Можно передавать параметры в program arguments.

Ключевое слово public означает, что метод main() доступен везде, где доступен содержащий его класс. Ключевое слово static означает, что метод является статическим, т. е. не требует для своего вызова наличие экземпляра класса. Ключевое слово void означает, что метод не возвращает никакого значения. Все эти три слова обязательно должны присутствовать в описании метода.

21
Q

Каким образом переменные передаются в методы, по значению или по ссылке?

A

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