71. Enum üçin toString () usulyny ýok etmesek näme bolar?
Aşakdaky sanumyz bar diýeliň :public enum Role {
STUDENT,
TEACHER,
DIRECTOR,
SECURITY_GUARD;
}
Geliň, oňaString () jaň edip, okuwçyny konsolda görkezeliň :
System.out.println(Role.STUDENT.toString());
Konsolda netije:
72. Enumyň içinde konstruktor görkezmek mümkinmi?
Hawa, elbetde. Hut konstruktoryň üsti bilen içerki san üýtgeýjileriniň bahalary kesgitlenýär. Mysal hökmünde, her bir rol üçin ýaş aralygyny görkezmek üçin , öňki sanama iki meýdan goşalyň - ageFrom we ageTo :public enum Role {
STUDENT(5,18),
TEACHER(20,60),
DIRECTOR(40,70),
SECURITY_GUARD(18,50);
int ageFrom;
int ageTo;
Role(int ageFrom, int ageTo) {
this.ageFrom = ageFrom;
this.ageTo = ageTo;
}
}
73. == bilen deňdir () arasynda näme tapawut bar?
Это один из самых распространенных вопросов на собеседованиях на Java-разработчика. Начнём с того, что когда мы сравниваем простые значения (int, char, double…), мы делаем это через ==, так How переменные содержат конкретные значения и мы их можем сравнить. Да и примитивные переменные не являются полноценными an objectми — не наследуются от Object и не имеют метод equals(). Когда мы говорим о сравнении переменных, которые ссылаются на an objectы, то == будет сравнивать лишь meaning ссылок — на тот же an object они ссылаются or нет. И даже если один an object будет идентичен другому, сравнение через == даст отрицательный результат (false), ведь это другой an object. Как вы поняли, для сравнения ссылочных переменных используется метод equals(). Это один из стандартных методов класса Object, который нужен для полноценного сравнения an objectов. Но сразу стоит уточнить: для правильной работы этого метода его нужно переопределить, написав, How именно должны сравниваться an objectы данного класса. Если вы не переопределите метод, по умолчанию он будет сравнивать an objectы по ==. В IntelliJ IDEA можно переопределять его автоматически (средствами IDEA) —> alt + insert, в появившемся окошке выбираем equals() and hashCode() —> выбираем, Howие поля класса должны участвовать —> и вуаля, автоматическая имплементация методов выполнена. Вот пример того, How будет выглядеть автоматически сгенерированный метод equals для простейшего класса Cat с двумя полями — int age и String name:@Override
public boolean equals(final Object o) {
if (this == o) return true;
if (o == null || this.getClass() != o.getClass()) return false;
final Cat cat = (Cat) o;
return this.age == cat.age &&
Objects.equals(this.name, cat.name);
}
Если говорить о разнице == и equals для enum-ов, её особо и нет.Ведь enum хранит константы, и даже сравнивая через == аналогичные значения, мы будем получать true, так How ссылки будут всегда на одни и те же an objectы. Ну и при использовании equals у нас также будет правильно отрабатывать функционал, тем более если вы зайдёт в тело метода equals для enum-а, увидите, что в классе Enum реализация метода следующая:То есть внутри — старое доброе сравнение по linkм! Подводя итог: для enum сравнение и через ==, и через equals корректное.
74. What делает метод ordinal() в Enum?
При вызове метода int ordinal() на элементе enum-а мы получим порядковый номер с нуля этого значения в общем ряде перечислений. Давайте используем данный метод на одном элементе из предыдущего рассмотренного enum-а — Role:System.out.println(Role.DIRECTOR.ordinal());
Соответственно, в консоли выведется:
75. Можно ли использовать Enum c TreeSet or TreeMap в Java?
Использование enum типов в TreeSet и TreeMap допустимо. И мы можем написать:TreeSet<Role> treeSet = new TreeSet<>();
treeSet.add(Role.SECURITY_GUARD);
treeSet.add(Role.DIRECTOR);
treeSet.add(Role.TEACHER);
treeSet.add(Role.STUDENT);
treeSet.forEach(System.out::println);
И в консоли будет выведено:
76. Как связаны методы ordinal() и compareTo() в Enum?
Как было сказано ранее, ordinal() возвращает порядковый номер значения в общем списке перечислений. Также в разборе предыдущего вопроса вы увидели, что элементы перечислений, попав, например, в TreeSet (отсортированное множество) принимают порядок, в котором они объявлены в enum. И How мы знаем, TreeSet и TreeMap сортируют элементы посредством вызова у них метода compareTo() интерфейса Comparable. Из этого можно сделать предположение, что класс Enum имплементирует интерфейс Comparable, реализуя его в метод compareTo(), внутри которого и используется ordinal() для задания порядка сортировки. Зайдя в класс Enum, мы видим подтверждение этого:И тело самого метода:Метод ordinal() тут не вызывается. Вместо этого используется переменная ordinal — порядковый номер element в перечислении. Сам же метод ordinal() —— не более чем геттер для переменной ordinal.77. Напишите пример EnumM
В вопросах рассмотренных выше я уже приводил примеры enum-ов и не вижу смысла дублировать code (например, вопрос номер 72 про конструктор в enum).78. Можно ли использовать Enum в switch case?
Можно и нужно! Оглядываясь на свою практику, отмечу, что одним из наиболее частых мест применения enum являются логические конструкции типа switch. В таком случае вы можете предусмотреть все возможные вариации case, и после прописания логики для всех значений enum-а использование оператора default может даже не понадобиться! Ведь если вы используете String or числовое meaning, например, типа int, вам может прийти не предусмотренное meaning, что в свою очередь невозможно с использованием enum-а. Как бы выглядел switch для рассмотренного ранее примера:public void doSomething(Role role) {
switch (role) {
case STUDENT:
// некая логика для STUDENT
break;
case TEACHER:
// некая логика для TEACHER
break;
case DIRECTOR:
// некая логика для DIRECTOR
break;
case SECURITY_GUARD:
// некая логика для SECURITY_GUARD
break;
}
}
79. Как получить все имеющиеся значения в экземпляре Enum?
Если нужно получить все экземпляры перечисления, есть метод values(), который возвращает массив всех доступных значений определенного enum-а в естественно порядке (в порядке задания в enum). Пример:Role[] roles = Role.values();
for (Role role : roles) {
System.out.println(role);
}
В консоли будет вывод:
Stream API
80.What такое Stream в Java?
Java Stream — относительно новый способ взаимодействия с потоком данных, который в свою очередь позволяет более удобно и компактно обрабатывать большие данные, а также распараллеливать обработку данных между Howим-то количеством потоков, что может дать прирост в производительности в использующем функционале. Более глубоко данную тему в двух словах не рассказать, поэтому я оставлю здесь ссылку на статью, которая вам может погрузиться в данную тему.81. Назовите основные свойства транзакций
Тема называется — Stream API, но при этом вопрос по транзакции. Хмм… Для начала давайте разберемся, что такое транзакция. Транзакция — это группа последовательных операций с базой данных, которая представляет собой логическую единицу работы с данными. Транзакция может быть выполнена либо целиком и успешно, соблюдая целостность данных и независимо от параллельно идущих других транзакций, либо не выполнена вообще, и тогда она не оказывает ниHowого эффекта. Итак, у транзакций есть четыре основные свойства, которые сокращенно называют ACID. Давайте разберем, How расшифровывается каждая буква данного сокращения: A — Atomicity — атомарность — данное свойство гарантирует, что ниHowая транзакция не будет зафиксирована в системе частично. Будут либо выполнены все её подоперации, либо не выполнено ни одной (всё либо ничего). С — Consistency — согласованность — свойство, гарантирующее, что каждая успешная транзакция зафиксирует только допустимые результаты. То есть, это гарантия того, что при успешной транзакции будут выполнены все правила, ограничения которые предъявляет система к конкретным данным, иначе транзакция не будет выполнена и данные в системе вернутся к прежнему состоянию. I — Isolation — изолированность — свойство, которое говорит о том, что во время выполнения транзакции параллельные транзакции не должны оказывать влияния на ее результат. Это свойство ресурсозатратно, поэтому How правило оно выполняется частично, допуская определенные уровни изоляций, которые решают определенные изоляционные проблемы. Подробнее мы это обсудим в следующем вопросе.D — Durability — стойкость — данное свойство гарантирует, что если пользователь получил подтверждение от системы, что транзакция выполнена, он может быть уверен, что сделанные им изменения не отменятся из-за Howого-либо сбоя. То есть, вы можете быть уверены, что Howой-нибудь сбой операционной системы ничего не сделает с вашими данными, если вы уже получor подтверждение успешного выполнения вашей транзакции.82. Какие есть уровни изоляции транзакций?
Как я сказал ранее, обеспечение пункта ACID изолированности — ресурсозатратный процесс. Поэтому, это свойство выполняется частично. Есть различные уровни изолированности, и чем этот уровень выше, тем это более сильный удар по производительности. Перед тем How перейти к уровням изоляций транзакций, нам нужно рассмотреть различные проблемы недостаточной изолированности транзакций:-
фантомное чтение — при повторном вызове одной и той же выборки (одного и того же requestа) в рамках одной транзакции полученные данные различаются, что происходит из-за вставок данных другой транзакцией;
-
неповторяющееся чтение — при повторном вызове одной и той же выборки (одного и того же requestа) в рамках одной транзакции полученные данные различаются, что происходит из-за изменений (update) и удалений данных другой транзакцией;
-
грязное чтение — процесс чтения данных, добавленных or измененных транзакцией, которая впоследствии не подтвердится (откатится), т.е. чтение недействительных данных;
-
потерянное обновление — при одновременном изменении одних и тех же данных разными транзакциями теряются все изменения, кроме последнего (напоминает проблему “состояние гонки” в многопоточной среде).
Уровень изоляции | Фантомное чтение | Неповторяющееся чтение | Грязное чтение | Потерянное обновление |
---|---|---|---|---|
SERIALIZABLE | + | + | + | + |
REPEATABLE READ | - | + | + | + |
READ COMMITTED | - | - | + | + |
READ UNCOMMITTED | - | - | - | + |
NONE | - | - | - | - |
83. Какая разница между Statement и PreparedStatement?
И тут не сильно плавный переход на особенности технологии JDBC. Итак, для начала давайте разберемся, что вообще такое Statement. Это an object, который используется для формирования SQL requestов. В JDBC используется три его вида — Statement, PreparedStatement и CallableStatement. CallableStatement мы сегодня рассматривать не будем: поговорим о различии между Statement и PreparedStatement.-
Statement используется для выполнения простых SQL requestов без входящих, динамически вставляемых параметров. PrepareStatement используется с возможностью динамической вставки входных параметров.
-
Для задания параметров в PreparedStatement входные параметры в requestе прописываются How знаки вопроса, чтобы instead of них потом вставить некоторое meaning с помощью различных сеттеров, таких How setDouble(), setFloat(), setInt(), setTime()…. В итоге вы не вставите в request данные не того типа.
-
PreparedStatement “прекомпorрован” и использует кеширование, поэтому его исполнение может происходить немного быстрее, чем request из an objectов Statement. В результате SQL requestы, которые исполняются часто, в целях улучшения производительности создают в виде an objectов PreparedStatement.
-
Statement уязвим к SQL инъекциям, в то время How PreparedStatement предотвращает их. Подробнее об устранении SQL инъекций и других best practices в безопасности Java читайте в этой статье.
GO TO FULL VERSION