Главная страница
Навигация по странице:

  • 20. Что такое IntStream и DoubleStream

  • 11. Java 8 1. Какие нововведения появились в java 8

  • 2. Какие новые классы для работы с датами появились в java 8

  • LocalDate

  • ZonedDateTime

  • TemporalAdjuster

  • 4. Что такое Nashorn не используется в современных версиях

  • 6. Какой класс появился в Java 8 для кодирования/декодирования данных используется в читалках (кодирование / декодирования в формат эл. книг)

  • 7. Как создать Base64 кодировщик и декодировщик

  • 8. Какие дополнительные методы для работы с ассоциативными массивами (maps) появились в Java 8

  • 9. Что такое LocalDateTime

  • 10. Что такое ZonedDateTime

  • 1. Что такое дженерики


    Скачать 0.84 Mb.
    Название1. Что такое дженерики
    АнкорCore-2
    Дата23.03.2022
    Размер0.84 Mb.
    Формат файлаpdf
    Имя файла02_CORE_2-1.pdf
    ТипДокументы
    #410542
    страница5 из 5
    1   2   3   4   5
    19. Расскажите о параллельной обработке в Java 8.
    Стримы могут быть последовательными и параллельными. Операции над последовательными стримами выполняются в одном потоке процессора, над параллельными — используя несколько потоков процессора. Параллельные стримы используют общий ForkJoinPool доступный через статический ForkJoinPool.commonPool() метод. При этом, если окружение не является многоядерным, то поток будет выполняться как последовательный. Фактически применение параллельных стримов сводится к тому, что данные в стримах будут разделены на части, каждая часть обрабатывается на отдельном ядре процессора, и в конце эти части соединяются, и над ними выполняются конечные операции.
    Для создания параллельного потока из коллекции можно также использовать метод parallelStream() интерфейса Collection.
    Чтобы сделать обычный последовательный стрим параллельным, надо вызвать у объекта Stream метод parallel(). Метод isParallel() позволяет узнать является ли стрим параллельным.
    С помощью, методов parallel() и sequential() можно определять какие операции могут быть параллельными, а какие только последовательными. Так же из любого последовательного стрима можно сделать параллельный и наоборот: collection
    .stream()
    .peek(
    )
    // операция последовательна
    .parallel()
    .map(
    )
    // операция может выполняться параллельно,
    .sequential()
    .reduce(
    )
    // операция снова последовательна
    Как правило, элементы передаются в стрим в том же порядке, в котором они определены в источнике данных. При работе с параллельными стримами система сохраняет порядок следования элементов.
    Исключение составляет метод forEach(), который может выводить элементы в произвольном порядке. И чтобы сохранить порядок следования, необходимо применять метод forEachOrdered().
    Критерии, которые могут повлиять на производительность в параллельных стримах:
    • Размер данных - чем больше данных, тем сложнее сначала разделять данные, а потом их соединять.
    • Количество ядер процессора. Теоретически, чем больше ядер в компьютере, тем быстрее программа будет работать. Если на машине одно ядро, нет смысла применять параллельные потоки.
    • Чем проще структура данных, с которой работает поток, тем быстрее будут происходить операции. Например, данные из ArrayList легко использовать, так как структура данной коллекции предполагает последовательность несвязанных данных. А вот коллекция типа LinkedList - не
    лучший вариант, так как в последовательном списке все элементы связаны с предыдущими/последующими. И такие данные трудно распараллелить.
    • Над данными примитивных типов операции будут производиться быстрее, чем над объектами классов.
    • Крайне не рекомендуется использовать параллельные стримы для скольких-нибудь долгих операций (например, сетевых соединений), так как все параллельные стримы работают c одним
    ForkJoinPool, то такие долгие операции могут остановить работу всех параллельных стримов в JVM из-за отсутствия доступных потоков в пуле, т.е. параллельные стримы стоит использовать лишь для коротких операций, где счет идет на миллисекунды, но не для тех где счет может идти на секунды и минуты;
    • Сохранение порядка в параллельных стримах увеличивает издержки при выполнении и если порядок не важен, то имеется возможность отключить его сохранение и тем самым увеличить производительность, использовав промежуточную операцию unordered(): collection parallelStream()
    .sorted()
    .unordered()
    .collect(Collectors toList());
    20. Что такое IntStream и DoubleStream?
    Кроме универсальных объектных существуют особые виды стримов для работы с примитивными типами данных int, long и double: IntStream, LongStream и DoubleStream. Эти примитивные стримы работают так же, как и обычные объектные, но со следующими отличиями:
    - используют специализированные лямбда-выражения, например, IntFunction или IntPredicate вместо Function и Predicate;
    - поддерживают дополнительные конечные операции sum(), average(), mapToObj()
    11. Java 8
    1. Какие нововведения появились в java 8?
    • Методы интерфейсов по умолчанию;
    • Лямбда-выражения;
    Функциональные интерфейсы;
    • Ссылки на методы и конструкторы;
    • Повторяемые аннотации;
    • Аннотации на типы данных;
    • Рефлексия для параметров методов;
    Stream API для работы с коллекциями;
    • Параллельная сортировка массивов;
    • Новое API для работы с датами и временем;
    • Новый движок JavaScript Nashorn;
    • Добавлено несколько новых классов для потокобезопасной работы;
    • Добавлен новый API для Calendar и Locale;
    • Добавлена поддержка Unicode 6.2.0;
    • Добавлен стандартный класс для работы с Base64;
    Добавлена поддержка беззнаковой арифметики;
    • Улучшена производительность конструктора java.lang.String(byte[], *) и метода java.lang.String.getBytes();
    • Новая реализация AccessController.doPrivileged, позволяющая устанавливать подмножество привилегий без необходимости проверки всех остальных уровней доступа;
    Password-based алгоритмы стали более устойчивыми;
    • Добавлена поддержка SSL/TLS Server Name Indication (NSI) в JSSE Server;
    • Улучшено хранилище ключей (KeyStore);
    • Добавлен алгоритм SHA-224;
    • Удален мост JDBC - ODBC;
    • Удален PermGen, изменен способ хранения мета-данных классов;
    • Возможность создания профилей для платформы Java SE, которые включают в себя не всю платформу целиком, а некоторую ее часть;
    • Инструментарий o Добавлена утилита jjs для использования JavaScript Nashorn; o Команда java может запускать JavaFX приложения;
    o Добавлена утилита jdeps для анализа .class-файлов.
    2. Какие новые классы для работы с датами появились в java 8?
    Новый же Java 8 Date/Time API содержит неизменные, потокобезопасные классы с продуманным дизайном на любой вкус и цвет. Содержатся они в пакете java.time
    §
    LocalDate – дата без времени и временных зон;
    §
    LocalTime время без даты и временных зон;
    §
    LocalDateTime дата и время без временных зон;
    §
    ZonedDateTime дата и время с временной зоной;
    §
    DateTimeFormatter форматирует даты в строки и наоборот, только для классов java.time;
    §
    Instant колличество секунд с Unix epoch time (полночь 1 января 1970 UTC);
    §
    Duration продолжительность в секундах и наносекундах;
    §
    Period период времени в годах, месяцах и днях;
    §
    TemporalAdjuster корректировщик дат (к примеру, может получить дату следующего понедельника);
    3. Расскажите про класс Optional
    Опциональное значение Optional — это контейнер для объекта, который может содержать или не содержать значение null. Такая обёртка является удобным средством предотвращения
    NullPointerException, т.к. имеет некоторые функции высшего порядка, избавляющие от добавления повторяющихся if null/notNull проверок:
    Optional optional = Optional.of("hello"); optional.isPresent(); // true optional.ifPresent(s -> System.out.println(s.length())); // 5 optional.get(); // "hello" optional.orElse("ops..."); // "hello"
    4. Что такое Nashorn? не используется в современных версиях
    Nashorn - это движок JavaScript, разрабатываемый на Java компанией Oracle. Призван дать возможность встраивать код JavaScript в приложения Java. В сравнении с Rhino, который поддерживается Mozilla Foundation, Nashorn обеспечивает от 2 до 10 раз более высокую производительность, так как он компилирует код и передает байт-код виртуальной машине Java непосредственно в памяти. Nashorn умеет компилировать код JavaScript и генерировать классы Java, которые загружаются специальным загрузчиком. Так же возможен вызов кода Java прямо из JavaScript.
    5. Что такое jjs?
    jjs это утилита командной строки, которая позволяет исполнять программы на языке JavaScript прямо в консоли.
    6. Какой класс появился в Java 8 для кодирования/декодирования данных? используется в
    читалках (кодирование / декодирования в формат эл. книг)
    Base64 - потокобезопасный класс, который реализует кодировщик и декодировщик данных, используя схему кодирования base64 согласно RFC 4648 и RFC 2045.
    Base64 содержит 6 основных методов: getEncoder()/getDecoder() - возвращает кодировщик/декодировщик base64, соответствующий стандарту
    RFC 4648; getUrlEncoder()/getUrlDecoder() - возвращает URL-safe кодировщик/декодировщик base64, соответствующий стандарту RFC 4648; getMimeEncoder()/getMimeDecoder() - возвращает MIME кодировщик/декодировщик, соответствующий стандарту RFC 2045.
    7. Как создать Base64 кодировщик и декодировщик?
    // Encode
    String b64 = Base64.getEncoder().encodeToString("input".getBytes("utf-8")); //aW5wdXQ==
    // Decode new String(Base64.getDecoder().decode("aW5wdXQ=="), "utf-8"); //input

    8. Какие дополнительные методы для работы с ассоциативными массивами (maps) появились
    в Java 8?
    ● putIfAbsent() добавляет пару «ключ-значение», только если ключ отсутствовал:
    ● map.putIfAbsent("a", "Aa");
    ● forEach() принимает функцию, которая производит операцию над каждым элементом:
    ● map.forEach((k, v) -> System.out.println(v));
    ● compute() создаёт или обновляет текущее значение на полученное в результате вычисления
    (возможно использовать ключ и текущее значение):
    ● map.compute("a", (k, v) -> String.valueOf(k).concat(v)); //["a", "aAa"]
    ● computeIfPresent() если ключ существует, обновляет текущее значение на полученное в результате вычисления (возможно использовать ключ и текущее значение):
    ● map.computeIfPresent("a", (k, v) -> k.concat(v));
    ● computeIfAbsent() если ключ отсутствует, создаёт его со значением, которое вычисляется (возможно использовать ключ):
    ● map.computeIfAbsent("a", k -> "A".concat(k)); //["a","Aa"]
    ● getOrDefault() в случае отсутствия ключа, возвращает переданное значение по-умолчанию:
    ● map.getOrDefault("a", "not found");
    ● merge() принимает ключ, значение и функцию, которая объединяет передаваемое и текущее значения. Если под заданным ключем значение отсутствует, то записывает туда передаваемое значение.
    ● map.merge("a", "z", (value, newValue) -> value.concat(newValue)); //["a","Aaz"]
    9. Что такое LocalDateTime?
    LocalDateTime объединяет вместе LocaleDate и LocalTime, содержит дату и время в календарной системе ISO-8601 без привязки к часовому поясу. Время хранится с точностью до наносекунды.
    Содержит множество удобных методов, таких как plusMinutes, plusHours, isAfter, toSecondOfDay и т.д.
    10. Что такое ZonedDateTime?
    java.time.ZonedDateTime — аналог java.util.Calendar, класс с самым полным объемом информации о временном контексте в календарной системе ISO-8601. Включает временную зону, поэтому все операции с временными сдвигами этот класс проводит с её учётом.
    1   2   3   4   5


    написать администратору сайта