JavaRush /Blog Java /Random-VI /Java mới... Một lần nữa... Gặp gỡ Java 10

Java mới... Một lần nữa... Gặp gỡ Java 10

Xuất bản trong nhóm
Trước đây, các nhà phát triển đã chờ đợi một Java mới trong vài năm, một số thì kinh hãi và một số thì hy vọng. Thời thế đã thay đổi và các phiên bản mới của JDK sẽ khiến chúng ta thích thú sau mỗi sáu tháng. Nếu bạn vẫn chưa rõ điều này sẽ dẫn đến điều gì, hãy xem ý kiến ​​​​của chuyên gia và tại đây chúng tôi sẽ liệt kê những thay đổi chính trong Java 10, phiên bản mới nhất của ngôn ngữ yêu thích của chúng tôi. Java mới... Một lần nữa... Gặp gỡ Java 10 - 1Trong dấu ngoặc vuông trước “tính năng” mới, số JEP được chỉ định, tức là “Đề xuất cải tiến JDK”. JEP là một đề xuất nhằm cải thiện OpenJDK và có thể được phê duyệt, trì hoãn hoặc từ chối. Về bản chất, bộ sưu tập JEP là một chiến lược phát triển cho OpenJDK.

Các tính năng quan trọng của Java 10

[286] Suy luận kiểu biến cục bộ - Một đề xuất đưa từ khóa var vào Java, loại bỏ nhu cầu chỉ định rõ ràng kiểu của biến cục bộ. Nghĩa là, bây giờ bạn không thể chỉ định loại biến được khởi tạo mà hãy viết một cái gì đó như:
var list = new ArrayList<String>();  //перед нами ArrayList<String>
var stream = list.stream();          // перед нами Stream<String>
Điều này giúp loại bỏ sự trùng lặp của định nghĩa kiểu ArrayList<String> mà chúng ta phải sử dụng trước đây. Thật thú vị khi lưu ý rằng var không trở thành một từ khóa mà là một loại dành riêng. Nghĩa là, bạn có thể sử dụng var làm tên của biến, phương thức hoặc gói. Nhưng bạn sẽ không thể đặt tên lớp như vậy (thật đáng tiếc!). [296] Hợp nhất rừng JDK vào một kho lưu trữ duy nhất . JDK 9 có tám kho lưu trữ - root, corba, hotspot, jaxp, jaxws, jdk, langtools, nashorn. Trong Java 10, toàn bộ khu rừng này sẽ được kết hợp thành một kho lưu trữ duy nhất để có thể thực hiện các cam kết nguyên tử trên các kho lưu trữ của các bộ thay đổi phụ thuộc lẫn nhau. [304] Giao diện thu gom rác không phải là giao diện mà các nhà phát triển có thể sử dụng để kiểm soát việc thu gom rác. Thay vào đó, chúng tôi có giao diện thu thập rác sạch trong mã nguồn JVM, cho phép bạn tích hợp nhanh chóng và dễ dàng các trình thu thập thay thế. Những người mơ ước thêm bộ thu gom rác của riêng mình vào JVM sẽ hài lòng nhất với cải tiến này. [307] GC đầy đủ song song cho trình thu gom rác G1 . Trong JDK 9, G1 trở thành trình thu gom rác mặc định, trong khi trước đây trình thu gom rác mặc định là Parallel GC, có thể thu thập rác trên nhiều luồng. Bây giờ G1 cũng có thể làm được điều này; trước đây nó đã làm điều đó trong một luồng, điều này đôi khi gây ra khó khăn. Nhân tiện, các nhà phát triển sẽ có thể định cấu hình số lượng luồng bằng cách sử dụng - XX:ParallelGCThreads. [310] tham số Chia sẻ dữ liệu lớp ứng dụng - sự phát triển này, được áp dụng trong Java 10, cung cấp khả năng tải và theo dõi được cải thiện, mở rộng tính năng Chia sẻ lớp (CDS) hiện có để cho phép các lớp ứng dụng được đặt trong kho lưu trữ chung. Chia sẻ dữ liệu lớp hoặc CDS dành cho các tác phẩm ngắn với các tệp có phần mở rộng *class. Chức năng này cho phép bạn chọn một tập hợp con nhất định của các lớp, xử lý chúng và nén chúng vào một kho lưu trữ đặc biệt. Tất cả điều này được thực hiện để tiết kiệm bộ nhớ. Thông thường, các phiên bản khác nhau của JVM tải các lớp giống nhau có trong thư viện chuẩn. Và CDS cho phép tất cả các phiên bản JVM này chia sẻ một kho lưu trữ duy nhất với các lớp được đặt trong đó. Điều này làm giảm cả thời gian tải chương trình và mức sử dụng bộ nhớ. Trên thực tế, CDS cải thiện hiệu năng khởi động JVM và giảm tiêu tốn tài nguyên khi nhiều JVM đang chạy trên cùng một máy vật lý hoặc máy ảo, bắt đầu từ phiên bản 5. Nhưng trước đó việc sử dụng CDS chỉ giới hạn ở trình tải bootstrap. Giờ đây, phiên bản mở rộng có tên CDS ứng dụng cho phép bạn tải các kho lưu trữ đặc biệt với các lớp dành cho các trình tải khác. [312] Bắt tay theo luồng cục bộ là một thay đổi ở mức độ khá thấp bên trong JVM sẽ cho phép các cuộc gọi lại được thực thi trên các luồng mà không cần chạy điểm an toàn VM toàn cầu. Điều này sẽ cho phép bạn dừng các luồng riêng lẻ một cách không tốn kém thay vì dừng tất cả cùng một lúc (hoặc không dừng lại). [313] Xóa Công cụ tạo tiêu đề gốc (javah) . Trở lại Java 9, các nhà phát triển ngôn ngữ bắt đầu tích cực loại bỏ các công cụ không cần thiết và JEP 313 tiếp tục công việc tốt đẹp này. Công cụ javah tạo tiêu đề JNI nếu có các phương thức gốc trong mã. Khỏe mạnh? Tất nhiên, nhưng trình biên dịch javac gốc, bắt đầu với JDK 8, có thể tự tạo các tiêu đề JNI. Vì vậy, bây giờ họ quyết định loại bỏ javah. Nhân tiện, dự án Panama hiện đang được phát triển , đặc biệt là có thể thay thế JNI. [314] Phần mở rộng thẻ ngôn ngữ Unicode bổ sung Thay đổi này nhằm cải thiện lớp java.util.Locale và các API liên quan để triển khai các phần mở rộng Unicode bổ sung cho thẻ ngôn ngữ BCP 47. Đặc biệt, các thẻ dành cho loại tiền tệ (cu), ngày đầu tiên giờ đây sẽ được hỗ trợ ghi đè theo tuần (fw), vùng (rg) và múi giờ (tz). [316] Phân bổ vùng lưu trữ trên các thiết bị bộ nhớ thay thế Cải tiến này sẽ giúp ích cho những người sử dụng các loại bộ nhớ không phải DRAM. Do công nghệ liên tục thay đổi nên việc sử dụng bộ nhớ ổn định có cùng giao diện và đặc tính hiệu suất tương tự như DRAM là một thực tế khách quan ngày nay. Vì vậy, JEP 316 cho phép JVM đặt một đống vào các loại bộ nhớ khác. [317] Trình biên dịch JIT dựa trên Java thử nghiệm . Dự án Metropolis đã được công bố gần đây, đề xuất viết lại hầu hết JVM bằng Java. Trong trường hợp bạn chưa biết, phiên bản hiện tại được viết bằng C++. Chà, nếu bạn đã biết rồi thì có lẽ lúc đầu ý tưởng như vậy sẽ có vẻ xa lạ với bạn. Vì JVM được viết bằng Java nên bạn có cần JVM để chạy JVM không? Đó là sự đệ quy, gợi nhớ đến những tấm gương đối diện nhau. Tuy nhiên, thực tế hơi khác một chút: chỉ vì JVM được viết bằng Java, điều đó không có nghĩa là bạn phải biên dịch nó thành mã byte. Bạn thực sự có thể sử dụng trình biên dịch AOT và sau đó JIT biên dịch mã khi nó hoạt động để cải thiện hiệu suất.

Một công cụ như javac thường được sử dụng để biên dịch mã Java. Nó chuyển đổi một chương trình Java thành một tập hợp các tệp lớp có mã byte. Tiếp theo, JVM chạy mã byte của bạn và trình thông dịch của nó chuyển đổi chúng thành các hướng dẫn của bộ xử lý. Ngoài trình thông dịch, JVM còn có trình biên dịch tích hợp sẵn và nó cũng có thể tạo các hướng dẫn cho bộ xử lý từ mã byte. Đây gọi là biên dịch thời gian chạy, biên dịch trong quá trình khởi động. Thông thường, mã được sử dụng thường xuyên nhất sẽ được biên dịch như vậy - điều này giúp cải thiện hiệu suất.

Trình biên dịch có thể thực hiện các hành động theo nhiều cách khác nhau: biên dịch JIT (đúng lúc) - động, ngay trong khi thực hiện chương trình hoặc biên dịch AOT (trước thời hạn) - trước khi thực hiện.

Trình biên dịch jaotc AOT đã được giới thiệu trong JDK 9. Hiện tại, Hotspot JVM chứa hai trình biên dịch JIT, C1 (cho tốc độ) và C2 (để tối ưu hóa).

JEP 317 giới thiệu dự án nghiên cứu Graal, trình biên dịch cho JDK. Đây là cơ sở chắc chắn sẽ giúp biến Metropolis thành hiện thực và cho phép JVM sánh ngang (hoặc tốt hơn là vượt xa) phiên bản hiện tại được viết bằng C++ về hiệu năng. [319] Chứng chỉ gốc là bộ chứng chỉ Cơ quan chứng nhận (CA) tiêu chuẩn mặc định trong JDK. Các thành phần bảo mật quan trọng như TLS giờ đây sẽ hoạt động theo mặc định trong các bản dựng OpenJDK. Sự bổ sung hữu ích này có thể là một phần trong những gì Oracle đang thực hiện để đảm bảo rằng các tệp nhị phân OpenJDK và các tệp nhị phân JDK của Oracle có chức năng giống nhau. [322] Lập phiên bản phát hành dựa trên thời gian - trong Java 10, các tính năng mới sẽ được thêm vào các bản phát hành Tính năng và các lỗi sẽ được sửa trong Bản phát hành cập nhật. Về cơ bản, chúng tôi có một cách mới để đặt định dạng chuỗi phiên bản JDK. Nó khắc phục một tình huống khá lạ với JDK 9. Bản cập nhật đầu tiên là JDK 9.0.1, điều này khá logic. Bản cập nhật thứ hai là JDK 9.0.4, bản cập nhật này không hợp lý. Logic là trong sơ đồ đánh số phiên bản JDK 9, có khoảng trống giữa các bản cập nhật trong trường hợp cập nhật khẩn cấp, ngoài kế hoạch. Vì việc cập nhật là không cần thiết nên tại sao không gọi nó là JDK 9.0.2? Và đây là định dạng phiên bản Java mới:
[1-9][0-9]*((\.0)*\.[1-9][0-9]*)*

API mới

Có 73 bổ sung cho thư viện lớp tiêu chuẩn JDK 10.
  • java.awt.Toolkit

    int getMenuShortcutKeyMaskEx (): Xác định phím bổ trợ mở rộng nào là phím tăng tốc tương ứng cho menu phím tắt.

  • java.awt.geom.Path2D:

    void trimToSize (): Cắt giảm dung lượng của phiên bản này Path2Dvề kích thước hiện tại của nó. Một ứng dụng có thể sử dụng thao tác này để giảm thiểu việc lưu trữ đường dẫn. Phương thức tương tự đã được thêm vào các lớp bên trong Path2D.DoublePath2D.Float.

  • java.io.ByteArrayOutputStream:

    String toString (Charset): quá tải toString, chuyển đổi nội dung của bộ đệm thành chuỗi bằng cách giải mã các byte bằng cách sử dụng mã hóa được chỉ định.

  • java.io.PrintStream và lang.io.PrintWriter:

    Cả hai lớp này đều có ba hàm tạo mới có thêm một đối số charset.

  • java.io.Reader:

    long transferTo (Writer): Đọc tất cả các ký tự từ trình đọc này và ghi các ký tự vào trình soạn thảo nhất định theo thứ tự chúng được đọc.

  • java.lang.Runtime.Version:

    Bốn phương thức mới trả về giá trị số nguyên cho phiên bản mới (JEP 322) của trường chuỗi : feature (), interim ()patch ().update ()

  • java.lang.StackWalker.StackFrame:

  • Chuỗi getDescriptor():

    trả về một điều khiển cho phương thức được biểu thị bằng khung ngăn xếp này, như được xác định bởi Đặc tả máy ảo Java.

  • Chuỗi getMethodType():

    trả về MethodType, biểu thị các kiểu tham số và kiểu trả về cho phương thức được biểu thị bằng khung ngăn xếp.

  • java.lang.invoke.MethodType:

    Class <?> LastParameterType (): возвращает последний тип параметра этого типа метода. Если этот тип не имеет параметров, instead of него возвращается meaning sentinel void.class.

  • java.lang.management.RuntimeMXBean:

    long getPid () возвращает pid запущенной виртуальной машины Java.

  • java.lang.management.ThreadMXBean:

    ThreadInfo [] dumpAllThreads (boolean, boolean, int): возвращает информацию о потоке для всех потоков в реальном времени с трассировкой стека с указанным максимальным количеством элементов и информацией о синхронизации.

  • ThreadInfo [] getThreadInfo (long [], boolean, boolean, int):

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

  • java.lang.reflect.MalformedParameterizedTypeException:

    добавлен новый конструктор, который принимает подробное сообщение в виде строки в качестве параметра.

  • java.net.URLDecoder и java.net.URLEncoder:

    оба этих класса получor новые перегруженные методы расcodeирования и codeирования, которые используют charset в качестве дополнительного параметра.

  • java.nio.channels.Channels:

    Два новых статических перегруженных метода, newReader (ReadByteChannel, Charset) и newWriter (WriteByteChannel, Charset), которые позволяют использовать charset.

  • java.nio.file.FileStore:

    long getBlockSize (): возвращает количество byteов на блок в этом хранorще файлов.

  • java.time.chrono:

    три класса в этом пакете, HijrahEra, MiinguoEra и ThaiBuddhistEra, получor метод String getDisplayName (TextStyle, Locale). Он возвращает текстовое Name, используемое для идентификации эпохи, подходящее для представления пользователю.

  • java.time.format.DateTimeFormatter:

    localizedBy (Locale): возвращает копию этого форматтера с локализованными значениями языка, календаря, региона, десятичного стиля и / or часового пояса, которые заменяют значения в этом формате.

  • java.util:

    DoubleSummaryStatistics, IntSummaryStatistics и LongSummaryStatistics получor новый конструктор, который принимает четыре числовых значения. Он создает непустой экземпляр с указанным счетчиком, минимумом, максимумом и суммой.

  • java.util.List, java.util.Map и java.util.Set:

    каждый из этих интерфейсов обзавёлся новым статическим методом copyOf (Collection). Они возвращают неизменяемые List, Map or Set, содержащие элементы данной коллекции, в своем порядке итерации.

  • java.util.Optional, java.util.OptionalDouble, java.util.OptionalInt, java.util.OptionalLong:

    каждый из этих классов получает новый метод orElseThrow (), который по существу делает то же самое, что и get (), то есть если condition выполняется, meaning возвращается. В противном случае генерируется исключение NoSuchElementException.

  • java.util.Formatter и java.util.Scanner:

    Оба этих класса получor три новых конструктора, которые на вход получают charset в дополнение к другим аргументам.

  • java.util.Properties:

    Здесь появился новый конструктор, который принимает аргумент int. Это создает пустой список свойств без значений по умолчанию и с начальным размером, содержащим указанное количество элементов без необходимости динамического изменения размера. Также появилась новая, перегруженная version метода replace, которая принимает три параметра Object и возвращает логическое meaning.

  • java.SplittableRandom:

    void nextBytes (byte []): заполняет предоставленный пользователем массив byteов с генерируемыми псевдослучайными byteами.

  • java.util.concurrent.FutureTask:

    добавлен метод toString (), который возвращает строку, идентифицирующую FutureTask, а также ее состояние завершения. Состояние (в скобках) содержит одну из строк: «Completed Normally» (нормальное завершение), «Completed Exceptionally» (завершение с исключением), «Cancelled» (отменено) or «Not completed» (не завершено).

  • java.util.concurrent.locks.StampedLock:

    новые методы boolean isLockStamp (long), boolean isOptimisticReadStamp (long), boolean isReadLockStamp (long) и boolean isWriteLockStamp (long).

  • java.jar.JarEntry:

    String getRealName (): возвращает настоящее Name этого JarEntry. Если JarEntry является записью мультирелизного jar-file, настроенного для обработки, тогда Name, возвращаемое этим методом — Name пути версии, которую представляет JarEntry. Иначе JarEntry возвращает то же Name, что и ZipEntry.getName ().

  • java.util.jar.JarFile:

    Stream <JarEntry> versionedStream (): возвращает поток записей в файле с версией jar. Подобно методу getRealName для JarEntry, связан с мультирелизными jar-fileми.

  • java.util.spi.LocaleNameProvider:

    getDisplayUnicodeExtensionKey (String, Locale): возвращает локализованное Name для данного Unicode extension key. getDisplayUnicodeExtensionType (String, String, Locale): возвращает локализованное Name для данного Unicode extension key.

  • java.util.stream.Collectors:

    toUnmodifiableList (), toUnmodifiableSet (), toUnmodifiableMap (Function, Function), toUnmodifiableMap (Function, Function, BinaryOperator) — эти четыре новых метода возвращают коллекторы (Collectors), которые накапливают входные элементы в соответствующую немодифицируемую коллекцию.

  • java.lang.model.SourceVersion:

    теперь это поле RELEASE_10 для представления версии JDK 10.

  • java.lang.model.util.TypeKindVisitor6 и javax.lang.model.util.TypeKindVisitor9:

    что-то не вполне понятное:).

  • R visitNoTypeAsModule (NoType, P):

    посещает псевдо-тип MODULE.

  • javax.remote.management.rmi.RMIConnectorServer:

    У этого класса было добавлено два поля: CREDENTIALS_FILTER_PATTERN и SERIAL_FILTER_PATTERN.

  • javax.ButtonModel:

    Представляете, Swing все еще обновляется!

  • ButtonGroup getGroup ():

    возвращает группу, к которой принадлежит кнопка. Обычно используется с radio buttons, которые являются взаимоисключающими в своей группе.

  • javax.plaf.basic.BasicMenuUI:

    Dimension getMinimumSize (JComponent): возвращает минимальный размер указанного компонента, подходящий для внешнего вида.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION