JavaRush /Java Blog /Random-TL /Pagsusuri ng mga tanong at sagot mula sa mga panayam para...

Pagsusuri ng mga tanong at sagot mula sa mga panayam para sa developer ng Java. Bahagi 11

Nai-publish sa grupo
Kamusta! Kahit na ang pinakamabilis na barko na walang landas ay aanod na lang sa alon. Kung binabasa mo ang aking artikulo ngayon, tiyak na mayroon kang layunin. Ang pangunahing bagay ay hindi lumihis, ngunit sundin ang iyong linya hanggang sa dulo - upang maging isang developer ng Java. Ngayon gusto kong ipagpatuloy ang aking pagsusuri sa 250+ na tanong para sa mga developer ng Java, na tutulong sa iyo na masakop ang ilan sa mga puwang sa teorya. Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 11 - 1

97. Ang mga kundisyon ba sa redefinition ng kasunduan ay ipinapataw kapag muling tinukoy ang Equals?

Ang overridden equals() na pamamaraan ay dapat sumunod sa mga sumusunod na kundisyon (mga panuntunan):
  • reflexivity - para sa anumang value x, ang isang expression tulad ng x.equals(x) ay dapat palaging magbabalik ng true (kapag x != null ).

  • symmetry - para sa anumang mga value ng x at y, ang isang expression ng form na x.equals(y) ay dapat magbalik ng true lamang kung ang y.equals(x) ay nagbabalik ng true .

  • transitivity - para sa anumang mga value ng x , y at z , kung ang x.equals(y) ay nagbabalik ng true at ang y.equals(z) ay nagbabalik din ng true , kung gayon ang x.equals(z) ay dapat magbalik ng true .

  • pagkakapare-pareho - para sa anumang mga halaga ng x at y, ang isang paulit-ulit na tawag sa x.equals(y) ay palaging ibabalik ang halaga ng nakaraang tawag sa paraang ito, sa kondisyon na ang mga patlang na ginamit upang ihambing ang dalawang bagay ay hindi nagbago sa pagitan ng mga tawag .

  • paghahambing null - para sa anumang halaga x, ang pagtawag sa x.equals(null) ay magbabalik ng false .

98. Ano ang mangyayari kung hindi mo na-override ang Equals at HashCode?

В таком случае hashCode() будет возвращать число, сгенерированное на основе ячейки памяти, в которой хранится данный an object. То есть два an object с совершенно одинаковыми полями при вызове непереопределенного hashCode() будут получать разные значения (ведь они хранятся в разных ячейках памяти). Непереопределенный equals() сравнивает ссылки — указывают ли они на один и тот же an object or нет. То есть сравнение идет через ==, и в случае с an objectми с одинаковыми полями будет всегда возвращать false. True будет только при сравнении ссылок на один и тот же an object. Иногда есть логика в том, чтобы не переопределять эти методы. Например, вы хотите чтобы все an objectы определенного класса были уникальными и переопределение этих методов только испортит логику уникальности. Главное — понимать нюансы переопределенных и непереопределенных данных методов и использовать оба подхода в зависимости от ситуации.

99. Почему симметричность выполняется, только если x.equals (y) возвращает true?

Немного странный вопрос. Если an object A equals an objectу B, то и an object B equals an objectу А. Если же B не equals an objectу A, то How возможно обратное? Это обычная логика. Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 11 - 2

100. What такое коллизия в HashCode? Как с ней бороться?

Коллизия в hashCode — это ситуация, в которой два разных an object имеют одинаковое meaning hashCode. Как это возможно? Дело в том, что hashcode отображается в типе Integer, который, в свою очередь, имеет диапазон от -2147483648 до 2147483647, то есть приблизительно 4 миллиарда разных целых чисел. Этот диапазон огромен, тем не менее, не бесконечен. Поэтому, возможны ситуации когда два совершенно разных an object имеют одинаковый хеш-code. Это весьма маловероятно, но возможно. Увеличивать частоту одинаковых хеш-codeов может еще плохо реализованная хеш-функция, которая будет, к примеру, возвращать числа в небольшом диапазоне, что увеличит шанс коллизий. Для борьбы с коллизией нужно иметь хорошую имплементацию метода hashCode, чтобы разброс значений был максимальным и шанс повторения значений был минимальным.

101. What будет, если элемент, участвующий в контракте с HashCode, изменит свое meaning?

Если элемент, который участвует в подсчете хеш-codeа был изменен, то и сам хеш-code an object будет изменен (при хорошей хеш-функции). Поэтому в HashMap рекомендуется использовать иммутабельные (неизменяемые) an objectы в качестве ключа, ведь их внутреннее состояние (поля) невозможно изменить после создания. Соответственно их хеш-code также не преобразуется после создания. Если же в качестве ключа использовать изменяемый an object, то при изменении полей данного an object изменится его хеш-code и How итог можно потерять данную пару в HashMap. Ведь она будет сохранена в бакете для первоначального хеш-codeа, а после изменения его поиск будет производиться в другом бакете. Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 11 - 3

102. Напишите методы Equals and HashCode для класса Student, который состоит из полей String name и int age

public class Student {
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 Student student = (Student) o;

   if (this.age != student.age) {
     return false;
   }
   return this.name != null ? this.name.equals(student.name) : student.name == null;
 }

 @Override
 public int hashCode() {
   int result = this.age;
   result = 31 * result + (this.name != null ? this.name.hashCode() : 0);
   return result;
 }
}
Equals:
  • Сперва мы сравниваем непосредственно ссылки, ведь если ссылки на один и тот же an object, Howой смысл продолжать проверку? Все и так будет true.

  • Проверка на null и на совпадение типов классов, ведь если an object — аргумент null or другого типа, то это значит, что an objectы не равны — false.

  • Приведение an object аргумента к одному типу (вдруг это был an object родительского типа).

  • Сравнение примитивного поля класса (ведь для него достаточно сравнения через =!), если поле не равно — false.

  • Проверка непримитивного поля на null и на equalsString метод переопределен и будет корректно сравнивать), если же оба поля null, либо equals, то проверка заканчивается и метод возвращает true.

HashCode:
  • Задание начального значения хеш-codeа равным примитиву age an object.

  • Умножение текущего хеш-codeа на 31 (для большего разброса) и добавление к нему хеш-codeа непримитивного строкового поля (если оно не null).

  • Возвращение результата.

  • В результате такого переопределения хеш-codeа an objectы с одинаковыми значениями name и int всегда будут возвращать одно и тоже meaning.

103. В чем разница применения if (obj instanceof Student) и if (getClass () == obj.getClass ())?

Давайте разберемся, что делает каждый подход:
  • instanceof проверяет, является ли link на an object с левой стороны экземпляром типа с правой стороны or некоторым его подтипом.

  • getClass() == ... проверяет идентичность типов.

То есть, если getClass() проверяет полную идентичность класса, то instanceof вернет true даже если an object будет всего лишь подтипом, что может дать нам большую гибкость при активном использовании полиморфизма. Собственно, оба подхода хороши, если понимать особенности их работы и применять в нужных местах.

104. Дайте краткую характеристику метода clone ().

Clone() — метод класса Object, преднаmeaningм которого — создание и возвращение клона текущего an object (копии текущего an object). Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 11 - 4Для его использования необходимо имплементировать интерфейс маркер Cloneable:
Student implements Cloneable
И переопределить сам метод clone():
@Override
protected Object clone() throws CloneNotSupportedException {
 return super.clone();
}
Ведь в классе Object он protected, то есть будет виден только в самом классе Student, но не виден для классов извне.

105. В чем заключается особенность работы метода clone () с полями an object типа ссылки?

При клонировании an objectов копируются только примитивные значения и meaning ссылок на an objectы. Это значит, что если an object имеет во внутреннем поле ссылку на другой an object, то будет клонирована только эта link, сам же этот другой an object клонирован не будет. Собственно, это и называют — поверхностным клонированием. Ну а что, если вам нужно полноценное клонирование с клонированием всех вложенных an objectов? Как сделать, чтобы это были не копии ссылок, а полноценные клоны an objectы с другими занимаемыми ячейками памяти в куче? На самом деле все довольно просто — для этого вам нужно в каждом классе этих внутренних an objectов также переопределить метод clone() и добавить интерфейс маркер — Cloneable. Тогда будут скопированные не ссылки на an objectы, а сами an objectы, ведь теперь они тоже имеют возможность копировать себя.

Exceptions

106. В чем разница между error и exception?

Как исключения, так и ошибки являются подклассами класса Throwable. Тем не менее, они имеют свои различия. Ошибка указывает на проблему, которая в основном возникает из-за нехватки системных ресурсов. И наше приложение не должно обнаруживать эти типы проблем. Некоторые из примеров ошибок — сбой системы и ошибка нехватки памяти. Ошибки в основном возникают во время выполнения, так How они относятся к непроверенному типу. Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 11 - 5Исключения — это проблемы, которые могут возникнуть во время выполнения и во время компиляции. Как правило это происходит в codeе, написанном разработчиками. То есть exception более предсказуемые и более зависящие от нас How от разработчиков. В это же время errors более случайны и более независимы от нас, а скорее зависимы от неполадок самой системы, в которой работает наше приложение.

107. Какая разница между checked и unchecked, exception, throw, throws.

Как я и сказал ранее, exception — это ошибка во время выполнения программы и во время компиляции, которая произошла в написанном разработчике codeе (из-за некой нештатной ситуации). Checked — вид исключений, которые нужно всегда обрабатывать посредством использования механизма — try — catch or пробрасывать в методы выше. Throws используется в заголовке метода для обозначения возможных брошенных исключений данным методом. То есть это и есть механизм “проброски” исключений в методы выше. Unchecked — вид исключений, которые не нужно обрабатывать, они, How правило, менее предсказуемы и менее вероятны. Тем не менее, по желанию их тоже можно обработать. Throw используется, при ручном броске исключения, например:
throw new Exception();

108. Какова иерархия исключений?

Иерархия исключений весьма велика обширна, даже слишком, чтобы о ней вот тут так все рассказать. Поэтому, мы рассмотрим лишь ключевые ее звенья: Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 11 - 6Тут на самом верху иерархии мы видим класс — Throwable — общий класс, предок иерархии исключений, который в свою очередь делится на:
  • Error — критические, непроверяемые ошибки.
  • Exception — проверяемые исключения.
Exception делится на различные непроверяемые runtime исключения и разнообразные проверяемые исключения.

109. What такое checked и unchecked exception?

Как я раньше и говорил:
  • Checked — исключения, которые вы обязаны How-то обработать, то есть либо обработать в блоке try — catch, либо “пробросить“ в метод выше. Для этого в сигнатуре метода после перечисления аргументов метода нужно использовать ключевое слово trows <тип исключения>, которое указывает для пользователей метода, что метод может кинуть данное исключение (что-то вроде предупреждения) и передаст обязанность обрабатывать исключение уже для пользователей сего метода.

  • Unchecked — исключения, которые обрабатывать не нужно, так How они не проверяются во время компиляции и, How правило, более непредсказуемые. То есть, основная разница с checked в том, что для них эти механизмы try — catch or пробрасывания работают также, но они не являются обязательными.

101. Напишите пример перехвата и обработки исключения в блоке try — catch метода

try{                                                 // начало блока перехвата
 throw new Exception();                             // ручной бросок исключения
} catch (Exception e) {                              // данное исключение и его потомки будут перехватываться
 System.out.println("Упс, что-то пошло не так =("); // вывод некоторого исключения в консоль
}

102. Напишите пример перехвата и обработки исключения с использованием собственных исключений

Сперва напишем свой класс исключения, который наследуется от Exception и переопределим ему конструктор с сообщением ошибки:
public class CustomException extends Exception {

 public CustomException(final String message) {
   super(message);
 }
}
Ну а далее бросим его вручную и перехватим How и в предыдущем вопросе:
try{
 throw new CustomException("Упс, что-то пошло не так =(");
} catch (CustomException e) {
 System.out.println(e.getMessage());
}
И опять же при запуске вы получите вывод в консоль:
Упс, что-то пошло не так =(
Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 11 - 7Подробнее с исключениями можно познакомиться вот тут. Ну а на этом сегодня все! До встречи в следующей части!
Другие материалы серии:
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION