Внимание!
ЦТ Pearson VUE и Certiport приостановили работу на территории Российской Федерации.
В связи с изменением курса рубля по отношению к иностранной валюте актуальную стоимость экзаменов уточняйте у наших операторов по контактным телефонам или электронной почте учебного центра Softline.
Сдача этого экзамена требуется для получения сертификации:
Сертифицированный специалист Oracle (Oracle Certified Associate), Программист Java SE 8.
Количество вопросов: 70
Проходной балл: 65%
Валидация: Этот экзамен был написан для версии Java SE 8.
Формат: Несколько вариантов ответа
Продолжительность: 150
К этому экзамену готовят курсы:
JSE8F — Java SE 8 Fundamentals>>
JSE8P — Java SE 8 Программирование/ Java SE 8 Programming>>
-
Отзывы
Ищете экзамены или тестирование Java SE 8 Programmer I / Программист Java SE 8, ступень I по технологиям Oracle? Обратитесь к надежному партнеру Softline – Учебному центру компании Softline. Каталог экзаменов УЦ Softline – самый полный и содержит только востребованные специалистами материалы.
Вы можете пройти испытания Java SE 8 Programmer I / Программист Java SE 8, ступень I в нашем Учебном центре. Мы будем рады стать вашим партнером и предоставить возможность пройти тест! В нашем центре есть онлайн-экзамены Oracle от Oracle, а также очные занятия.
После тестирования Java SE 8 Programmer I / Программист Java SE 8, ступень I вы получите международный сертификат от вендора, подтверждающий ваш профессиональный уровень знаний.
С чего нужно начать? Выберите в поиске нужный экзамен, оформите покупку и будьте уверены – совсем скоро вы сделаете еще один шаг в деле развития своих ИТ-компетенций.
Меня зовут Аксёнов Вячеслав и я бэкенд разработчик, пишу на Java/Kotlin, расскажу про то, как я сдавал сертификацию на знания Java SE 11 от Oracle. И какие нюансы я понял в процессе подготовки.
Предыстория. Зачем я решил сдавать?
Начну с того, что идея по сдаче именно этой сертификации сидела у меня в голове очень давно. Перед глазами был пример моей жены, у которой есть крайне солидный опыт ETL разработки и сертификат Oracle по базам данных в придачу. Когда ей надоело заниматься построением сложных запросов, она захотела перейти в разработку и писать на Java.
Процесс собеседования Java разработчика до миддла имеет примерно стандартный вид — секция с алгоритмами, секция с java core и конечно секция с знаниями БД. В ее случае на секции БД собеседующие посмотрели на сертификат, на предыдущий опыт и предложили ей самой их пособеседовать. Это конечно просто курьезный случай и все такое, но передо мной есть пример того, как сертификат отлично сработал и помог срезать углы при найме.
Я включил фантазию и представил как может в моем случае помочь сертификат от того же оракла, но по Java. Погуглил и наткнулся на скидку в 90% в честь юбилея Java на сайте оракл и до конца этого периода оставалось всего 2 недели. Что делать? Конечно надо сдавать! Но надо же готовиться? Да не, еще целых 2 недели, успеешь — сказал мне внутренний голос. Так прошла неделя и я начал что-то подозревать…
Для понимания моего бэкграунда — 6 лет специалитета в МГТУ им Н. Э. Баумана, совмещенных с youtube деятельностью, которая никак не относилась к разработке, но занимала все свободное время. После окончания универа прохождение лютого полугодового экспресс курса по java от сотрудников Сбера, которые искали джунов навырост. И опыт работы в размере 2х лет на Java 7-8-11.
Как изменился процесс сдачи?
Дальше нужно несколько слов рассказать про саму сертификацию — как она проходит в период пандемии, на что делается упор при проверке и какие вопросы сейчас есть.
Я уверен, что процесс получения сертификации оракла сейчас выглядит удобнее и приятнее всего, что было раньше:
-
Во первых — раньше было 2 экзамена по 180 минут — сейчас один на час
-
Во вторых — раньше в каждом экзамене было 90 вопросов (в сумме 180), а сейчас всего 50.
То есть со стороны потраченных умственных усилий на сдачу стало проще.
Но это все не значит, что готовиться не нужно. Потому что вся эпопея с сертификацией следующая — она не проверяет твои знания Java. Она проверяет — знание слабых мест и скользких моментов. По крайней мере таким было мое ощущение.
А также — знания использования последних модных фич из Java старше 8.
Нюансы по поводу сдачи сейчас, в период ковида
Я очень хорошо тащил задачи по работе и считал себя вполне солидным специалистом, которому горы по плечо и море по колено, не то что ваша сертификация. Поэтому готовиться мне было откровенно лень. Но оставалась неделя и надо было начинать хоть что-то делать. Я подумал, что смогу хакнуть систему и воспользоваться ковидными условиями и возможностями сдачи по удаленке и смогу сдавать без подготовки пока не сдам.
Если у кого-то будет такая же идея, то вынужден вас огорчить — после исследования документации выяснилось, что пересдавать можно минимум через месяц и в сумме 2-3 раза в год. Таким образом мой план уверенно отправился на свалку.
Ну что поделать, значит нужно сдавать прямо сейчас и с первого раза. Oracle предоставляет «подробные» и полные курсы подготовки к сертификации и так как был праздник, то в период акции они были бесплатными. Честно говоря, в моем случае эти лекции оказались чуть более бесполезными, чем полностью. Там действительно поверхностно покрываются многие темы и фишки java и фичи последних версий. Но для меня это никак не укладывалось в голове. Потому что я некоторыми вещами совсем не пользовался, а просто зазубривать мне не хотелось.
Вся структура сертификации строится следующим образом — есть 5-10 тем, которые важны. И на каждую из этих тем есть по 2-4 вопроса. И в сумме нужно набрать 68% правильных ответов. Значит, что достаточно 34 правильных ответа.
Дальше включаем математику — как набрать эти правильные ответы и мой путь, который я выбрал — полная фокусировка на тех темах, которые я уже знаю и с которыми в реальной жизни работаю и полный игнор тех тем, которые я в реальной жизни не использовал и не видел.
Таким образом проигнорировав глубокие детали для 2-3 тем, которые мне не понравились я освободил себя от 60% работы, которая меня не устраивала. И начал усиленно учить остальное.
Сам процесс сдачи
Так прошли оставшиеся дни до конца акции. Дальше тянуть было нельзя, нужно было сдавать.
Сайт по моему непрофессиональному мнению сайт оракл имеет довольно сложную логику интерфейса и продраться через него до желаемого оказалось не так то просто. Закладывайте часть своих моральных сил на всю организацию.
В конце концов дошел до страницы с регистрацией непосредственно на экзамен, к моему удивлению запись была очень ограничена — выделяются квоты по часам на каждый день, нельзя просто прийти и в свободном ключе выбрать любое время и сдать как удобно. Насколько я понял, ограничен ресурс проверяющих и поэтому дело выглядит довольно близко к атмосфере настоящего экзамена. Хорошо, что ехать никуда не надо.
Дальше интереснее — будет предложена программа в которой будет выполняться сам экзамен. Программа проверит наличие других запущенных программ, подключенных девайсов и наличие вебкамеры. Вебкамера обязательна!
Сам процесс прохождения теста выглядит следующим образом — вы подключается за 15-30 минут до начала и в приложении встаете в очередь на проверку.
В этот момент человек с другой стороны проверяет ваши документы и ставит вас в очередь, все это время важно не отходить, потому что курирующий ваш экзамен человек может подключиться в любой момент. Напомню, что все это время у вас включена камера.
Дальше подключится куратор, который будет наблюдать за вами на всем протяжении экзамена. Рядом с вами должен находиться только компьютер и ваши документы. Никаких других девайсов, шпаргалок, книг и прочих предметов быть не должно. А в комнату не должен никто заходить и не должно быть слышно подозрительных звуков, которые могут вас скомпрометировать. Если бы я занимался раздачей советов, то посоветовал бы к моменту сдачи рассчитывать только на свои силы и не пытаться обмануть куратора. С одной стороны его не видно и может быть ему без разницы как вы сдаете, но с другой стороны все может быть и наоборот. Аннулировать сдачу ничего не стоит. Так что я бы не провоцировал.
Примеры вопросов
Сам экзамен идет ровно по таким вопросам и темам, которые объявляются в процессе подготовки, а конкретно: https://education.oracle.com/java-se-11-developer/pexam_1Z0-819
Примеры вопросов:
8 public class SuperClass {
9 private final int x = 1;
10 static final int y;
11 public SuperClass() {
12 System.out.println(x);
13 System.out.println(y);
14 }
15 public static void main(String[] args) {
16 new SuperClass();
17 }
18 }
Какой будет результат?
А - компилятор упадет на 13 строке
B - компилятор упадет на 16 строке
C - 1
D - компилятор упадет на 9 строке
E - 10
Правильный ответ: A
Следующий пример:
char[][] arrays = {{'g', 'j'}, {'h', 'k'}, {'i', 'l'}};
for (char[] xx : arrays) {
for (char yy : xx) {
System.out.print(yy);
}
System.out.print(" ");
}
какой результат?
А - gj hk il
B - ghi jkl
C - gh ij kl
D - compilation fails
E - ArrayIndexOfBoundsException in runtime
Правильный ответ - A
И такого рода вопросов с подвохами или на “проверь как умеешь компилировать в уме” их много.
Итоги
Вся подготовка привела к моей сдаче сертификации с первого раза на 87% и добавлением новой плашки в свое резюме.
Если вы имеете какой-никакой опыт коммерческой разработки с Java 8+, то вам достаточно будет выделить 1-2 недели своего времени и получить сертификацию, которая потенциально сильно облегчит ваш процесс найма.
Буду рад вашим историям в комментариях — как наличие сертификации повлияло на вашу профессиональную жизнь
Всем привет! В этом году Oracle зарезилил свои экзамены по Java 8 — для сдачи стали доступны Associate (1Z0-808) и Professional (1Z0-809). В этой статье я хочу поделиться опытом прохождения новых экзаменов и подробнее раскрыть встречающиеся темы из восьмой версии. Большая часть будет посвящена Professional, так как он наиболее интересен. Также я не буду поднимать философские вопросы о том, надо ли это вообще — поговорим о технической стороне и о том, как подготовиться к сертификации.
О процедуре заказа уже написано много статей, подробно останавливаться на этом месте смысла не вижу. Регистрируемся на PearsonVUE и Oracle CertView, связываем аккаунты, заказываем, оплачиваем и идем сдавать. Сертификационных центров в Киеве хватает (около десятка), и расписание очень гибкое.
Есть приятный бонус. В этом году Java празднует свое 20-летие, и поэтому во всем мире до конца 2015 года действует скидка 20% на все Java-экзамены. Просто введите промокод «Java20» при оплате на PearsonVUE. Судя по всему, есть возможность заказывать со скидкой на январь 2016.
Oracle Certified Associate (1Z0-808)
Associate — это начальный уровень. Здесь проверяют базовые знания языка. На странице экзамена доступен список тем.
Также можно ознакомиться со списком отличий 7-й и 8-й версий. Если сказать в целом, экзамен по 8 — это такой экзамен по 7, где вас дополнительно спросят о лямбдах и new Date and Time API.
Что есть для подготовки:
— Первая часть книги OCA/OCP Java SE 7 Programmer I & II Study Guide by Kathy Sierra & Bert Bates;
— OCA: Java SE 8 Programmer I Study Guide by Jeanne Boyarsky & Scott Selikoff;
— Очень полезный материал Maurice Naftalin’s Lambda FAQ;
— Java 8 Date and Time.
В практических тестах можно потренироваться на Quizful или выбрать что-нибудь отсюда.
Date and Time
Oracle обожает новый API. Вас ожидают вопросы по основным сущностям пакета java.time.
По факту нужно помнить, что все основные классы являются immutable, и не попадаться на глупых вопросах:
LocalDate localDate = LocalDate.now();
localDate.plus(1, ChronoUnit.DAYS);
В данном случае c оригинальным объектом ничего не произойдет.
То же самое касается Period, ZonedDateTime и других. Никаких родственных связей у этих классов нет (но методы преобразования присутствуют).
LocalDateTime localDateTime = LocalDate.now(); //ошибка компиляции
Ничего суперсложного не будет, просто хорошо почитайте материал и потренируйтесь в IDE.
Лямбды
Здесь также будут базовые вопросы: что это такое, в чём фишка, замените лямбду анонимным классом, перепишите кусок кода с использованием лямбд и так далее. Стоит иметь представление о базовых интерфейсах пакета java.util.function (Consumer, Supplier, Function, Predicate, UnaryOperator).
Также будут вопросы о видимости переменных — в Java 8 появился термин effectively final variable (local variables referenced from a lambda expression must be final or effectively final). Пример:
List<String> list = new ArrayList<>(); list.add("Hi"); list.add("Toast"); list.add("Beer"); int count = 2; list.removeIf((String s) -> s.length() <= count); //1 list.forEach((s) -> System.out.println(s)); //2 if (list.size() == 2) { count = 5; //3 } else { System.out.println("Hello!"); }
В данном случае мы получаем ошибку компиляции в строке 1, так как переменная count изменяется в блоке if и перестает быть effectively final. Если убрать строку 3, всё будет окей. Обратите внимание, что изменение происходит после обращения, но компилятор отслеживает такие вещи. String s в строке 1 не имеет никакого отношения к s в строке 2 — это локальные имена аргументов и разные способы объявления.
Сам экзамен довольно прост. Просто будьте внимательны.
Oracle Certified Professional (1Z0-809)
Он же бывший SCJP. Список тем лежит на странице экзамена. Есть и список отличий 7-й и 8-й версий.
Экзамен появился лишь в августе. В связи с этим есть нюансы — study guide’ы на момент написания статьи отсутствуют. Ближайший релиз ожидается 21-го декабря: OCP: Java SE 8 Programmer II Study Guide by Jeanne Boyarsky & Scott Selikoff.
Как готовиться:
— Материалы по OCA;
— Вторая часть OCA/OCP Java SE 7 Programmer I & II Study Guide by Kathy Sierra & Bert Bates;
— Java SE 8 for the Really Impatient by Cay Horstmann;
— Летом был замечательный курс Oracle JDK 8 Lambdas and Streams. Материалы доступны на YouTube;
— А если и этого мало — Java 8 Stream tutorial;
— Любые mock-тесты. Например, Enthuware 1Z0-809.
Что будет на экзамене? Для начала все классические темы, вопросы по которым «проапгрейджены» с использованием нового синтаксиса и приёмов. Ну и, конечно же, Java 8 (особенно Stream API). О новых темах, которые мне встретились, я и хочу написать ниже.
Optional
Одно из нововведений. Помимо собственной функциональности, активно используется Stream API (reduce, max, min, findAny, etc.). Где искать подвоха и что важно понимать? Optional призван избавить нас от NullPointerException. Так ли это на самом деле?
Optional<String> opt = Optional.of(null);
System.out.println(opt); //и получаем NPE :)
Для избавления существует метод ofNullable. Но и тут есть свой нюанс:
Optional<String> opt = Optional.ofNullable(null); //вернёт Optional.empty
System.out.println(opt.get()); //NoSuchElementException
Почему так было сделано и почему существует of и ofNullable — я нагуглил здесь.
Нельзя изменить контент Optional после создания. Любые манипуляции возвращают новый объект.
Optional<String> optional = Optional.empty(); if (optional.isPresent()) { System.out.println("Yes"); } else { optional.of("Java"); } System.out.println(optional.orElse("Unknown"));
Здесь будет выведено «Unknown» — optional.of(«Java») вернул новый объект, но никуда не присвоил.
Interfaces / Functional Interfaces
Начнем с default/static методов. Есть хороший раздел из Maurice Naftalin’s Lambda FAQ. Со static следует помнить, что в отличии от статических методов класса, статические методы интерфейса не могут быть вызваны через ссылку на объект:
interface One { static void foo() {} } class Alpha implements One { } public static void main(String[] args) { One.foo(); //ок One obj = new Alpha(); obj.foo(); //ошибка компиляции }
Дефолтные методы можно переопределять, но нельзя переопределять статические методы дефолтными и обратно:
interface One { default void foo() { System.out.println("One"); } } interface Two extends One { default void foo() { System.out.println("Two"); } static void foo() { //ошибка компиляции System.out.println("Static Two"); } }
Не стоит пугаться количества функциональных интерфейсов в java.util.function. Основных там не много, и они достаточно хорошо описаны в литературе или документации. Все остальные — это специализации (Bi, Int, Double, Long, etc.). Если почитаете и потренируетесь в IDE, проблем возникнуть не должно.
Если быть невнимательным, можно попасться на чем-то таком:
Function<String> f = name::toUpperCase;
Данный код не скомпилируется, потому что Function<T, R> принимает аргумент и возвращаемый тип. Один аргумент может принимать специализация, например, IntFunction<R> (принимает int, возвращает R).
Еще один пример:
Stream<Double> stream = DoubleStream.of(1, 2, 3).boxed(); UnaryOperator<Integer> unaryOperator = x -> x * 2; stream.map(unaryOperator).forEach(System.out::println);
Получаем ошибку компиляции, потому что map ожидает UnaryOperator<Double>
. Но помимо нормального решения, её можно обойти некоторыми извращенными способами. Например, заменив вызов map(unaryOperator) на map(x -> unaryOperator.apply(Integer.valueOf(x.intValue()))) (не делайте так никогда).
Method / Constructor References
По ссылкам на методы в дополнение к основным материалам также хороший материал есть на Oracle docs.
Гораздо больше можно запутаться в ссылках на конструкторы. Базовое объяснение довольно простое:
Supplier<String> supplier = () -> new String();
превращается в
Supplier<String> supplier = String::new;
Ну и вызываем:
String str = supplier.get();
Другого синтаксиса, например, String():new, String::new(«test«>) быть не может. Это вызовет ошибку компиляции. Но что, если в конструктор требуется передать аргументы? Supplier нам уже не подойдет, его метод T get() ничего не принимает.
Создаем свой (также можно воспользоваться Function):
interface SupplierWithArg<T, U> { T get(U arg); } SupplierWithArg<String, String> supplier = String::new; String str = supplier.get(“Java 8");
В данном случае синтаксис ссылки на конструктор никак не поменялся. Компилятор сам определил, какой конструктор класса String вызвать. В случае отсутствия подходящего конструктора, конечно же, будет ошибка компиляции.
А если аргумент параметризован? Например, у нас есть класс:
class Student { List<String> grades; public Student(List<String> grades) { this.grades = grades; } }
И функциональный интерфейс:
interface SupplierWithParamArg<T, U> { T get(List<U> arg); }
В данном случае Student::new не прокатит, компилятору нужно указать тип. Это можно сделать так:
List<String> grades = Arrays.asList("A", "B", “C"); SupplierWithParamArg<Student, String> supplier = Student::<String>new; Student student = supplier.get(grades);
Stream API
There are 95 methods in 23 classes that return a Stream
Many of them, though are intermediate operations in the Stream interface
71 methods in 15 classes can be used as practical Stream sources
(JDK 8 MOOC Lambdas and Streams)
Самое важное нововведение. Более половины вопросов будет именно об операциях со стримами. И также они будут фигурировать в вопросах на общие темы. Ключевым интерфейсом является Stream<T>
— он содержит практически все методы, которые будут упомянуты ниже.
Теперь о частых ошибках:
— Операции со стримами делятся на intermediate и terminal (в документации всегда можно увидеть, к какому типу относится метод);
— Для отработки стрима необходимы две вещи — source и terminal operation;
— Intermediate-операции «are lazy when possible». Они не выполняются, пока не потребуется результат.
Эти три пункта ведут к следующему:
List<StringBuilder> list = Arrays.asList(new StringBuilder("Java"), new StringBuilder(“Hello")); list.stream().map((x) -> x.append(" World”)); list.forEach(System.out::println);
Выведет:
Java
Hello
Не произошло абсолютно ничего, потому что map является intermediate-операцией, которая добавила преобразование и вернула новый стрим. Но без вызова terminal-операции мы просто «вяжем» свои вычисления до финального результата.
Стоит добавить любую terminal-операцию:
list.stream().map((x) -> x.append(" World”)).count(); // count возвращает кол-во элементов стрима.
и стрим отработает. Объекты листа будут изменены в:
Java World
Hello World
Стрим нельзя использовать повторно, если на нем отработала terminal-операция:
List<StringBuilder> list = Arrays.asList(new StringBuilder("Java"), new StringBuilder("Hello")); Stream<StringBuilder> stream = list.stream().map((x) -> x.append(" World")); long count = stream.count(); Object[] array = stream.toArray(); // java.lang.IllegalStateException
Обратите внимание, что метод close для интерфейса Stream не является terminal-операцией. Он идет от интерфейса AutoCloseable, который наследует BaseStream.
Специализированные версии стримов (DoubleStream, IntStream, LongStream) позволяют уйти от создания лишних объектов и autoboxing/unboxing. Мы работаем напрямую с примитивами. У интерфейса Stream есть соответствующие методы для преобразования — mapToXXX / flatMapToXXX. У специализированных версий метод boxed делает обратное — возвращает Stream<xxx>. Ещё у IntStream и LongStream есть интересные методы range и rangeClosed, генерирующие последовательность значений с шагом 1.
Интересную подборку частых ошибок при работе со стримами можно увидеть здесь.
Например, порядок операций и методы skip, limit:
IntStream.iterate(0, i -> i + 1) .limit(10) .skip(5) .forEach((x) -> System.out.print(x + " "));
Выведет: 5 6 7 8 9.
Меняем местами:
IntStream.iterate(0, i -> i + 1) .skip(5) .limit(10) .forEach((x) -> System.out.print(x + " "));
Получаем: 5 6 7 8 9 10 11 12 13 14.
Short-circuit operations
О чем стоит помнить на экзамене? Методы anyMatch, allMatch, noneMatch принимают Predicate и возвращают boolean. Также в названиях методов заложена механика их работы.
Stream<Integer> values = IntStream.rangeClosed(0, 10).boxed(); values.peek(System.out::println).anyMatch(x -> x == 5);
Будет выведена последовательность от 0 до 5. При x = 5 предикат вернет true, и стрим закончит работу.
Методы findFirst, findAny не принимают аргументов и возвращают Optional (потому что результата может и не быть).
C findAny не всё так просто:
Optional<Integer> result = IntStream.rangeClosed(10, 15) .boxed() .filter(x -> x > 12) .findAny(); System.out.println(result);
Казалось бы, данный код всегда выведет Optional с 13 внутри. Однако, findAny не гарантирует последовательности, он может выбрать любой элемент. Особенно это касается parallel-стримов (для производительности которых он был и создан). Для стабильного результата существует findFirst.
Reduction / Mutable Reduction
Самое простое по этой теме: методы min и max принимают Comparator и возвращают Optional.
За агрегирование результата отвечает reduce. Простейшая его версия принимает BinaryOperator (два аргумента — полученное на предыдущем шаге значение и текущее значение). Возвращает всегда одно значение для стрима, завернутое в Optional.
Например, max может быть заменен на:
.reduce((x, y) -> x > y ? x : y)
Или еще проще
.reduce(Integer::max)
Версия с корнем (identity) аккумулирует вычисление на основе типа корня:
T reduce(T identity, BinaryOperator<T> accumulator))
int sum = IntStream.range(0, 9).reduce(0, (x, y) -> x + y);
Mutable reduction позволяет не просто выдать результат, но и завернуть его в какой-нибудь контейнер (например, коллекцию). Для этого у стрима есть методы collect.
Стоит помнить, что collect в простейшей его версии принимает три аргумента:
<R> R collect(Supplier<R> supplier, BiConsumer<R,? super T> accumulator, BiConsumer<R,R> combiner)
Supplier — возвращает новые инстансы целевого контейнера на текущем шаге.
Accumulator — собирает элементы в него.
Combiner — сливает контейнеры воедино.
Пример collect для ArrayList в роли контейнера:
List<String> asList = stringStream.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
Также был добавлен класс Collectors с множеством уже реализованных удобных операций. Рассмотрите его методы и хорошенько поиграйтесь в IDE. Например, по groupingBy вопросов будет достаточно. Пример:
List<String> list = Arrays.asList("Dave", "Kathy", "Ed", "John", "Fred"); Map<Integer, Long> data = list.stream() .collect(Collectors.groupingBy(String::length, Collectors.counting())); System.out.println(data);
Напоминает GROUP BY из SQL. Метод группирует значения по длине строки и данная его версия возвращает Map. Получаем вывод: {2=1, 4=3, 5=1}.
Ещё есть интересный метод partitioningBy. Он организует элементы согласно предикату в Map<Boolean, List<T>>
:
Stream<Integer> values = IntStream.rangeClosed(0, 10).boxed(); Object obj = values.collect(Collectors.partitioningBy(x -> x % 2 == 0)); System.out.println(obj);
Вывод:{false=[1, 3, 5, 7, 9], true=[0, 2, 4, 6, 8, 10]}
Parallel streams
По этой теме вопросов откровенно мало. Не волнуйтесь, вас и так будут спрашивать по многопоточности и Fork/Join Framework. По последнему может начаться настоящий трeш и угар. От простых вопросов: «Что это такое? Преимущества?» и «RecursiveTask vs RecursiveAction» до огромных полотен кода с сортировками массивов.
Под капотом параллельных стримов как раз и работает ForkJoinPool.
Для начала — методы parallel / sequential являются intermediate-операциями. С их помощью можно определять тип операций. Стрим может переходить из sequential в parallel и обратно. По-дефолту Collection.stream возвращает sequential-стрим.
List<Integer> list = IntStream.range(0, 256).boxed().collect(Collectors.toList()); int sum = list.stream() .filter(x -> x > 253) .parallel() .map(x -> x + 1) .sequential() .reduce(Integer::sum).orElse(0);
forEachOrdered наряду с forEach существует не просто так.
Например:
IntStream.range(0, 9).parallel().forEach(System.out::println)
Будут выведены числа от 0 до 8 в непредсказуемом порядке. Метод forEachOrdered заставит вывести их в натуральном порядке. Но он не сортирует данные (if the stream has a defined encounter order © JavaDoc).
Еще нюанс — далеко не факт, что параллельный стрим всегда заставит вычисления обрабатываться в разных потоках:
List<String> values = Arrays.asList("a", "b"); String join = values.parallelStream() .reduce("-", (x, y) -> x.concat(y)); System.out.println(join);
Если тут случится распараллеливание, и результат будет обрабатываться в двух разных потоках, на выходе получим —a-b. Каждый элемент по отдельности сольется с корнем, а затем всё сольется воедино. Но этого может и не произойти, тогда на первом шаге получим -a, а финальным результатом будет -ab.
Collections
Наиболее видимые изменения: Iterable и Map получили forEach. Обратите внимание, что для Map он принимает BiConsumer (два аргумента для ключа и значения):
Map<Integer, String> map = new HashMap<>(); map.put(1, "Joe"); map.put(2, "Bill"); map.put(3, "Kathy"); map.forEach((x, y) -> System.out.println(x + " " + y));
Кстати, можно вполне себе выводить, например, только значения. Не обязательно использовать все аргументы в выражении — map.forEach((x, y) -> System.out.println(y));
Далее, Collection получил stream() и parallelStream().
Могут попасться теоретические вопросы на тему работы HashMap. HashMap, LinkedHashMap, ConcurrentHashMap ведут себя иначе в Java 8. Грубо говоря, когда с хэшами беда и количество элементов связного списка в корзине переваливает за определенное значение, то список превращается в сбалансированное дерево. Об этом можно почитать, например, здесь или здесь.
Date and Time
Здесь придется углубиться в функционал новых классов. Duration манипулирует датами в разрезе часов/минут/секунд. Period использует дни/месяцы/годы. Где будет видна эта разница больше всего? При смещении временных диапазонов и переходом на летнее/зимнее время.
Например, в этом году в Украине переход на зимнее время состоялся 25 октября в 4 часа ночи (на час назад):
LocalDateTime ldt = LocalDateTime.of(2015, Month.OCTOBER, 25, 3, 0); ZonedDateTime zdt = ZonedDateTime.of(ldt, ZoneId.of("EET")); zdt = zdt.plus(Duration.ofDays(1)); System.out.println(zdt); zdt = ZonedDateTime.of(ldt, ZoneId.of("EET")); zdt = zdt.plus(Period.ofDays(1)); System.out.println(zdt);
Данный код выведет:
2015-10-26T02:00+02:00[EET]
2015-10-26T03:00+02:00[EET]
Что произошло? Duration добавил к дате конкретные 24 часа (потому что длительность одного дня всегда 24 часа). При переходе получаем на час меньше. Period же добавил конкретный день, и локальное время сохранилось.
I/O, NIO 2
Касаемо общих вопросов, стоит хорошо ориентироваться в операциях Path — normalize, relativize, resolve. А также StandardOpenOption. Но об этом будет достаточно в рекомендуемой литературе.
Теперь о Java 8. Вас могут ожидать не очень сложные вопросы про чтение и обработку текстового файла. В Files и BufferedReader появился метод lines(), возвращающий стрим, который состоит из строк выбранного файла.
Например, вывести строки:
Files.lines(Paths.get(“file.txt”)).forEach(System.out::println);
Или — разбить на слова, убрать дубликаты, перевести в нижний регистр и отсортировать по длине:
try (BufferedReader reader = Files.newBufferedReader( Paths.get("file.txt"), StandardCharsets.UTF_8)) { List<String> list = reader.lines() .flatMap(line -> Stream.of(line.split("[- .:,]+”))) .map(String::toLowerCase) .distinct() .sorted((w1, w2) -> w1.length() - w2.length()) .collect(Collectors.toList()); }
Кроме этого, в классе Files стримы также используют методы list, find и walk.
Заключение
Надеюсь, я смог немного раскрыть встречающиеся темы. К сожалению, исключительно из личного экзаменационного опыта нельзя описать всё возможное.
Еще несколько общих советов:
— Не нервничайте:). Вопросы в целом адекватные и без извращений. У Oracle нет цели завалить вас кривыми тестами;
— Также стоит следить за временем. На оба экзамена дается 2,5 часа. Лично у меня на OCA еще оставалось минут 40 на перепроверку, а вот в случае с OCP — около 15-ти;
— При подготовке посвящайте больше времени практике — это даст куда больше зазубривания книг. Открывайте IDE и пробуйте любые непонятные вещи.
Удачи!
Table of Contents
Java is one of the most widely used programming languages in the IT industry. It is used by both individuals and organizations and will continue to be the case in the future.
The Oracle Corporation is responsible for the development of the Java platform and its Oracle Java courses are some of the best. Each of the java certification courses listed here comes from Oracle, and verifies a certain level of expertise and knowledge of Java, with respect to specific domains.
Before we look at the best online Java certification courses, let’s take a look at some general questions about them.
How to Prepare for a Java Certification Exam
You can consider several ways to help you prepare for a Java certification exam. You could develop some Java applications or programs on your own as it will give you some much-needed hands-on experience. You could also read some of the best Java books. Lastly, keep up with the latest changes in the Java platform.
Top Oracle Java Certification Courses Online
The best Java certification course online will depend on your exact needs, but the ones listed here cover a good range. Some are for beginners, others are for more advanced Java programmers.
1. Oracle Certified Associate, Java SE 8 Programmer Certification
Exam Details |
Syllabus |
Code: 1Z0-808 Duration: 150 minutes Passing Score: 65% Prerequisites: None Total Number of Questions: 70 Type: Multiple Choice Cost: $244 |
|
The Oracle Certified Associate, Java SE 8 Programmer Certification is the first step towards gaining professional certification as a Java SE 9 developer. It covers the basics of Java. After taking and passing this exam, you will have to obtain the Oracle Certified Professional (OCP).
To pass this exam, you will need a thorough knowledge of the concepts listed in the syllabus. You can take the Java SE 8 training offered by Oracle if necessary.
View Course
2. Oracle Certified Professional Java Programmer (OCPJP) [Java SE 8 Programmer II]
Exam Details |
Syllabus |
Code: 1Z0-809 Duration: 150 minutes Passing Requirement: 65% Prerequisite: OCAJP 8 Total Number of Questions: 85 Type: Multiple Choice Cost: $244 |
|
The Oracle Certified Professional Java Programmer or OCPJP is a professional-level certification. It validates the candidate’s knowledge and expertise of Java code development in Java SE 8. This certification is best for those with professional experience with Java.
It is the second of the two exams, the first being the OCAJP, required to demonstrate having the necessary high-level skills for becoming an expert Java developer.
View Course
3. Oracle Certified Professional: Java SE 11 Developer
Exam Details |
Syllabus |
Code: 1Z0-819 Duration: 90 minutes Passing Requirement: 68% Prerequisite: None Total Number of Questions: 50 Type: Multiple Choice Cost: $244 |
|
This Java programming certification is similar to those mentioned above. However, this one is for Java Standard Edition 11. It also covers the basics of Java, such as methods, data types, and the creation of simple Java programs.
View Course
4. Oracle Certified Professional, Java EE 7 Application Developer Certification
Exam Details |
Syllabus |
|
|
The Oracle Certified Professional Java EE 7 Application Developer certification validates a candidate’s ability to develop as well as deploy applications using the Java Enterprise Edition 7.
This certification is ideal for Java frontend and backend application developers, architects, and software engineers with intermediate to advanced level expertise in using Java EE 7.
View Course
5. Oracle Certified Foundations Associate, Java Certification
Exam Details |
Syllabus |
Code: 1Z0-811 Duration: 150 minutes Passing Score: 65% Prerequisites: None Total Number of Questions: 75 Type: Multiple Choice Cost: $244 |
|
The Oracle Certified Foundations Associate, Java Certification is a good foundational course in Java programming. It is particularly good for young learners and does not assume any prior hands-on experience.
View Course
6. Oracle Certified Professional: Java SE 17 Developer Certification
Exam Details |
Syllabus |
Code: 1Z0-829 Duration: 90 minutes Passing Score: 68% Prerequisites: None Total Number of Questions: 50 Type: Multiple Choice Cost: $244 |
|
The Oracle Certified Professional: Java SE 17 Developer Certification is similar to the other Java SE certifications on this list, except that it focuses on SE 17. You will learn and demonstrate proficiency in features, practices, and concepts incorporated into Java SE 17.
View Course
Get Started with These Java Certification Courses
Learning Java is not as difficult as some may say it is. Certification in Java, like the ones mentioned in this list, can show you just how important this class-based, multi-paradigm, high-level, general-purpose programming language is.
If you’re preparing for an upcoming Java interview, why not read some of the most common Java Interview questions? Or you could take a look at Java courses from other platforms.
Java Programming Masterclass updated to Java 17
FAQ
Is it Worth Getting a Java Certification?
Getting a Java certification can be absolutely worth it. A Java certification assures the employer that the candidate has the specified level of Java expertise and knowledge depending on the type of certification they possess. It also keeps you abreast of the latest developments in the Java programming language.
Which Online Java Certification Course is the Best?
There is no specific best Java certification course. Each course will have its own focus and prepare you for a particular set of responsibilities. That said, you want to take a course from a reputed certification provider, like Oracle. If you are completely new to this, start with the basic Java certification course.
How Much Does Java Certification Cost?
The exact cost of a particular Java certificate will vary depending on the specific course, the platform you take the course from, and the country you belong to. Typically the more advanced courses will cost more. For Oracle Java certification courses, like the ones listed here, expect to pay just under $250.
Is Java Certification Enough to Get a Job?
So long as you have the knowledge and a portfolio of work to show, you should be in a good position to get a related job. A certification for Java developers can go a long way in showing your employer that you have the skills and expertise to take up a role.
People are also reading:
- Best Java Courses
- Top 10 Java Certifications
- Best Java Books
- Best Java Projects
- Top Java Programming Interview Questions
- Core Java Cheatsheet — Introduction to Programming in Java
- Difference between Java vs Javascript
- Top 10 Java Frameworks
- Best Way to Learn Java