О новых возможностях JDK8, которые часто задают в интервью

Java

Преамбула

Интервьюеры часто спрашивают о новых возможностях нового JDK, особенно о возможностях JDK8.

Ниже сначала будет объяснен выпуск версии JDK и кратко представлены основные новые функции JDK8.

в основном включает:

  • Новые возможности языка
  • Модификация объектов коллекции
  • Новые возможности JVM
  • Модификация HashMap

обрати внимание на""Нетипичный научный мужчина"" публичный аккаунт, ответдокументация JDKПолучите официальную коллекцию документов JDK.

Почему в интервью часто спрашивают о новых возможностях JDK8

JDK8 выпущен в марте 2014 года, и во время интервью интервьюер спросит о некоторых новых функциях JDK8.

Java развилась с JDK1.0 до последней версии JDK13.Почему сейчас часто спрашивают о Jdk8?

Вероятно, есть несколько причин:

Во-первых, JDK8 еще самая популярная версия JDK.

С сайта Скайн«Экологический отчет JVM за 2018 г.»Как видно в 2018 году, JDK8 по-прежнему является наиболее используемой версией JDK в производственной среде.

Во-вторых, новый цикл релизов оставил многие компании в убытке. Версия JDK9 без LTS.

Oracle использовала новый цикл выпуска после JDK8.

Видеть"Дорожная карта поддержки javaSE"

Поскольку история версии JDK, чтобы увидеть проблему, Oracle, представленная из Java9, выпустила новую версию правил и сократить новый цикл выпуска.

5 лет от JDK1.6 до JDK1.7

3 года от JDK1.7 до JDK1.8

С JDK1.8 на JDK1.9 прошло 3 года

Последующие релизы выпускаются каждые 6 месяцев

LTS-версия выпускается каждые 3 года (последняя LTS-версия — JDK11).

почтиодна третьяразработчиков еще не знают, как они справятся с новым циклом выпуска.

В-третьих, JDK8 представляет множество очень практичных и долгосрочных эффектов.

  1. JDK8 представляет новые синтаксические функции, такие как лямбда-выражения, методы по умолчанию, ссылки на методы и новые классы обработки данных.
  2. JDK8 добавляет в коллекцию интерфейс Stream и изменяет реализацию HashMap и ConcurrentHashMap.
  3. JDK8 изменяет модель памяти JVM и использует метапространство вместо постоянной генерации.
  4. JDK добавляет новые параллельные интерфейсы и реализации, в том числе добавление CompletableFuture, добавление поддержки метода Stream для ConcurrentHashMap, добавление StampedLock

Вот несколько новых функций, которые часто задавались в нескольких интервью.

Лямбда-выражение, ссылка на метод и метод по умолчанию

1. Лямбда-выражения

Лямбда-выражения позволяют использовать функции в качестве параметров метода.

Существует несколько распространенных лямбда-выражений:

// 1. 不需要参数,返回值为 5  
() -> 5  
  
// 2. 接收一个参数(数字类型),返回其2倍的值  
x -> 2 * x  
  
// 3. 接受2个参数(数字),并返回他们的差值  
(x, y) -> x – y  
  
// 4. 接收2个int型整数,返回他们的和  
(int x, int y) -> x + y  
  
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)  
(String s) -> System.out.print(s)

2. Ссылка на метод

JDK8 поддерживает четыре метода ссылки на метод

тип ссылка на метод
ссылки на статические методы ContainingClass::staticMethodName
Метод экземпляра, который ссылается на конкретный объект containingObject::instanceMethodName
Методы экземпляра, которые ссылаются на произвольные объекты определенного типа String::compareToIngoreCase
конструктор ссылок ClassName::new

3. Методы по умолчанию и статические методы

JDK1.8 поддерживает определение методов по умолчанию и статических методов в интерфейсах, а на методы по умолчанию можно ссылаться в реализациях интерфейса.

package defaultmethods;
 
import java.time.*;

public interface TimeClient {
    void setTime(int hour, int minute, int second);
    void setDate(int day, int month, int year);
    void setDateAndTime(int day, int month, int year,
                               int hour, int minute, int second);
    LocalDateTime getLocalDateTime();
    
    // 静态方法
    static ZoneId getZoneId (String zoneString) {
        try {
            return ZoneId.of(zoneString);
        } catch (DateTimeException e) {
            System.err.println("Invalid time zone: " + zoneString +
                "; using default time zone instead.");
            return ZoneId.systemDefault();
        }
    }
    
    // 默认方法
    default ZonedDateTime getZonedDateTime(String zoneString) {
        return ZonedDateTime.of(getLocalDateTime(), getZoneId(zoneString));
    }
}

Модификация коллекции

JDK1.8 улучшил Collection Framework для поддержки операций лямбда, потока и агрегации.

Есть два аспекта изменений:

  • поддерживаются лямбда, потоковые и агрегатные операции
  • Улучшенный вывод типов

Улучшенный вывод типов

Компилятор Java использует целевой тип для вывода параметров типа вызовов универсального метода.

Рассмотрим следующий пример:

List <String> stringList = new ArrayList <>();
stringList.add("A");
stringList.addAll(Arrays.asList());

Расширения управления Java (JMX) обеспечивают удаленный доступ к диагностическим командам.

В настоящее время, независимо от дженериков, метод addAll принимает в качестве параметра экземпляр Collection, а затем метод Arrays.asList возвращает экземпляр List. Это работает, потому что List является подтипом Collection.

Теперь рассмотрим дженерики, целевой тип addAll — Collection, а Arrays.asList возвращает экземпляр List. В этом примере компилятор Java SE 8 может сделать вывод, что значение T переменной типа равно String. Компилятор выводит это из целевого типа Collection.

Компиляторы Java SE 7 и более ранних версий не принимают этот код, поскольку они не используют целевой тип для вывода типов параметров вызова метода. Например, компилятор Java SE 7 генерирует сообщения об ошибках, подобные следующим:

error: no suitable method found for addAll(List<Object>) ...
method List.addAll(Collection<? extends String>) is not applicable (actual argument List<Object> cannot be converted to Collection<? extends String> by method invocation conversion)

Поэтому в тех случаях, когда компилятор Java не может вывести тип, значение переменной типа должно быть указано явно. Например, в Java SE 7 допустимо следующее:

List <String> stringList = new ArrayList <>();
stringList.add(“ A”);
stringList.addAll(Arrays.<String> asList());

Новые возможности JVM

Важными изменениями JDK8 в JVM являются:

  • Новые инструменты JVM: jdeps предоставляет инструменты командной строки для анализа файлов классов.
  • Используйте MetAspace вместо постоянной области
  • Добавлено NMT (родная меменная трасса) местный трассер памяти, см.NMT

Изменения HashMap

JDK8 оптимизирует реализацию HashMap.Основные моменты оптимизации включают в себя:

  • Измените метод связанного списка на связанный список или красно-черное дерево.
  • Измените процесс изменения размера, чтобы устранить скрытую опасность взаимоблокировки при изменении размера JDK7 в параллельных сценариях.
  • Хранилище JDK1.7 использует массив Entry, JDK8 использует хранилище массива Node или TreeNode.

Когда длина связанного списка больше 8, структура хранения связанного списка будет изменена в виде красно-черного дерева.

Эффективность запроса повышена с O(N) до O(logN). Когда длина связанного списка меньше 6, метод красно-черного дерева вырождается в связанный список.

Вставка связанного списка JDK7 вставляется из заголовка связанного списка, и исходный связанный список будет перевернут при изменении размера.

Вставки JDK8 вставляются с конца связанного списка, поэтому исходный порядок сохраняется при изменении размера.

👁 Подпишитесь на публичный аккаунт WeChat:Нетипичный научный мужчинаОтветить:документация JDKJDK получить официальные документы.