Преамбула
Интервьюеры часто спрашивают о новых возможностях нового JDK, особенно о возможностях JDK8.
Ниже сначала будет объяснен выпуск версии JDK и кратко представлены основные новые функции JDK8.
в основном включает:
- Новые возможности языка
- Модификация объектов коллекции
- Новые возможности JVM
- Модификация HashMap
обрати внимание на""Нетипичный научный мужчина"" публичный аккаунт, ответдокументация JDKПолучите официальную коллекцию документов JDK.
Почему в интервью часто спрашивают о новых возможностях JDK8
JDK8 выпущен в марте 2014 года, и во время интервью интервьюер спросит о некоторых новых функциях JDK8.
Java развилась с JDK1.0 до последней версии JDK13.Почему сейчас часто спрашивают о Jdk8?
Вероятно, есть несколько причин:
Во-первых, JDK8 еще самая популярная версия JDK.
С сайта Скайн«Экологический отчет JVM за 2018 г.»Как видно в 2018 году, JDK8 по-прежнему является наиболее используемой версией JDK в производственной среде.
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 представляет множество очень практичных и долгосрочных эффектов.
- JDK8 представляет новые синтаксические функции, такие как лямбда-выражения, методы по умолчанию, ссылки на методы и новые классы обработки данных.
- JDK8 добавляет в коллекцию интерфейс Stream и изменяет реализацию HashMap и ConcurrentHashMap.
- JDK8 изменяет модель памяти JVM и использует метапространство вместо постоянной генерации.
- 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 получить официальные документы.