Тестовое собеседование Java разработчика #24 - Никита Ким
Vložit
- čas přidán 4. 07. 2024
- Кандидат - будущий Java разработчик - Никита Ким.
Никита изучает Java стек и планирует в ближайшее время стать backend инженером.
Материалы для разработчиков:
proselyte.net/
Телеграмм канал для общения:
t.me/pse_club
00:00:00 Знакомство
00:01:33 Что мы знаем о методе main?
00:04:18 Что такое массивы в Java?
00:06:14 Какой класс реализует динамический массив в Java, и что мы можем про него рассказать?
00:12:22 За счет чего NIO обеспечивает неблокируемый доступ к ресурсам?
00:14:00 Как работает CopyOnWriteArrayList
00:15:00 Что такое Stream в контексте Stream API?
00:16:18 Какие отличия между методами map и flatMap?
00:19:15 Что такое функциональный интерфейс?
00:20:03 Что такое лямбда?
00:24:00 Что такое ExecutorService, для чего он нужен и какие реализации у нас есть?
00:25:45 Что “скрывается под” буквой O в SOLID?
00:27:19 Какие отличия между шаблонами ООП Стратегия и Состояние?
00:28:13 Решение алгоритмической задачи
00:41:33 Что такое группировка в БД? Примеры.
00:49:00 Что такое ORM и какие есть реализации?
00:50:14 Какие уровни кэширования есть в Hibernate?
00:53:05 Как происходит запуск Spring Boot приложение?
00:55:10 В чем разница между юнит и интеграционными тестами?
00:57:07 Что такое Docker?
00:58:02 В чем отличия между Docker и виртуальной машиной?
00:58:49 Ответы на вопросы кандидата.
00:59:23 Финал.
не бывает сортировки за log(n), лучший алгоритм как раз n*log(n)
Да, вы правы - здесь ошибка.
Сложность по времени - N log N
Сложность по памяти log N
Спасибо за уточнение.
Уточнение. За O(n*log(n)) отрабатывают сортировки сравнением. Есть такие алгоритмы сортировки подсчетом, как Counting Sort и Radix Sort, которые могу отработать за O(n) при определенных ограничениях на входные данные (диапазон значений, символьная длина значений). Буду рад уточнению на свой комментарий
@@LacqueredNoCap
Спасибо за комментарий :)
Если мы говорим про числа, и конечно radix sort будет лучше. В то время, как тот же quickSort - универсальный алгоритм.
Евгений, спасибо за Ваш труд👍👍👍
Хотел бы пожелать всем удачи и терпения💪👍👍
@@user-bn9wc8db6s спасибо за отзыв!
Не успел посмотреть ролик!!!
Но нет сомнений в качестве!!!
Просто Евгению с ходу ЛАЙКОС👍👍👍
Спасибо за комментарий :)
Спасибо большое, Евгений, что снова начали делаеть видео и писать статьи на сайте . Очень понравилось про jvm и volatile 😊
Спасибо за отзыв :)
Евгений, в очередной раз спасибо.
Классные вопросы подбираешь.
Есть что мне нужно повторить и более детально разобрать.
Спасибо за отзыв :)
Главная страница на ютюбе в роликах Евгения - это прекрасно, значит ролики идут стабильно.
В целом у меня это проф деформация какая то.
когда на главной только видео по жаве и расту чувствую себя комфортно ))
Евгений, вы знаете,что делаете большое дело. Спасибо!
Не пропадайте пожалуйста
Большое спасибо за отзыв :)
Каждое видео - на вес золота для начинающих! Спасибо за труды, сенсэй!)
Спасибо за отзыв :)
Евгений, здравствуйте. Готов снять свою шапку, скажу более - свой мозг, перед Вашим терпением...... Парнишка очень волновался, но все-таки думаю, что ему нужно больше решать логических задач на смекалку и упорядочение мышления..... И еще раз убеждаюсь, что не все очевидное является целесообразным. Понимание того, как работает комп необходимо..... Благодарю Вас за Ваше потраченное время. получил удовольствие от Вашего урока...
Спасибо за отзыв!
И операционные системы и модель OSI тоже не помешает
Спасибо большое за отличные ролики.
Спасибо за отзыв!
Спасибо за видео :)
Спасибо за отзыв :)
Спасибо вам большое!
Спасибо за отзыв!
огонь 🔥🔥🔥
Спасибо
Спасибо за видео!
Спасибо за отзыв!
Интервью очень понравилось) Никита крут
Также было видно эмоции/реакции Евгения, в этот момент понимаешь, правильно ли отвечает Никита. Особенно с вопросом про docker, что это виртуальная машина. Ведь у Евгения есть отдельное видео посвящённое Docker'у, где он специально подчеркивал, что Docker - не виртуальная машина =)
Спасибо за видео, жду новое)
Спасибо за отзыв :)
Спасибо за видео!Видно было что Никита переживал) особенно на sql.Сразу вспомнил себя на первых собеседованиях.
Спасибо за отзыв :)
Спасибо большое
Спасибо за отзыв!
гарне інтерв'ю. Дякую за роботу
Дякую за коментар!
дякую за відео, освіжають память та можна дізнатись прогалини в своїх заннях)
Дякую за відгук :)
Спасибо
Спасибо за комментарий!
Реакция на ответ на 42:26 топ )))
Интересно и познавательно смотреть. Парень неплохо отвечал, но очень сильно посыпался на SQL, там надо либо подучить я думаю, тема не такая сложная, либо просто освежить память т к он хорошо давал ответы на другие более сложные вопросы)
Спасибо за отзыв :)
Топ )
20:24:00 поправь плз )
Сделано, спасибо за исправление :)
Вопрос: каков ваш фидбек? На момент интервью вы бы взяли такого инженера на позицию Junior, если нет то что нужно подтянуть, мне почему то кажется что до февраля 2022 с таким уровнем и на junior+ можно было устроиться, сейчас требования растут постоянно.
На позицию trainee-junior позицию вполне можно брать кандидата. Немного подтянуть некоторые моменты - и можно было бы ставить на проект.
Евгений, частные уроки даёте?
"Ответил в ЛС" © :)
Если серьезно - напишите. пожалуйста, на почту proselytear@yahoo.com или telegram: @proselyte
Сможем обсудить более детально.
На 27:16. Можете пояснить почему мы нарушаем принцип Лисков, ведь класс другой и метод новый (не наследуемый). В этом классе же все методы родителя остаются и можно подставлять объект класса вместо родителя, не пойму в чем потенциальная опасность. Да и в чем тогда смысл наследования если не могу метод добавить)
Если в данном примере мы обращаемся к объекту класса В по интерфейсу класса А, то LSP не нарушается. Потенциально может быть нарушен SRP, если новый метод будет предназначен для взаимодействия с другим актором
Мы не нарушаем - мы потенциально можем его нарушить, но для этого нужно очень постараться.
Пример, есть 3 класса
A
B extends A
C extends A
В класс C мы добавляем публичный метод test100500 и в классе-клиенте "завязываемся" на него. После этого - заменить C классом B без рефакторинга мы уже не сможем.
@@EugeneSuleimanov Спасибо за пояснение. Я вроде так и представлял, что в задании имелось в виду. Представлял принцип Лисков, как вместо родителя пихаем наследника, а вместо наследника пихать родителя это ваще что-то другое и так не надо никогда)
@@EugeneSuleimanov Пример хороший, но он не относится к LSP, т.к. B и C не связаны между собой иерархией наследования, а LSP как раз про это
@@LacqueredNoCap но они связаны с классом А, если я не ошибаюсь - это относится к LSP
Есть пара вопросов к реализации проверки на палиндром. Или я чего-то не понимаю, или нет перехода к единому регистру, ведь по условию 'f' и 'F' -- одинаковые буквы, но в вашей реализации они будут считаться различными. Также, по первому примеру видно, что пробельные символы вообще учитываться не должны, но в вашей реализации это не учитывается, т.е., я предполагаю, что на первый пример будет выведено false даже если бы в нём все буквы были одного регистра
Также, условие в цикле while можно сделать строгим
Спасибо за видео, кину мою реализацию алгоритма)
public static boolean isPalindrome(String s) {
for (int i = 0; i < s.length() / 2; i++)
if (s.charAt(i) != s.charAt(s.length() - i - 1))
return false;
return true;
}
Спасибо за отзыв :)
Еще нужно не забыть добавить исключение всех небуквенных значений из строки и приведение ее к одному регистру. Я бы сделал стандартно через Java API: String generalizedString = s.toLowerCase().replaceAll("[^a-z]", "");
@@LacqueredNoCap Вообще написано, что эти чары содержат как буквы, так и числа.
Objects.requireNonNull(s);
String result = s.toLowerCase()
.replaceAll("[^a-z0-9]", "");
if (result.isEmpty() || result.length() == 1) {
return true;
}
return new StringBuilder(result)
.reverse()
.toString()
.equals(result);
Ну или можно сделать с циклом, первое решение с ним и сделал.
Я когда решение парня увидел, подумал, что может я чего-то не понял и нагородил xD Ан нет)
А почему тогда в хешмапе при 0.75 увеличиваем по той же логике, что остальные будут простаивать!? Типа запас на неточность хэшкода!?
Потому что при большом количестве заполненных бакетов мы начинаем терять время на поиск бакета для нового хешкода. Поэтому имеет смысл расширять при заполнении 75%.
В динамическом массиве такой необходимости просто нет :)
@@EugeneSuleimanov а разве индекс банкета не однозначно определяется хэшкодом?
@@MrRomanvideo да, вы правы. Нужно было написать - новый хеш-код :)
Так тут же вопрос производительности. Если делать лод фактор, равный 1, то к моменту заполнения всех корзин мы все чаще будем поучать коллизии. И наоборот, если сделать это значение, например 0,5, то будем терять время на неоправданно частом перестроении структуры. 0,75 - оптимальный коэффициент
Евгений, простите за беспокойство. У меня есть вопрос по многопоточности... Никто не смог на него определенно ответить. Если не будете против, хотел бы задать его Вам..... СПС))))))
Конечно - пишите сюда иди в ТГ - попробую помочь :)
@@EugeneSuleimanov СПС. Вопрос будет длинный
это собеседование джуна :?
Да, верно
Жень, вот совсем не круто записывать видео с русскими в то время, когда война в твоей стране.
Я понимаю, что они могут никакого отношения не иметь к происходящему и вообще "протиф путина", но все же это слегка аморально и цинично с твоей стороны помогать им в данный момент.
Hi! Good job 👍 It’s interesting 😎
Thank you :)
Thank you :)
мое убогое решение😪
class Palindrome {
public static boolean isPalindrome(String str) {
Pattern pattern = Pattern.compile("\\w");
Matcher matcher = pattern.matcher(str);
StringBuilder stringBuilder = new StringBuilder();
while (matcher.find()) {
String newStr = matcher.group().toLowerCase();
stringBuilder.append(newStr);
}
String s = stringBuilder.toString();
for (int i = 0, k = s.length()-1; i < s.length() / 2; i++, k--) {
if (s.charAt(i) != s.charAt(k))
return false;
}
return true;
}
public static void main(String[] args) {
System.out.println(isPalindrome("A car, A plan: A Panama")); //false
System.out.println(isPalindrome("A c, A")); //true
System.out.println(isPalindrome(" ")); //true
}
}
ps. нет времени учить теорию наизусть, ментор задачами заваливает. когда смотрю, как ребята отвечают на вопросы, типа буква О в SOLID грусть, тоска, депрессия подкрадывается, времени не хватает на это учить пока что, но чтобы поднять настроение, вспоминаю, что опытные программисты создавали RUTUBE ))))))
Спасибо за комментарий!
Если мы выделяем StringBuilder - проще просто вызвать у него reverse и сравнить строки после удаления «лишних» символов :)
@@EugeneSuleimanov сорян, стараюсь руку набить на Pattern/Matcher)
Странное ощущение когда со всем этим работаешь а территорию знаешь хуже😂.
Это норма :)