Что сказать на собеседовании программиста java. Пособие для будущего Java разработчика. Собеседование и карьера. Во время работы
Сила - это река, из которой могут пить многие, и обучение джедая - не единственная возможность зачерпнуть из неё». - Люк Скайуокер Все подборки книг остались позади. Что из них читать, что нет - решать только вам. Сейчас у вас осталась одна-единственная цель: устроиться на работу и построить карьеру, не наступая на грабли. Последняя статья разделена на разделы: - До работы - Собеседование - Во время работы В этой части очень много моего личного мнения, поэтому прошу не вырывать фразы из контекста и относиться к ней как к откровенному разговору со старым приятелем:).
До работы
Ниже - десяток самых популярных клише, которые возникают, когда душа тянется к программированию, но человеку мешают те или иные обстоятельства. Моя задача - попробовать остановить вашу мнительность и настроить вас на позитивный образ мышления. Если вы читаете эту статью - вы дальше, чем вы думаете! Ментально вы уже там, где нужно, а если прочитали уже некоторые книги, то полпути уже пройдено. Поэтому перестаньте сомневаться, - это удел слабых. Только вперед! Уже лучше? Тогда поехали! «У меня нет образования» Когда я совсем зеленый поступал в академию одной из крупных аутсорсинговых фирм, интервьюеры мне мягко намекнули, что диплом их вообще не интересует, поэтому вопросы были конкретные - по ООП и по базовой Java. Конечно, вы встретите вакансии, где наличие тех. образования будет четким требованием. Я лишь хочу сказать, что его отсутствие - это не препятствие в наши дни. Во многих зарубежных конторах просят BS/MS Computer Science или, внимание, relevant experience. Не убедительно? Возможно, вас воодушевит тот факт, что технического образование нет у меня;), но это абсолютно не помешало получить в опыт в крупных компаниях. Спросите меня сейчас, как я поступил бы, если бы можно было перемотать пленку назад? Конечно пошел бы в КПИ/НАУ, но не особо горевал бы, не поступив. Перестаньте париться по этому поводу. Пройдет время - можно и в 40 получить корочку, если вам захочется, - а пока сфокусируйтесь на том, чтобы стать junior разработчиком здесь и сейчас. «Там будут люди умнее меня» Всегда будут люди умнее, смышленее, гибче, талантливее, чем вы, и любая работа - не исключение. Этот факт абсолютно не дает вам права отходить от цели. Возможно, где-то на другом конце Земного шара сидит маленький мальчик из Японии, который умножает и делит числа быстрее вас, а какая-то бабушка из Чехии печатает на клавиатуре мобильного телефона быстрее любого тинейджера. Но вы же не задумываетесь об этом, верно? Так почему тогда вас должны волновать люди, с которыми вы будете работать, когда устроитесь? В чем-то ваши будущие коллеги будут вас превосходить, в чем-то будут вам проигрывать. Это нормально! Вычеркиваем. «Мне кажется, я не смогу» Ну, во-первых, никто не сказал, что будет легко, но это совершенно не означает, что ваша цель неосуществима. Вам ничего не мешает просто-напросто попробовать, даже если вы сейчас работаете бухгалтером или продавцом-консультантом. Приходите после рабочего дня и садитесь за учебу. Если через время вы видите какой-то прогресс - это знак, что вы движетесь в правильном направлении. Не останавливайтесь! Если вам это хоть немножко интересно и вам это дается, тогда я не знаю ни одного пункта, который мог бы переубедить меня в том, что вы не достойны этого. «Меня накрывает лень» Лень - это всего лишь отсутствие мотивации. Если вы замечаете, что большую часть свободного времени вместо того, чтобы учиться и не отбиваться от курса вы, тупо занимаетесь фигней - я спешу вас уведомить о том, что, скорее всего, работа программиста - это не ваше. По крайней мере, не сейчас. Некоторые называют лень грехом, болезнью, холерой современного века вместе с ожирением. Оставьте это дело карьерным истеричкам. На мой взгляд, всё вокруг в этой жизни пропитано иллюзией борьбы и конкуренции: кто выше, кто сильнее, кто богаче. У кого машина покруче, у кого в коллективе зарплата больше, кто в спортзале жмет штангу потяжелее, кто из девушек раньше вышел замуж и завел детей - от этого тошнит, как от вонючего фаст-фуда. Люди перестали жить и радоваться жизни, следуя своей мечте, променяв свою зону комфорта на выбор между Pepsi и Coca-Cola. Для меня лень - это хорошо, это просто замечательно. Это обыкновенная защитная функция вашего организма экономить силы и время на бесполезные для него вещи. Человек создан быть свободным, поэтому если вы ленитесь - перестаньте стараться поднимать вашу пятую точку с дивана - возможно, она сейчас на своем месте:). «Я иду туда из-за денег» Если собрать разработчиков и сказать: отныне ваша зарплата будет 3-4к гривен для любого уровня, а тестировщики как будут получать те же рейты, так и останутся, то вопрос будет в другом: не то, скольких бомбанет, а то, сколько программистов после этой новости останутся именно программистами. Много людей лезут в IТ из-за бабла. Зарплата в переводе с баксов, сыры и дорогая зеркалка. Сколько я ни работал с людьми, всегда проскальзывали разговоры по этому поводу. Я не говорю, что это плохо, я лишь хочу, чтобы вы не пытались себя уговаривать, что вы из чисто духовных целей идете, чтобы изменить мир к лучшему. Прежде чем устроиться джуниором, я знал, какие зарплаты у сеньоров, техлидов - да даже у миддла, - и эти мысли только воодушевляли: я в свое время до работы программистом о таких цифрах мог только мечтать. Называйте эти вещи своими именами и перестаньте этого стыдиться. «Мне кажется, это не мое» А чье тогда? Вы знаете, это легко проверить. Откройте первый том Хортсманна и начните читать, писать код из примеров. Если вам не нудно и вы не топчетесь на одной и той же главе вторую неделю - отбросьте сомнения. Изучение технических специальностей - штука последовательная. Нельзя перейти к B, не зная А, но у вас всегда будет шанс вернуться на главу назад и укрепить фундамент. Дерзайте. «Таких, как я, много» Всегда есть конкурс на место. Я не спорю, к примеру, сейчас тестировщиков без опыта эта цифра - 300-400, а то и больше на одно место. Да, это горькая правда, но, с другой стороны, я даже с такими показателями не могу найти достаточно серьезного пункта. Да хоть 100500 на место!! У вас всегда есть возможность наработать опыт на своих проектах: постройте какой-то сервис, десткоп-программу, используйте весь стек, который знаете - и вы уже набиваете шишки, а остальные, кроме рассылки своего резюме, больше ничего не делают. «На мое резюме никто не отвечает» В продолжение вышестоящего пункта. Скорее всего, для будущих айтишников без опыта уметь написать красивое резюме - это хорошо, но когда на одну вакансию очень много людей, многие резюме друг на друга очень похожи: ты, конечно, можешь прислать фотку с декольте (если девушка) или написать много технологий, которые сам знаешь только из википедии. И в том, и в другом случае HR’у будет попросту по барабану: если в вакансии проекта должен быть человек, который, к примеру, знает AWS, то будут искать в резюме именно AWS. Возьмите во внимание еще такой немаловажный момент, как рекомендации коллег. Это - боль любого человека, который не имеет подобных знакомых, потому как львиную долю junior’ов забирают именно оттуда (если человек по рекомендацияем - не идиот, конечно). Обычно на позицию junior берут, подчеркиваю, адекватного активного человека, который готов учиться, да даже за еду. И если такой кандидат провалится, то скорее следующим будете вы. Ну, а пока остальных собеседуют, у вас есть много направлений, где можно круто прокачаться: open source, задачки в интернете, а может, и фриланс. «Я не пройду собеседование/хочу в конкретную компанию» Да, скорее всего, первое собеседование будет провалом, но тот опыт, который вы получите, бесценен. С каждым последующим собеседованием вы будете уверенней и находчивей. Как сейчас помню свое первое... Боже, что за чушь я нес?! Как было стыдно уходить после него (я запомнил того упыря, который ухмылялся мне в лицо), но когда пришел домой и все обдумал, я понял, что это был прекрасный урок. После него все последующее подобные мероприятия были пропитаны легкостью и уверенностью. Никто не умер, ищут таких, как я, значит, я подойду. Верьте в себя! Если вы хотите конкретно в определенную компанию, то я думаю, что не открою вам популярный в нашей среде лайфхак, но все же: перед тем, как организовать встречу с этой конторой, пройдите перед этим интервью у конкурентов. Возможно, вам предложат то, от чего вы не откажетесь, или условия будут покруче. Знаю точно одно: вы не пожалеете. «Мне и на этой работе хорошо» Знаете, есть такое старое высказывание: Le mieux est I’enneini du bien («Лучшее - враг хорошего»). Возможно, ваша работа - не самое худшее место, ну да, начальник - козел, ну и что? Или, к примеру, третий год без премии, зато стабильная зарплата, тем более мне уже за 30. В какой-то мере оно, может, и так, только помните, что жизнь у вас одна, и ее не следует тратить на разочарования, на мнимый комфорт, когда вокруг столько всего интересного, и всей жизни не хватит, чтобы понять. Не бойтесь стать лучше, не бойтесь стать лучшим. Не слушайте никого, идите к цели настойчиво, если знаете, что это то, чем вы действительно хотите заниматься. Не бойтесь меняться!Собеседование
По большому счету, вы можете найти это всё в интернете или поспрашивать у знакомых, но я считаю, что лишним не будет. Внизу пример собеседования на junior Java разработчика таким, каким был бы он сейчас, если бы интервьюером был я. Вопросы могут быть какими угодно, я лишь попробовал собрать что-то среднее по больнице. Представим, что вам повезло. Стандартная схема Шаг 1. Вам звонит рекрутер, и вы договариваетесь с ней об интервью, к примеру, завтра на 11:00. Шаг 2. Вы приходите раньше, так как 11:00 - скорее всего, время не для вас, а для разработчиков, у которых зарезервирована какая то комната, в которой вас будут пытать. Хорошим тоном любого рекрутера будет предупредить об этом. Шаг 3. На самом деле, начиная с шага 3, все пункты можно перемешивать, потому что собеседования могут проходить по-разному. К примеру, здесь вас могут спросить о базовых вещах, откуда вы родом, почему у нас, и так далее. Не исключено, что это может сделать сам HR, и конечно же, не исключено, что на английском. Право, это зависит от компании. Шаг 4. Вас приглашают в митинг-рум, где у вас будет разговор с одним, двумя, тремя людьми, один из которых будет либо сеньор, либо техлид, который в будущем будет работать с вами, среди остальных могут быть Scrum-мастер, другие разработчики либо HR’ы. Вас собеседуют какое-то время, затем жмут руку и отпускают. Шаг 5. Возможно, это будет на следующий день, а возможно, сразу же после шага 4 - у вас будет разговор с иностранным заказчиком (если такой имеется), а может, он сам и проведет интервью. Как видите, вариантов много. Где-то есть заказчики, где-то есть еще телефонное интервью. Это просто пример. Пример технического собеседования для Junior Java разработчика Мне очень жалко недоразработчиков, которые читают что-то умное с целью утопить/задавить/попонтоваться перед соискателем на интервью. Если вы видите, что перед вами такой человек, и чувствуете давление и напряжение с его стороны, незамедлительно посылайте его на три веселых, потому что после успешного прохождения с этим кретином придется работать. Не тратьте свои драгоценные нервы. Интервью, в первую очередь, должно проходить с целью узнать, что знает кандидат, а не то, чего он не знает. Естественно, если вам нужен человек, который знает что-то конкретное - спрашивайте его, не мучайте бесполезными вещами, которые не используете в проекте. Будьте людьми, в конце концов! Внизу приблизительные вопросы, которые могут попасться на интервью. По 5 вопросов для каждой технологии. OOP 1. Приведите пример полиморфизма из реальной жизни? В чем преимущества? Недостатки? Напишите простенький код. 2. Что такое интерфейс? Абстрактный класс? Зачем нужны интерфейсы, если можно тупо всё классами писать (немного провокации)?. То же самое - и про абстрактный класс. Что такое default методы в Java 8? 3. Постройте иерархию классов на конкретном примере воображаемой базы данных или программы (там список разных классов рабочих из базы данных) и взаимодействие между ними (aggregation, composition). 4. Чем composition отличиается от aggregation (is-a, has-a)? 5. Как можно обойти запрет на множественное наследование в Java? JDK/JRE 1. Чем JDK отличается от JRE? Что такое JVM? 2. Что такое classpath и для чего он нужен? Как, к примеру, загрузить другие классы в classpath? 3. Что вы знаете о classloader? 4. Расскажите о javadoc? Для чего он нужен? 5. Что такое JAR, WAR? Java Common 1. В чем отличие статических методов от не статических? Что такое final? 2. Что такое boxing-unboxing? byte b = 127, b++, какой результат и почему? 3. Что такое wrapper’ы, для чего это? 4. Что мне нужно сделать, чтобы создать свою аннотацию? Что такое overriding/overloading? 5. Почему класс String final? Что делает метод intern()? Data Structures 1. Расскажите о структуре Collections API в Java? Вы уже успели поработать с Stream API? 2. В чем отличие между ArrayList и LinkedList? Где лучше использовать ArrayList, а где LinkedList? 3. Расскажите как устроена HashMap? В чем особенности работы с TreeSet, HashSet? Имеете опыт с Guava коллекциями? 4. Массивы в Java, пример двумерного массива. 5. hashCode, equals на примере HashMap? Concurrency 1. Что такое процесс? Поток? Как создать поток? Что такое syncronized? Как понять этот или тот кусок кода thread-safe? 2. Что такое Thread.sleep, а также wait, notify, yield? 3. Приведите пример deadlock? 4. Коллекции при работе с многопоточностью. 5. ThreadLocal и Atomic операции SQL/JDBC 1. На конкретном примере достаньте из базы Users того, у которого salary больше, чем 5000. 2. Примеры INNER JOIN, OUTER JOIN, Order By, Group By. 3. Зачем нужен JDBC Driver? Примеры. 4. Расскажите всё, что знаете о ResultSet, парочка примеров. 5. Напишите простенькое DAO c применением RS. JPA/Hibernate 1. В чем недостатки и преимущества JPA? 2. Что такое EntityManager? Entity? 3. Критерии в JPA/Hibernate. 4. One-To-One, Many-To-Many в JPA/Hibernate 5. Как бы вы сделали JOIN в Hibernate? HQL? Spring 1. Что такое DI/IoC? Преимущества. 2. Что такое Application Context? Bean? 3. Как бывают типы IoC инициализации? 4. Singleton, Prototype в Spring? Annotation-based Spring? 5. Жизненный цикл бинов? Init-method, destroy-method? @PostConstruct, @PostDeploy? Maven 1. Основные фазы maven, жизненный цикл. 2. Как запускать maven с тестами, без тестов? Что такое archetype, mvn dependency? 3. Профайлы в maven, как создавать, как запускать. 4. Что такое snapshot в maven? Central/Remote репозитории? 5. Плагины в mvn, принцип работы, пару примеров. Algo 1. Понятие алгоритма, его скорость, Big-O-Notation. 2. Как найти средний елемент в LinkedList в один заход? 3. Напишите примитивный Stack? В чем разница между Stack и Queue? LIFO, FIFO? 4. Quick Sort, Merge Sort. 5. Напишите програмку, которая проверяет, является ли число палиндромом. Согласен, может, планка загнута чуть больше в сторону миддла, чем джуниора, но я думаю, что такая подготовочка вам точно не помешает. Старайтесь углубляться в каждый вопрос. Кстати, тут не указаны многие направления в Java, прошу учесть.Во время работы
Здесь находятся маленькие рекомендации для тех junior/middle разработчиков, которые уже устроились. Эти простые советы могут пригодиться вам так же, как они помогли в свою очередь мне. Не будь упрямым Перестаньте доказывать свою точку зрения, даже если она соблазнительно близка к истине. Вы уже заметили, что находитесь в споре долго, а значит, по ту сторону баррикад - обычный осел, у которого в жизни только два мнения: его и неправильное. У нас невероятно много упрямых людей, которые стоят на своем до последнего, лишь бы их эго не пошатнулось. И это не только ваши коллеги, они просто повсюду - в маршрутке, в магазине, родственники, близкие друзья - от них не убежать и не скрыться. С ними нужно как-то взаимодействовать, даже если ты понимаешь, что человек несет открытую чушь. Более того, то же самое может случиться с вами. Согласен, простые вещи можно объяснить даже упрямому человеку, ну, а если речь идет об архитектурных вопросах в проекте или о личном мнении? Забудь про это барахло - будь гибче. Я очень уважаю людей, которые могут признать, что они ошиблись, у всех на глазах. Именно такое качество пригодится вам как младшему специалисту - с открытым человеком сложно вступать в конфронтацию, тем более когда он признает, что учится и имеет право ошибаться. Не опаздывай Не важно, это испытательный срок или просто пятница, на которую все забивают и приходят к 11. Важно другое: пунктуальность - это особенность профессионала, который зарабатывает себе лишние очки на ровном месте. А лишние баллы человеку без опыта не помешают, не правда ли? Старайтесь не опаздывать и уходить с работы, честно проработав 8 часов. Не злоупотребляй эстимейтами К сожалению, очень частая картина, в которую я в прошлом когда-то вляпался сам. Разработчик поставил себе 8-16 часов на выполнение задания и неожиданно справился за 3-4 часа. Остальные часы он тратит на свое личное время в виде настольного тенниса, как это было со мной, или просмотра youtube и прочей развлекаловки. С юридической точки зрения - вроде бы и договорились, но с человеческой вы лишаете себя очень важных вещей: 1.Вы стоите на месте, так как заполняете лишнее время ненужными вещами; 2. Вы не развиваетесь, так как не ставите руководство в известность о своем быстром прогрессе, никто и знать не знает, что вы справляетесь с заданиями быстрее, чем ожидали; 3. Вы начинаете постоянно завышать среднее количество времени на значения, это просто путь в никуда. Выделяй время на учебу Шанс отстать от паровоза нереально высокий, поэтому имей ввиду, что технологии и новые версии очень быстро развиваются. Подписывайся на Java евангелистов нашего дня, читай Java дайджесты и вообще интересуйся, учи новое. Это поможет тебе держать марку и развиваться. Помогай другим Не бойся помогать другим, даже если они такие же зеленые, как ты. Во-первых, ты здорово укрепишь свои знания, во-вторых, получишь уважение в глазах других, заодно помогут и тебе. В такой обстановке рождаются лучшие коллективы, а также очень быстрый технический и личностный рост. Занимайся спортом. Имей хобби Нет, серьезно. Мало того, что люди, занимающиеся спортом, выглядят и чувствуют себя лучше, так еще и работа мозга у них на высоте! Сколиоз, поясница, лишний вес, разные проблемы с внутренними органами - круглосуточные посиделки за компом даже за пределами работы способствуют этому. Если спортом заниматься не получается (в чем я сомневаюсь), используйте маленькие лайфхаки: работайте стоя время от времени, выходите на две остановки раньше и доходите до работы пешком. Да и вообще ходите больше пешком. Также есть риск перегореть, если программирование занимает гораздо больше вашего времени, чем 40 часов в неделю. На помощь придут личные увлечения - к примеру, фотография, музыка и т.д. Регулярно находите время для духовного. Балансируй в личной жизни Когда девушка/жена говорит: «ноутбук или я», нужно основательно призадуматься, какое место занимает в вашей жизни программирование. С другой стороны, начиная свой путь в IT, вам нужно доходчиво объяснить второй половинке, что сейчас вам нужно очень много учиться, чтобы добиться большего. Надеюсь, они поймут. Ну, а вы старайтесь балансировать и правильно распределять свое время. Выходи за пределы Будьте проактивными, если чувствуете, к примеру, что можете поделиться знаниями или у вас есть интересные темы, почему бы не организовать маленькие курсы внутри компании для других? Не бойтесь принимать участие в крупных open source проектах, если знаете, как можно помочь. Хотите написать игру, социальный проект или другую идею - делайте, делайте, делайте! Не стойте на месте, всегда ищите пути, где можно развиваться. Будь конкурентным Наблюдайте за новыми тенденциями, будьте в курсе трендов, которые происходят в Java сообществе. К примеру, не будет лишним, если вы изредка, время от времени, будете мониторить Java вакансии на DOU, но не для того, чтобы уйти от работы, а для того, чтобы знать, какие технологии остаются актуальными, а что потихоньку пропадает с рынка. Также старайтесь проходить курсы на Coursera, Udacity и т.д, изучайте новые горизонты. И даже английский: старайтесь смотреть любимые фильмы/сериалы в оригинале с субтитрами, чтобы подтянуть разговорный, скачайте пару-тройку интересных приложений для изучения языка (к примеру LinguaLeo), да и, в конце концов, сходите на курсы.Заключение
Ну вот, мой маленький проект на DOU подходит в концу. Дорогие друзья, я искренне желаю вам устроиться на работу и надеюсь, что всё, что было описано мной за эти 7 статей, будет ценным пособием для вас, даже для тех, кто уже работает Java разработчиком. Будущие джуниоры, помните, что нет ничего невозможного, и если вы действительно поднажмете, у вас непременно всё получится. Я хочу, чтобы вы наконец определились, ваше это или не ваше, разработали подробный план обучения и хладнокровно ему следовали. Не расстраивайтесь, если взамен получаете тишину, - это всё временно, главное - верить и ни в коем случае не сбиваться с курса, а учиться, учиться и еще раз учиться. Огромную благодарность я хотел бы выразить команде DOU за редактирование большого количества материала и за предоставление мне главного эфирного времени по понедельникам. DOU - это классное комьюнити, которое уже перестало быть просто сайтом для украинских айтишников. Также я бы хотел сказать спасибо всем комментаторам, которые читали мои статьи по диагонали и вырывали фразы из контекста. Без вас статьи не выглядели бы так интересно:) Да прибудет с вами Сила!Осенью 2017 я окончательно решил уходить из EPAM, где работал более полутора лет, и идти развиваться куда-то дальше.
В связи с этим я обновил резюме, завысил немного зарплатные ожидания, и опубликовал его на HeadHunter. Я особо никуда не спешил, поэтому на вакансии сам почти и не откликался, за исключением пары интересных мест. К собеседованиям решил не готовиться и почти к ним ничего и не читал ибо зачем зубрить что-то бесполезное в работе. А полезное ты и так всё помнишь. Я понадеялся на адекватных интервьюеров, которые не будут спрашивать то, что без зубрёжа нормальные люди не помнят, так и вышло. Почти сразу мне начали приходить письма и звонки, и я забил собеседованиями ближайшие полторы недели, по 1-2 в день. Тут хочу рассказать об этом опыте. Всего я прошёл собеседования в 11-ти компаниях, 8 из которых прислали офер.
В резюме у меня был указан опыт PHP разработчика (1.5 года), затем Java (тоже 1.5 года). С Java стандартный стек: Spring и всё что около него. В сумме в резюме 4 года опыта работы и несколько своих проектов. Кажется, неплохое резюме)
Несколько заметных пунктов:
- Для позиции middle java рынок кандидатов, судя по всему, почти пустой. Большая часть компаний проводила всего одно собеседование, и в течении 1-2 дней присылало фидбек. Тестовые задания или несколько собеседований позволяли себе только крупные компании с каким-то известным именем на рынке труда. Видимо, тем кто поменьше, приходится забирать кандидатов, не давая им времени думать и сравнивать оферы.
- Судя по количеству оферов и тому, что ни в одном не предложили меньше запрашиваемой мною сумме, мне нужно было ещё сильнее повысить ожидаемую зп. Значил либо я быстро вырос, либо в епаме мне недоплачивали). Собираясь искать работу, смелее завышайте зп.
- Условия все предлагают почти одинаковые — ДМС, белая зп, свободный график, всякие компенсации. Только одна компания звала на удалёнку. И только у одной (уже другой) компании была серая зп.
- Примерно у половины компаний в работе использовался Spring , но по нему на собеседованиях, кажется, не спрашивали ни разу. Только общие вопросы — работал ли вовсе и что делал. В целом знания конкретных фреймворков и библиотек никто не ожидал.
- Собеседования длились от 20 минут до 2-х часов. Обычно около часа. В две компании были собеседования по Skype.
- Некоторые простейшие вопросы ставили меня в тупик. Например что-нибудь про ООП (я спутал полиморфизм и инкапсуляцию:)). Когда ты так привыкаешь к понятиям, что стопаришься когда о них расспрашивают. Довольно неприятные ощущения.
Теперь о вопросах на собеседованиях:
- Вообще везде спрашивали разницу между ArrayList и LinkedList . При том в половине случаев со словами «ну этот вопрос вам уже много раз задавали, но всё же». Не знаю, то-ли по инерции, то-ли действительно бывают мидлы, которые не знают разницы, да ещё и не узнают её на первом же подобном собеседовании. В любом случае лучше помнить стандартные коллекции и то, как они работают.
- Почти везде просили перечислить виды коллекций и то, как они работают. Чаще всего спрашивали про HashMap (после ArrayList, конечно).
- Часто спрашивали про Object и какие методы в нём есть.
- Часто спрашивали про SOLID и расшифровать эту аббревиатуру я как назло никогда не мог — всегда такое плохо у меня запоминается) Но общий смысл принципов конечно понятен и его объяснял.
- Часто был вопрос про REST .
- Периодически спрашивали про сборщик мусора, но без тонких деталей. Рассказа об одном алгоритме его работы на поколениях было достаточно.
- Периодически спрашивали про ООП, принципы, из более менее интересного «объясни полиморфизм пятикласснику».
- Задачи прямо на собеседовании дают редко, как и тестовые задания домой. В основном крупные и известные компании.
- Периодически спрашивают про многопоточность, но судя по всему действительно она важна уже в вакансиях ближе к senior.
- Часто, и это интереснее всего, идёт обсуждение каких-нибудь абстрактных задач, способы их решения, проблемы и подобное.
Об удачных собеседованиях рассказывать нет смысла, расскажу о неудачных:
- Яндекс Деньги. Прошёл первое собеседование, после этого получил тестовое задание как раз на параллельность. Выполнил, но видимо недостаточно хорошо.
- Deutsche Bank. Единственное собеседование, за которое мне именно стыдно. Не выспался или ещё что — но тупил страшно. Я на стажировки 5 лет назад лучше собеседования проходил. Там были вопросы по Java, потом задачки всякие посчитать какая где память, что лучше. В общем я ошибался на уровне таблицы умножения. Не удивлён что мне отказали)
- JetBrains. Тут по требованиям в вакансии я сразу не подходил, но решил попробовать. Интересное собеседование, проводилось в офисе, но по видеосвязи с Мюнхеном. В целом отвечал вроде неплохо, но нужна была как раз тоже параллельность, в которой у меня только учебный опыт.
Больше всего понравился процесс найма в Петер-Сервис, несмотря на то, что от знакомых я получил много плохих отзывов о компании (объективности ради — были и хорошие, видимо как повезёт с отделом и командой). Там было сначала собеседование с парой разработчиков, общие вопросы, обсуждения. Затем меня пригласили в команду, куда я должен был выйти на работу, познакомиться, и я рассказал об одном своём проекте, как его делал, какие проблемы решал. Обсуждали это и некоторые подробности их проекта. И уже после этого получил офер. Таким образом, думая над офером, я уже был знаком со всей командой, примерно представлял где и с кем буду работать. Это круто, потому что примерно в половине собеседований я общался с 1-2 людьми, не знал ни с кем там работать, ни подробностей проекта, кроме общих фраз (или вовсе нескольких вариантов проектов). Но всё же пошёл работать я не к ним.
А в итоге я попал на работу во ВКонтакте, даже не на Java. Там было первое собеседование, тестовое задание и финальное собеседование.
Выводы? Ходите на собеседования почаще и завышайте ожидаемую зп.
Этот раздел посвящён вопросам, которые могут быть заданы при прохождении интервью на позицию Java программиста.
Цель — собрать не только вопросы (что-то их очень много в интернете), но и ответы на них в одном месте.
По поводу указания авторства читайте на главной странице раздела Interview
- Сколько ключевых слов зарезервировано языком, что это за слова, какие из них не используются?
- Из каких символов может состоять имя переменной (корректный идентификатор)?
- Что значит слово “инициализация”?
- На какие основные группы можно поделить типы данных?
- Какие примитивные типы вы знаете?
- Что вы знаете о преобразовании примитивных типов данных, есть ли потеря данных, можно ли преобразовать логический тип?
- Какими значениями инициализируются переменные по умолчанию?
- Как передается значение переменной (по ссылке/значению)?
- Что вы знаете о функции main, какие обязательные условия ее определения?
- Какие логические операции и операторы вы знаете?
- В чем разница краткой и полной схемы записи логических операторов?
- Что такое таблица истинности?
- Что такое тернарный оператор выбора?
- Какие унарные и бинарные арифметические операции вы знаете?
- Какие побитовые операции вы знаете?
- Какова роль и правила написания оператора выбора (switch)?
- Какие циклы вы знаете, в чем их отличия?
- Что такое “итерация цикла”?
- Какие параметры имеет цикл for, можно ли их не задать?
- Какой оператор используется для немедленной остановки цикла?
- Какой оператор используется для перехода к следующей итерации цикла?
- Что такое массив?
- Какие виды массивов вы знаете?
- Что вы знаете о классах оболочках?
- Что такое автоупаковка (boxing/unboxing)?
- Назовите принципы ООП и расскажите о каждом.
- Дайте определение понятию “класс”.
- Что такое поле/атрибут класса?
- Как правильно организовать доступ к полям класса?
- Дайте определение понятию “конструктор”.
- Чем отличаются конструкторы по-умолчанию, копирования и конструктор с параметрами?
- Какие модификации уровня доступа вы знаете, расскажите про каждый из них.
- Расскажите об особенностях класса с единственным закрытым (private) конструктором.
- О чем говорят ключевые слова “this”, “super”, где и как их можно использовать?
- Дайте определение понятию “метод”.
- Что такое сигнатура метода?
- Какие методы называются перегруженными?
- Могут ли нестатические методы перегрузить статические?
- Расскажите про переопределение методов.
- Может ли метод принимать разное количество параметров (аргументы переменной длины)?
- Можно ли сузить уровень доступа/тип возвращаемого значения при переопределении метода?
- Как получить доступ к переопределенным методам родительского класса?
- Какие преобразования называются нисходящими и восходящими?
- Чем отличается переопределение от перегрузки?
- Где можно инициализировать статические/нестатические поля?
- Зачем нужен оператор instanceof?
- Зачем нужны и какие бывают блоки инициализации?
- Каков порядок вызова конструкторов и блоков инициализации двух классов: потомка и его предка?
- Где и для чего используется модификатор abstract?
- Можно ли объявить метод абстрактным и статическим одновременно?
- Что означает ключевое слово static?
- К каким конструкциям Java применим модификатор static?
- Что будет, если в static блоке кода возникнет исключительная ситуация?
- Можно ли перегрузить static метод?
- Что такое статический класс, какие особенности его использования?
- Какие особенности инициализации final static переменных?
- Как влияет модификатор static на класс/метод/поле?
- О чем говорит ключевое слово final?
- Дайте определение понятию “интерфейс”.
- Какие модификаторы по умолчанию имеют поля и методы интерфейсов?
- Почему нельзя объявить метод интерфейса с модификатором final или static?
- Какие типы классов бывают в java (вложенные… и.т.д.)
- Какие особенности создания вложенных классов: простых и статических.
- Что вы знаете о вложенных классах, зачем они используются? Классификация, варианты использования, о нарушении инкапсуляции.
- В чем разница вложенных и внутренних классов?
- Какие классы называются анонимными?
- Каким образом из вложенного класса получить доступ к полю внешнего класса?
- Каким образом можно обратиться к локальной переменной метода из анонимного класса, объявленного в теле этого метода? Есть ли какие-нибудь ограничения для такой переменной?
- Как связан любой пользовательский класс с классом Object?
- Расскажите про каждый из методов класса Object.
- Что такое метод equals(). Чем он отличается от операции ==.
- Если вы хотите переопределить equals(), какие условия должны удовлетворяться для переопределенного метода?
- Если equals() переопределен, есть ли какие-либо другие методы, которые следует переопределить?
- В чем особенность работы методов hashCode и equals? Каким образом реализованы методы hashCode и equals в классе Object? Какие правила и соглашения существуют для реализации этих методов? Когда они применяются?
- Какой метод возвращает строковое представление объекта?
- Что будет, если переопределить equals не переопределяя hashCode? Какие могут возникнуть проблемы?
- Есть ли какие-либо рекомендации о том, какие поля следует использовать при подсчете hashCode?
- Как вы думаете, будут ли какие-то проблемы, если у объекта, который используется в качестве ключа в hashMap изменится поле, которое участвует в определении hashCode?
- Чем отличается абстрактный класс от интерфейса, в каких случаях что вы будете использовать?
- Можно ли получить доступ к private переменным класса и если да, то каким образом?
- Что такое volatile и transient? Для чего и в каких случаях можно было бы использовать default?
- Расширение модификаторов при наследовании, переопределении и сокрытии методов. Если у класса-родителя есть метод, объявленный как private, может ли наследник расширить его видимость? А если protected? А сузить видимость?
- Имеет ли смысл объявлять метод private final?
- Какие особенности инициализации final переменных?
- Что будет, если единственный конструктор класса объявлен как final?
- Что такое finalize? Зачем он нужен? Что Вы можете рассказать о сборщике мусора и алгоритмах его работы.
- Почему метод clone объявлен как protected? Что необходимо для реализации клонирования?
- Знакомы ли Вам какие-либо паттерны проектирования?
- Напишите Singleton… А с ленивой загрузкой. А если он должен быть потоко-безопасным? А в каких случаях ленивая загрузка хуже?
- Что можете сказать про MVC? Нарисуйте диаграмму и объясните, как MVC работает.
- Напишите функцию вычисления факториала.
- Дана функция вычисления чисел Фибоначчи, известно, что она работает. Найдите логическую ошибку. Оцените сложность получившегося алгоритма.
- Дайте определение понятию “исключение”
- Какова иерархия исключений.
- Можно/нужно ли обрабатывать ошибки jvm?
- Какие существуют способы обработки исключений?
- О чем говорит ключевое слово throws?
- В чем особенность блока finally? Всегда ли он исполняется?
- Может ли не быть ни одного блока catch при отлавливании исключений?
- Могли бы вы придумать ситуацию, когда блок finally не будет выполнен?
- Может ли один блок catch отлавливать несколько исключений (с одной и разных веток наследований)?
- Что вы знаете об обрабатываемых и не обрабатываемых (checked/unchecked) исключениях?
- В чем особенность RuntimeException?
- Как написать собственное (“пользовательское”) исключение? Какими мотивами вы будете руководствоваться при выборе типа исключения: checked/unchecked?
- Какой оператор позволяет принудительно выбросить исключение?
- Есть ли дополнительные условия к методу, который потенциально может выбросить исключение?
- Может ли метод main выбросить исключение во вне и если да, то где будет происходить обработка данного исключения?
- Если оператор return содержится и в блоке catch и в finally, какой из них “главнее”?
- Что вы знаете о OutOfMemoryError?
- Что вы знаете о SQLException? К какому типу checked или unchecked оно относится, почему?
- Что такое Error? В каком случае используется Error. Приведите пример Error’а.
- Какая конструкция используется в Java для обработки исключений?
- Предположим, есть блок try-finally. В блоке try возникло исключение и выполнение переместилось в блок finally. В блоке finally тоже возникло исключение. Какое из двух исключений “выпадет” из блока try-finally? Что случится со вторым исключением?
- Предположим, есть метод, который может выбросить IOException и FileNotFoundException в какой последовательности должны идти блоки catch? Сколько блоков catch будет выполнено?
- Дайте определение понятию “коллекция”.
- Назовите преимущества использования коллекций.
- Какие данные могут хранить коллекции?
- Какова иерархия коллекций?
- Что вы знаете о коллекциях типа List?
- Что вы знаете о коллекциях типа Set?
- Что вы знаете о коллекциях типа Queue?
- Что вы знаете о коллекциях типа Map, в чем их принципиальное отличие?
- Назовите основные реализации List, Set, Map.
- Какие реализации SortedSet вы знаете и в чем их особенность?
- В чем отличия/сходства List и Set?
- Что разного/общего у классов ArrayList и LinkedList, когда лучше использовать ArrayList, а когда LinkedList?
- В каких случаях разумно использовать массив, а не ArrayList?
- Чем отличается ArrayList от Vector?
- Что вы знаете о реализации классов HashSet и TreeSet?
- Чем отличаются HashMap и TreeMap? Как они устроены и работают? Что со временем доступа к объектам, какие зависимости?
- Что такое Hashtable, чем она отличается от HashMap? На сегодняшний день она deprecated, как все-таки использовать нужную функциональность?
- Что будет, если в Map положить два значения с одинаковым ключом?
- Как задается порядок следования объектов в коллекции, как отсортировать коллекцию?
- Дайте определение понятию “итератор”.
- Какую функциональность представляет класс Collections?
- Как получить не модифицируемую коллекцию?
- Какие коллекции синхронизированы?
- Как получить синхронизированную коллекцию из не синхронизированной?
- Как получить коллекцию только для чтения?
- Почему Map не наследуется от Collection?
- В чем разница между Iterator и Enumeration?
- Как реализован цикл foreach?
- Почему нет метода iterator.add() чтобы добавить элементы в коллекцию?
- Почему в классе iterator нет метода для получения следующего элемента без передвижения курсора?
- В чем разница между Iterator и ListIterator?
- Какие есть способы перебора всех элементов List?
- В чем разница между fail-safe и fail-fast свойствами?
- Что делать, чтобы не возникло исключение ConcurrentModificationException?
- Что такое стек и очередь, расскажите в чем их отличия?
- В чем разница между интерфейсами Comparable и Comparator?
- Почему коллекции не наследуют интерфейсы Cloneable и Serializable?
- Какие “строковые” классы вы знаете?
- Какие основные свойства “строковых” классов (их особенности)?
- Можно ли наследовать строковый тип, почему?
- Дайте определение понятию конкатенация строк.
- Как преобразовать строку в число?
- Как сравнить значение двух строк?
- Как перевернуть строку?
- Как работает сравнение двух строк?
- Как обрезать пробелы в конце строки?
- Как заменить символ в строке?
- Как получить часть строки?
- Дайте определение понятию “пул строк”.
- Какой метод позволяет выделить подстроку в строке?
- Как разбить строку на подстроки по заданному разделителю?
- Какой метод вызывается для преобразования переменной в строку?
- Как узнать значение конкретного символа строки, зная его порядковый номер в строке?
- Как найти необходимый символ в строке?
- Можно ли синхронизировать доступ к строке?
- Что делает метод intern()?
- Чем отличаются и что общего у классов String, StringBuffer и StringBuilder?
- Как правильно сравнить значения строк двух различных объектов типа String и StringBuffer?
- Почему строка неизменная и финализированная в Java?
- Почему массив символов предпочтительнее строки для хранения пароля?
- Почему строка является популярным ключом в HashMap в Java?
- Напишите метод удаления данного символа из строки.
- Какие существуют виды потоков ввода/вывода?
- Назовите основные предки потоков ввода/вывода.
- Что общего и чем отличаются следующие потоки: InputStream, OutputStream, Reader, Writer?
- Что вы знаете о RandomAccessFile?
- Какие есть режимы доступа к файлу?
- В каких пакетах лежат классы-потоки?
- Что вы знаете о классах-надстройках?
- Какой класс-надстройка позволяет читать данные из входного байтового потока в формате примитивных типов данных?
- Какой класс-надстройка позволяет ускорить чтение/запись за счет использования буфера?
- Какие классы позволяют преобразовать байтовые потоки в символьные и обратно?
- Какой класс предназначен для работы с элементами файловой системы (ЭФС)?
- Какой символ является разделителем при указании пути к ЭФС?
- Как выбрать все ЭФС определенного каталога по критерию (например, с определенным расширением)?
- Что вы знаете об интерфейсе FilenameFilter?
- Что такое сериализация?
- Какие условия “благополучной” сериализации объекта?
- Какие классы позволяют архивировать объекты?
- Дайте определение понятию “процесс”.
- Дайте определение понятию “поток”.
- Дайте определение понятию “синхронизация потоков”.
- Как взаимодействуют программы, процессы и потоки?
- В каких случаях целесообразно создавать несколько потоков?
- Что может произойти если два потока будут выполнять один и тот же код в программе?
- Что вы знаете о главном потоке программы?
- Какие есть способы создания и запуска потоков?
- Какой метод запускает поток на выполнение?
- Какой метод описывает действие потока во время выполнения?
- Когда поток завершает свое выполнение?
- Как синхронизировать метод?
- Как принудительно остановить поток?
- Дайте определение понятию “поток-демон”.
- Как создать поток-демон?
- Как получить текущий поток?
- Дайте определение понятию “монитор”.
- Как приостановить выполнение потока?
- В каких состояниях может пребывать поток?
- Что является монитором при вызове нестатического и статического метода?
- Что является монитором при выполнении участка кода метода?
- Какие методы позволяют синхронизировать выполнение потоков?
- Какой метод переводит поток в режим ожидания?
- Какова функциональность методов notify и notifyAll?
- Что позволяет сделать метод join?
- Каковы условия вызова метода wait/notify?
- Дайте определение понятию “взаимная блокировка”.
- Чем отличаются методы interrupt, interrupted, isInterrupted?
- В каком случае будет выброшено исключение InterruptedException, какие методы могут его выбросить?
- Модификаторы volatile и метод yield().
- Пакет java.util.concurrent
- Есть некоторый метод, который исполняет операцию i++. Переменная i типа int. Предполагается, что код будет исполнятся в многопоточной среде. Следует ли синхронизировать блок?
- Что используется в качестве mutex, если метод объявлен static synchronized? Можно ли создавать новые экземпляры класса, пока выполняется static synchronized метод?
- Предположим в методе run возник RuntimeException, который не был пойман. Что случится с потоком? Есть ли способ узнать о том, что Exception произошел (не заключая все тело run в блок try-catch)? Есть ли способ восстановить работу потока после того как это произошло?
- Какие стандартные инструменты Java вы бы использовали для реализации пула потоков?
- Что такое ThreadGroup и зачем он нужен?
- Что такое ThreadPool и зачем он нужен?
- Что такое ThreadPoolExecutor и зачем он нужен?
- Что такое «атомарные типы» в Java?
- Зачем нужен класс ThreadLocal?
- Что такое Executor?
- Что такое ExecutorService?
- Зачем нужен ScheduledExecutorService?
Этот список из 300+ вопросов (без ответов) был найден на сайте http://becomejavasenior.com/ . Там же указаны другие авторы.
58489 Total Views 15 Views Today
Views: 38 283
Мы собрали 10 каверзных примеров программ, которые выводят какую-либо информацию. Вы должны взглянуть на код и сказать, что же выведет программа. Не исключено, что программа даже не скомпилируется. В этом случае вам надо указать, что выведет компилятор.
Такие вопросы любят задавать на собеседованиях, а потому не лишним будет освежить свои знания языка программирования Java. В спойлерах будут скрыты ответы - то, что выведет программа или компилятор. Постарайтесь подумать сами, прежде чем смотреть правильный ответ.
Package com.instanceofjava; public class B { B b = new B(); public int show(){ return (true ? null: 0); } public static void main(String args) { B b = new B(); b.show(); } }
- Каждый раз, когда мы создаем объект какого-либо класса, первым вызывается конструктор и выделяется память для всех нестатических переменных.
- Здесь B b = new B(); объекту класса B присваивается новый объект того же класса.
- Запись B b = new B(); приводит к рекурсивному исполнению конструктора, что создает бесконечные объекты. Именно поэтому во время выполнения этого кода будет возбуждено исключение java.lang.StackOverFlowError в потоке "main" .
- Распространенной причиной появления такого рода исключений является плохая рекурсия. Обычно это происходит из-за неправильного условия завершения.
Что выведет следующая программа?
package com.instanceofjava; public class A{ public static void show(){ System.out.println("Static method called"); } public static void main(String args) { A obj = null; obj.show(); } }- Мы можем вызвать статические методы, используя переменную, ссылающуюся на null . Дело в том, что статические методы находятся на уровне класса. Именно поэтому мы можем вызывать статические функции как при помощи самого класса, так и при помощи переменной, равной null .
Что выведет следующая программа?
package com.instanceofjava; public class A{ static int a = 1111; static { a = a-- - --a; } { a = a++ + ++a; } public static void main(String args) { System.out.println(a); } }Что выведет следующая программа?
package com.instanceofjava; public class A{ int GetValue() { return (true ? null: 0); } public static void main(String args) { A obj = new A(); obj.GetValue(); } }Что выведет следующая программа?
package com.instanceofjava; public class A{ public static void main(String args) { Integer i1 = 128; Integer i2 = 128; System.out.println(i1 == i2); Integer i3 = 127; Integer i4 = 127; System.out.println(i3 == i4); } }Что выведет следующая программа?
package com.instanceofjava; class A { void method(int i) { } } class B extends A { @Override void method(Integer i) { } }- Какая строчка программы вызовет ошибку compile time error ?
Что выведет следующая программа?
package com.instanceofjava; class A { public static void main(String args) { String s = "ONE"+3+2+"TWO"+"THREE"+5+4+"FOUR"+"FIVE"+5; System.out.println(s); } }Что выведет следующая программа?
package com.instanceofjava; class A { static int method1(int i) { return method2(i *= 11); } static int method2(int i) { return method3(i /= 11); } static int method3(int i) { return method4(i -= 11); } static int method4(int i) { return i += 11; } public static void main(String args) { System.out.println(method1(11)); } }Что выведет следующая программа?
package com.instanceofjava; class A { public static void main(String args) { System.out.println(null); } }Что происходит при написании System.out.println(null); ?
Происходит, разумеется, ошибка компиляции. У метода println есть несколько вариаций. Он может принимать String , Object или char . При передаче в эту функцию аргумента null компилятор не может определиться, к какому из трех методов обращаться.
Перегруженные методы:
- public void prinltln(String str) {
- public void prinltln(char ch) {
- public void prinltln(Object ch) {
Для компилятора вызов System.out.println(null) является неоднозначным, поскольку для вывода null ‘a могут более-менее подойти два метода: println(String) и println(char) . Но компилятор не знает, к какому конкретно методу обратиться. Чтобы компиляция прошла успешно, следует написать:
- System.out.println((String)null);
- System.out.println((char)null);
- System.out.println((Object)null);
Но здесь нужно быть внимательным. Вызов System.out.println((char)null); приведет к исключению runtime exception .
- Что такое ООП?
- Что такое объект?
- Назовите основные принципы ООП.
- Что такое наследование?
- Что такое полиморфизм? Какие проявления полиморфизма в Java Вы знаете?
- Что такое инкапсуляция?
- Что такое aбстракция?
- В чем преимущества объектно-ориентированных языков программирования?
- Как использование объектно – ориентерованного подхода улучшает разработку программного обеспечения?
- Имеется выражение «является» и «имеет». Что они подразумевают в плане принципов ООП? В чем разница между композицией и агрегацией?
- Что вы подразумеваете под полиморфизмом, инкапсуляцией и динамическим связыванием?
- Чем отличается JRE, JVM и JDK?
- Опишите модификаторы доступа в Java.
- Что такое package level access.
- Чем абстрактный клас отличается от интерфейса? В каких случаях Вы бы использовали абстрактный класс, а в каких интерфейс?
- Может ли объект получить доступ к private-переменной класса? Если, да, то каким образом?
- Для чего в джаве статические блоки?
- Можно ли перегрузить static метод?
- Расскажите про внутренние классы. Когда вы их будете использовать?
- В чем разница между переменной экземпляра и статической переменной? Приведите пример.
- Приведите пример когда можно использовать статический метод?
- Расскажите про классы- загрузчики и про динамическую зарузку классов.
- Для чего нужен оператор "assert" в джава?
- Почему в некоторых интерфейсах вообще не определяют методов?
- Какая основная разница между String, StringBuffer, StringBuilder?
- Расскажите про потоки ввода-вывода Java.
- Что такое Heap и Stack память в Java?
- Какая разница между Stack и Heap памятью в Java?
- Расскажите про модель памяти в джава?
- Как работает сборщик мусора (garbage collector)?
- Расскажите про приведение типов. Что такое понижение и повышение типа? Когда вы получаете ClassCastException?
- Что такое статический класс, какие особенности его использования?
- Каким образом из вложенного класса получить доступ к полю внешнего класса.
- Какие существуют типы вложенных классов? Для чего они используются?
- Возможно ли при переопределении (override) метода изменить:
- Модификатор доступа
- Возвращаемый тип
- Тип аргумента или количество
- Имя аргументов
- Изменять порядок, количество или вовсе убрать секцию throws?
- Что такое autoboxing?
- Что такое Generics?
- Какова истинная цель использования обобщенных типов в Java?
- Каким образом передаются переменные в методы, по значению или по ссылке?
- Какие методы есть у класса Object?
- Правила переопределения метода Object.equals().
- Если вы хотите переопределить equals(), какие условия должны удовлетворяться для переопределенного метода?
- Какая связь между hashCode и equals?
- Каким образом реализованы методы hashCode и equals в классе Object?
- Что будет, если переопределить equals не переопределяя hashCode? Какие могут возникнуть проблемы?
- Есть ли какие-либо рекомендации о том, какие поля следует использовать при подсчете hashCode?
- Для чего нужен метод hashCode()?
- Правила переопределения метода Object.hashCode().
- Расскажите про клонирование объектов. В чем отличие между поверхностным и глубоким клонированием?
- Правила переопределения метода Object.clone().
- Где и как вы можете использовать закрытый конструктор?
- Что такое конструктор по умолчанию?
- Опишите метод Object.finalize().
- Чем отличаются слова final, finally и finalize?
- Опишите иерархию исключений.
- Какие виды исключений в Java вы знаете, чем они отличаются?
- Что такое checked и unchecked Exception?
- Как создать свой unchecked Exception?
- Какие есть Unchecke exeption?
- Что такое Error?
- Опишите работу блока try-catch-finally.
- Возможно ли использование блока try-finally (без catch)?
- Всегда ли исполняется блок finally?
- Какие есть оссобенности класса String? что делает метод intern().
- Можно ли наследовать строковый тип, почему?
- Почему строка является популярным ключом в HashMap в Java?
- Дайте определение понятию конкатенация строк.
- Как перевернуть строку?
- Как сравнить значение двух строк?
- Как обрезать пробелы в начале и конце строки?
- Дайте определение понятию "пул строк".
- Можно ли синхронизировать доступ к строке?
- Как правильно сравнить значения строк двух различных объектов типа String и StringBuffer?
- Почему строка неизменная и финализированная в Java?
- Напишите метод удаления данного символа из строки.
- Что такое рефлексия?
- Что произойдет со сборщиком мусора (GC), если во время выполнения метода finalize() некоторого объекта произойдет исключение?
- Что такое интернационализация, локализация?
- Что такое Аннотации в Java?
- Какие функции выполняет Аннотации?
- Какие встроенные аннотации в Java вы знаете?
- Что делают аннотации @Retention, @Documented, @Target и @Inherited?
- Что делают аннотации @Override, @Deprecated, @SafeVarargs и @SuppressWarnings?
- Какой жизненный цикл аннотации можно указать с помощью @Retention?
- К каким элементам можно применять аннотацию, как это указать?
- Как создать свою Аннотацию?
- Атрибуты каких типов допустимы в аннотациях?
- Что такое JMX?
- Какие выгоды предлагает JMX?
- Что еще умеет JMX кроме дистанционного управления?
- Что такое MBean?
- Какие типы MBeans существуют?
- Что такое MBean Server?
- Какие механизмы обеспечивают безопасность в технологии Java?
- Назовите несколько видов проверок которые выполняет верификатор байт-кода Java?
- Что вы знаете о "диспетчере защиты" в Java?
- Что такое JAAS?
- Что такое Рефакторинг?
- Что такое Коллекция?
- Назовите основные интерфейсы коллекций и их имплементации.
- Чем отличается ArrayList от LinkedList? В каких случаях лучше использовать первый, а в каких второй?
- Чем отличается HashMap от Hashtable?
- Чем отличается ArrayList от Vector?
- Как сравниваются елементы коллекций?
- Расположите в виде иерархии следующие интерфейсы: List, Set, Map, SortedSet, SortedMap, Collection,Iterable, Iterator, NavigableSet, NavigableMap.
- Почему Map - это не Collection, в то время как List и Set являются Collection?
- Дайте определение понятию "iterator".
- Что вы знаете об интерфейсе Iterable?
- Как одной строчкой преобразовать HashSet в ArrayList?
- Как одной строчкой преобразовать ArrayList в HashSet?
- Как перебрать все ключи Map учитывая, что Map - это не Iterable?
- Как перебрать все значения Map учитывая, что Map - это не Iterable?
- Как перебрать все пары ключ-значение в Map учитывая, что Map - это не Iterable?
- В чем проявляется "сортированность" SortedMap, кроме того, что toString() выводит все по порядку?
- Как одним вызовом копировать элементы из любой Collection в массив?
- Реализуйте симметрическую разность двух коллекций используя методы Collection (addAll(), removeAll(), retainAll()).
- Сравните Enumeration и Iterator.
- Как между собой связаны Iterable и Iterator?
- Как между собой связаны Iterable, Iterator и "for-each " введенный в Java 5?
- Сравните Iterator и ListIterator.
- Что произойдет, если я вызову Iterator.next() не "спросив" Iterator.hasNext()?
- Что произойдет, если я вызову Iterator.next() перед этим 10 раз вызвав Iterator.hasNext()? Я пропущу 9 элементов?
- Если у меня есть коллекция и порожденный итератор, изменится ли коллекция, если я вызову iterator.remove()?
- Если у меня есть коллекция и порожденный итератор, изменится ли итератор, если я вызову collection.remove(..)?
- Зачем добавили ArrayList, если уже был Vector?
- В реализации класса ArrayList есть следующие поля: Object elementData, int size. Объясните, зачем хранить отдельно size, если всегда можно взять elementData.length?
- LinkedList - это односвязный, двусвязный или четырехсвязный список?
- Какое худшее время работы метода contain() для элемента, который есть в LinkedList (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))?
- Какое худшее время работы метода contain() для элемента, который есть в ArrayList (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))?
- Какое худшее время работы метода add() для LinkedList (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))?
- Какое худшее время работы метода add() для ArrayList (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))?
- Сколько выделяется элементов в памяти при вызове ArrayList.add()?
- Сколько выделяется элементов в памяти при вызове LinkedList.add()?
- Оцените количество памяти на хранение одного примитива типа byte в LinkedList?
- Оцените количество памяти на хранение одного примитива типа byte в ArrayList?
- Я добавляю элемент в середину List-а: list.add(list.size()/2, newElem). Для кого эта операция медленнее - для ArrayList или для LinkedList?
- Как перебрать элементы LinkedList в обратном порядке, не используя медленный get(index)?
- Как одним вызовом из List получить List со всеми элементами, кроме первых и последних 3-х?
- Могут ли у разных объектов в памяти (ref0 != ref1) быть ref0.hashCode() == ref1.hashCode()?
- Могут ли у разных объектов в памяти (ref0 != ref1) быть ref0.equals(ref1) == true?
- Могут ли у разных ссылок на один объект в памяти (ref0 == ref1) быть ref0.equals(ref1) == false?
- Есть класс Point{int x, y;}. Почему хэш-код в виде 31 * x + y предпочтительнее чем x + y?
- Если у класса Point{int x, y;} "правильно " реализовать метод equals (return ref0.x == ref1.x && ref0.y == ref1.y), но сделать хэш-код в виде int hashCode() {return x;}, то будут ли корректно такие точки помещаться и извлекаться из HashSet?
- equals() порождает отношение эквивалентности. Какими из свойств обладает такое отношение: коммутативность, симметричность, рефлексивность, дистрибутивность, ассоциативность, транзитивность?
- Можно ли так реализовать equals(Object that) {return this.hashCode() == that.hashCode()}?
- В equals требуется проверять, что аргумент (equals(Object that)) такого же типа как и сам объект. В чем разница между this.getClass() == that.getClass() и that instanceof MyClass?
- Можно ли реализовать метод equals класса MyClass вот так: class MyClass {public boolean equals(MyClass that) {return this == that;}}?
- Будет ли работать HashMap, если все ключи будут возвращать int hashCode() {return 42;}?
- Зачем добавили HashMap, если уже был Hashtable?
- Согласно Кнуту и Кормену существует две основных реализации хэш-таблицы: на основе открытой адресацией и на основе метода цепочек. Как реализована HashMap? Почему так сделали (по вашему мнению)? В чем минусы и плюсы каждого подхода?
- Сколько переходов по ссылкам происходит, когда вы делаете HashMap.get(key) по ключу, который есть в таблице?
- Сколько создается новых объектов, когда вы добавляете новый элемент в HashMap?
- Как работает HashMap при попытке сохранить в нее два элемента по ключам с одинаковым hashCode, но для которых equals == false?
- HashMap может выродиться в список даже для ключей с разным hashCode. Как это возможно?
- Какое худшее время работы метода get(key) для ключа, которого нет в таблице (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))?
- Какое худшее время работы метода get(key) для ключа, который есть в таблице (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))?
- Объясните смысл параметров в конструкторе HashMap(int initialCapacity, float loadFactor).
- В чем разница между HashMap и IdentityHashMap? Для чего нужна IdentityHashMap? Как может быть полезна для реализации сериализации или клонирования?
- В чем разница между HashMap и WeakHashMap? Для чего нужна WeakHashMap?
- В WeakHashMap используются WeakReferences. А почему бы не создать SoftHashMap на SoftReferences?
- В WeakHashMap используются WeakReferences. А почему бы не создать PhantomHashMap на PhantomReferences?
- Сделайте HashSet из HashMap (используйте только множество ключей, но не множество значений).
- Сделайте HashMap из HashSet (HashSet
>). - Сравните интерфейсы java.util.Queue и java.util.Deque.
- Кто кого расширяет: Queue расширяет Deque, или Deque расширяет Queue?
- Почему LinkedList реализует и List, и Deque?
- В чем разница между классами java.util.Arrays и java.lang.reflect.Array?
- В чем разница между классами java.util.Collection и java.util.Collections?
- Напишите НЕмногопоточную программу, которая заставляет коллекцию выбросить ConcurrentModificationException.
- Что такое "fail-fast поведение"?
- Для множеств еnum-ов есть специальный класс java.util.EnumSet? Зачем? Чем авторов не устраивал HashSet или TreeSet?
- java.util.Stack - считается "устаревшим". Чем его рекомендуют заменять? Почему?
- Какая коллекция реализует дисциплину обслуживания FIFO?
- Какая коллекция реализует дисциплину обслуживания FILO?
- Приведите пример, когда какая-либо коллекция выбрасывает UnsupportedOperationException.
- Почему нельзя написать "ArrayList
- numbers = new ArrayList
();" но можно "List numbers = new ArrayList ();"? - LinkedHashMap - что это еще за "зверь"? Что в нем от LinkedList, а что от HashMap?
- LinkedHashSet - что это еще за "зверь"? Что в нем от LinkedList, а что от HashSet?
- Говорят, на LinkedHashMap легко сделать простенький кэш c "invalidation policy", знаете как?
- Что позволяет сделать PriorityQueue?
- В чем заключаются отличия java.util.Comparator от java.lang.Comparable?
- Что такоє символьная ссылка?
- Какая разница между I/О и NIO?
- Какие особенности NIO вы знаете?
- Какие существуют виды потоков ввода/вывода?
- Назовите основные классы потоков ввода/вывода.
- Чем отличаются и что общего у OutputStream, InputStream, Writer, Reader?
- Какие подклассы базового класса InputStream ви знаєте, для чего они предназначены?
- Что вы знаете о RandomAccessFile?
- Какие есть режимы доступа к файлу есть у RandomAccessFile ?
- Какие подклассы базового класса OutputStream ви знаєте, для чего они предназначены?
- Для чего используется PushbackInputStream?
- Для чего используется SequenceInputStream?
- Какие подклассы базового класса Reader ви знаєте, для чего они предназначены?
- Какие подклассы базового класса Writer ви знаєте, для чего они предназначены?
- Что такое абсолютный путь и относительный путь?
- В каких пакетах лежат классы-потоки?
- Что вы знаете о классах-надстройках?
- Какой класс-надстройка позволяет читать данные из входного байтового потока в формате примитивных типов данных?
- Какой класс-надстройка позволяет ускорить чтение/запись за счет использования буфера?
- Какие классы позволяют преобразовать байтовые потоки в символьные и обратно?
- В чем отличие класса PrintWriter от PrintStream?
- Какой класс предназначен для работы с элементами файловой системы?
- Какой символ является разделителем при указании пути в файловой системе?
- Какие методы класса File ви знаєте?
- Что вы знаете об интерфейсе FileFilter?
- Какие классы позволяют архивировать объекты?