В 2014м я сдал “Associate Java Programmer” - это было относительно несложно. Окрыленный успехом, практически без подготовки сунулся сдавать OCPJP и завалил. Поставил себе целью на 2016й сдать - и благополучно забыл. Осенью вспомнил - и решил, что за базар надо отвечать - засел за подготовку.
OCPJP - намного сложнее чем OCA. Для OCA фактически требуется только понимать базовые механизмы override и overload, String API и синтаксис языка.
OCP требует знания многопоточности (много вопросов на умение распознать deadlock’и), исключений, в том числе try-with-resources (например, если одно исключение кидается в close() а другое - в теле TWR - что выйдет наружу? А если исключение кинуто конструктором одного из объектов в процессе инициализации TWR?)
Много вопросов на Collections API (например, что будет при вызове remove(); peek(); poll() из пустых коллекций?), Concurrency API - вопросы на лоекры и семафоры были заявлены - но на деле их не было. А вот AtomicInteger, ExecutorService и Fork/Join паттерн - присутствовали в большом количестве. Вообще, в том или ином виде на многопоточность была едва ли не половина вопросов.
Отдельная тема - регулярные выражения. Не люблю я их, они меня всегда пугают. Их, к счастью, было мало - причем в итоговом фитбеке регэкспы не упомянуты у меня среди тем в которых были ошибки.
Каждый вопрос требует повышенной внимательности - то в Синглетоне пытаются объявить protected конструктор, то AssertionError ловят в catch(Exception e), то в сигнатуре метода, кидающего unchecked exception нет throws, то wait() вызывается не из synchronized блока.
Были вопросы на NIO2 - как простые (path1.relativize(path2) где path2 в другой файловой системе) так и несколько неожиданных - например, одинаков ли порядок получения event’ов в WatchKey для всех операционных систем (я не знаю…)
Были неприятные вопросы теоретические - например, какие паттерны обязаны(!) использовать принцип программирования в интерфейсах. Скорее всего - Factory и DAO, но не уверен.
Или если класс B содержит ArrayList - можно ли сказать что B has-a A?
Для подготовки существует много гайдов, но лучше всего, по-моему, использовать tutorial на сайте Oracle и читать Java DocAPI. И очень много кодить, проверяя самые разнообразные случаи.
Для «набивания» руки отлично подходят вопросы с сайта enthuware.com : 10 баксов стоит сет из 9 тестовых экзаменов по 65 вопросов в каждом. Вопросы очень близки к тому что было в реале, только чуть более сложные - запутанные. Я выбивал от 60 до 80% правильных ответов, в основном в р-не 70%. Реальный экзамен сдал с 81% при проходном балле 65%.
Резюме - экзамен достаточно сложен, но вполне сдаваем, подготовка занимает где-то два-три месяца по два-три часа в день.