Java 11 là phiên bản chính của nền tảng lập trình Java, được phát hành vào tháng 9 năm 2018. Đây là một phiên bản LTS (Long-Term Support), nghĩa là Oracle và các nhà cung cấp sẽ cung cấp hỗ trợ và cập nhật lâu dài cho nó giúp các doanh nghiệp yên tâm sử dụng.
Dưới đây là chi tiết về các tính năng, cải tiến và thay đổi đáng chú ý trong Java 11:
1. Công cụ dòng lệnh java để chạy mã nguồn
Trước Java 11, để chạy mã Java chúng cần biên dịch mã nguồn thành bytecode
bằng cách sử dụng lệnh javac trước ➡ sau đó chạy bytecode
với lệnh java. Từ Java 11 chúng ta có thể trực tiếp chạy mã nguồn mà không cần qua bước biên dịch bằng cách sử dụng lệnh. Điều này đơn giản hóa quá trình phát triển và thử nghiệm các ứng dụng nhỏ.
$ java HelloWorld.java
2. API HTTP Client mới (Java.net.http)
Java 11 giới thiệu một API HTTP Client mới để hỗ trợ giao tiếp với các dịch vụ web thông qua HTTP/1.1, HTTP/2 và WebSocket. API này thay thế HttpURLConnection
vốn đã lỗi thời và phức tạp. Tính năng này giúp đơn giản hóa việc thực hiện các yêu cầu HTTP và hỗ trợ các giao thức hiện đại như HTTP/2.
– Ví dụ sử dụng API HTTP Client mới:
public class App { public static void main(String[] args) throws IOException, InterruptedException { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://tayjava.vn")) .build(); HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); System.out.println(response.body()); } }
3. ZGC (Garbage Collector có độ trễ thấp)
Z Garbage Collector (ZGC) là một bộ dọn rác mới được giới thiệu trong Java 11. ZGC được thiết kế để có độ trễ rất thấp (thường dưới 10ms), hỗ trợ tốt cho các ứng dụng yêu cầu xử lý đồng thời cao với khối lượng dữ liệu lớn. Nó là một bộ dọn rác có thể mở rộng, hỗ trợ các hệ thống với bộ nhớ từ hàng trăm MB đến terabyte.
4. Local-Variable Syntax cho Lambda
Tính năng này cho phép sử dụng từ khóa var trong biểu thức lambda để khai báo các biến cục bộ, giúp mã nguồn gọn gàng hơn và dễ đọc hơn.
Ví dụ:
var lambda = (var x, var y) -> x + y;
public class LocalVariableSyntaxForLambda { public static void main(String[] args) { List sampleList = Arrays.asList("Java", "PHP", "Python"); String resultString = sampleList.stream() .map((var x) -> x.toUpperCase()) .collect(Collectors.joining("|")); System.out.println(resultString); } }
5. JEP 330: Launch Single-File Source Code Programs
Với JEP 330 chúng ta có thể chạy một tệp mã nguồn Java duy nhất trực tiếp mà không cần phải biên dịch trước. Điều này giúp thử nghiệm và phát triển các đoạn mã nhỏ như đã đề cập ở phần trước.
6. Loại bỏ các mô-đun không còn được sử dụng
- Java 11 loại bỏ một số mô-đun cũ không còn được phát triển hoặc sử dụng rộng rãi, bao gồm:
- Java EE and CORBA Modules: Những phần của Java EE như: java.xml.ws (JAX-WS) và java.xml.bind (JAXB) đã bị loại bỏ do không còn được sử dụng phổ biến. Những mô-đun này giờ đây có thể được bổ sung thông qua các thư viện bên ngoài nếu cần.
- Applet API: Các applet trên trình duyệt đã lỗi thời, và Applet API bị loại bỏ trong Java 11.
7. Cải tiến String API
Java 11 giới thiệu một số phương thức mới cho lớp String bao gồm:
isBlank()
: Kiểm tra xem chuỗi có chỉ chứa các khoảng trắng hay không.lines()
: Chia chuỗi thành nhiều dòng, trả về một luồng (stream) các dòng.strip()
,stripLeading()
,stripTrailing()
: Loại bỏ khoảng trắng ở đầu và cuối chuỗi, hoặc chỉ ở đầu/ cuối.repeat(int n)
: Lặp lại chuỗi nhiều lần.
– Ví dụ isBlank():
public class App { public static void main(String[] args) { String test = "\n\t\u2005 "; // isBlank() instance method returns true if the string is empty or contains only whitespace. Otherwise, it returns false: if (test.isBlank()) System.out.println("Blank"); else System.out.println("Not Blank"); } }
– Ví dụ lines()
:
public class App { public static void main(String[] args) { String multilineStr = "This is\n \n a multiline\n string."; long lineCount = multilineStr.lines() .filter(Predicate.not(String::isBlank)) // .filter(line->!line.isBlank()) .count(); System.out.println(lineCount); } }
– Ví dụ repeat()
:
public class App { public static void main(String[] args) { String test = "Hello"; System.out.println(test.repeat(3) + " Tây Java"); } }
– Ví dụ strip()
với Lambda Expression:
public class App { public static void main(String[] args) { String string = "Hello Darling,\n My name is Tây Java. \nI come from Vietnam\n\nBest regard"; List lines = string.lines() .filter(line->!line.isBlank()) .map(String::strip) .collect(Collectors.toList()); for (String s: lines) { System.out.println(s); } } }
– Ví dụ strip():
public class App { public static void main(String[] args) { String str = " Hello, Tây Java"; // print the string without any function System.out.println("String is"); System.out.println("#" + str + "#"); System.out.println(); // using strip() method System.out.println("Using strip()"); System.out.println("#" + str.strip() + "#"); System.out.println(); // using stripLeading() method System.out.println("Using stripLeading()"); System.out.println("#" + str.stripLeading() + "#"); System.out.println(); // using stripTrailing() method System.out.println("Using stripTrailing()"); System.out.println("#" + str.stripTrailing() + "#"); } }
- Khác biệt giữa
trim()
vàstrip():
strip()
xác định xem ký tự có phải là khoảng trắng hay không dựa trênCharacter.isWhitespace()
. Nói cách khác, nó nhận biết các ký tự khoảng trắng Unicode. Điều này khác vớitrim()
,trim()
định nghĩa khoảng trắng là bất kỳ ký tự nào nhỏ hơn hoặc bằng ký tự khoảng trắng Unicode (U+0020).
➡ So Sáng Sự Khác Biệt Giữa Trim() và Strip() ?
public class App { public static void main(String[] args) { String test = "\n\t hello \u0020"; // test với \u2001 hoặc \u2001 System.out.println("-- strip()--"); if (test.strip().equals("hello")) {//remove dc ca khoang trang, tab, new line, \ System.out.println("Equal"); } else { System.out.println("Not Equal"); } System.out.println("-- trim()--"); if (test.trim().equals("hello")) { // No xac dinh khoang trang dua tren unicode(U+0020) System.out.println("Equal"); } else { System.out.println("Not Equal"); } } }
8. Cải tiến File API
Java 11 bổ sung các phương thức tiện dụng cho việc đọc và viết tệp:
- Files.readString(Path): Đọc nội dung của một tệp dưới dạng chuỗi.
- Files.writeString(Path, String): Ghi một chuỗi vào tệp.
– Ví dụ:
public class App { public static void main(String[] args) throws IOException { Path path = Paths.get("example.txt"); Files.writeString(path, "Welcome to Tây Java"); String content = Files.readString(path); System.out.println(content); // Welcome to Tây Java } }
public class ReadAndWriteStrings { public static void main(String[] args) throws IOException { Path filePath = Files.writeString(Files.createTempFile(Path.of("H:\\"), "demo", ".txt"), "Sample text.txt"); String fileContent = Files.readString(filePath); } }
9. JEP 321: HTTP/2
Java 11 chính thức hỗ trợ HTTP/2 thông qua HTTP Client API giúp cải thiện hiệu suất của các ứng dụng web hiện đại. HTTP/2 hỗ trợ tải tài nguyên song song sử dụng một kết nối duy nhất và tăng tốc độ truyền tải dữ liệu.
10. Được hỗ trợ dài hạn (LTS)
Java 11 là phiên bản LTS (Long-Term Support) nghĩa là Oracle và các nhà cung cấp khác sẽ cung cấp hỗ trợ và cập nhật bảo mật cho nó trong nhiều năm. Đây là một lợi thế lớn cho các doanh nghiệp muốn đảm bảo tính ổn định và bảo mật cho các ứng dụng trong thời gian dài.
11. Unicode 10 hỗ trợ
Java 11 hỗ trợ chuẩn Unicode 10 bao gồm hơn 8.500 ký tự mới, Unicode 10 bao gồm các biểu tượng cảm xúc (emoji) và ký tự viết của các ngôn ngữ mới.
12. Flight Recorder và Mission Control
Flight Recorder và Mission Control là các công cụ theo dõi và phân tích hiệu suất của ứng dụng. Chúng giúp theo dõi hành vi của ứng dụng trong thời gian thực, cung cấp thông tin chi tiết để tối ưu hóa hiệu suất và phát hiện sự cố.