ChatGPT
最近挺火,比较有意思的是相同的问题,每次得到的答案几乎都不一样,总会有些区别,而且ChatGPT
只管答问题,不管对不对,实际上有些问题是错误的,甚至有些时候前后矛盾。
下面用ChatGPT
整理的JDK
升级内容,可供参考,因为目前版本是GPT3.5
,内容只有2021
年9
月的数据,最新的JDK18
和JDK19
暂无数据。
JDK 1.0 (1996年1月23日发布)
- 首次发布 JDK。
- 包括 Java 编译器、Java 虚拟机、Java 类库等工具。
JDK 1.0于1996年发布,是Java平台的第一个正式版本。相对于后续的版本,JDK 1.0的特性较为简单,主要包括以下内容:
- Java编程语言:JDK 1.0包括了Java编程语言的最初版本,这个版本支持面向对象编程和垃圾回收机制,为后续Java版本奠定了基础。
- Java标准库:JDK 1.0包括了Java标准库的最初版本,这个版本包括了一些基本的类和接口,如java.lang、java.util、java.io等。
- AWT(抽象窗口工具包):JDK 1.0引入了AWT,这是一个图形用户界面(GUI)工具包,它提供了一些基本的GUI组件,如窗口、按钮、文本框等。
示例:
import java.awt.*;
import java.awt.event.*;
public class MyFrame extends Frame {
private Button button;
private Label label;
public MyFrame() {
setTitle("My Frame");
setSize(300, 200);
button = new Button("Click me");
label = new Label("Hello");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
label.setText("Clicked");
}
});
setLayout(new FlowLayout());
add(button);
add(label);
}
}
这个示例演示了如何创建一个基本的GUI应用程序,它包括一个窗口、一个按钮和一个标签。当用户点击按钮时,标签上的文本会发生变化。
JDK 1.0的特性较为简单,但它奠定了Java平台的基础,为后续版本的发展打下了坚实的基础。
JDK 1.1(1997年2月19日发布)
- 支持内部类和 JavaBeans。
- 引入了AWT事件体系。
- 添加了JAR (Java Archive) 文件格式,用于将多个 Java 类文件组合成一个文件。
- 增加了JDBC (Java Database Connectivity) 数据库访问API。
- 引入了Java IDL (Interface Definition Language) API,允许 Java 应用程序通过 CORBA (Common Object Request Broker Architecture) 与其他语言的应用程序进行通信。
JDK 1.2(1998年12月8日发布)
- 增加了Java 2 Platform,Standard Edition (J2SE)。
- 增加了Swing GUI (Graphical User Interface) 工具包,用于创建跨平台的用户界面。
- 增加了Java Naming and Directory Interface (JNDI) API,用于在分布式系统中查找和访问命名和目录服务。
- 增加了Java Security API,用于在 Java 应用程序中实现安全性和加密。
- 增加了Java Plug-in 技术,使得 Java 应用程序能够在 Web 浏览器中运行。
JDK 1.3(2000年5月8日发布)
- 增加了Java Sound API,用于在 Java 应用程序中实现音频功能。
- 引入了Java Platform Debugger Architecture (JPDA) API,用于开发和调试 Java 应用程序。
- 支持Java Web Start,用于在 Web 上启动和管理 Java 应用程序。
- 支持JavaServer Pages (JSP) 技术,用于在 Web 应用程序中创建动态 Web 页面。
JDK 1.4(2002年2月13日发布)
- 增加了Java XML API,用于处理 XML 数据。
- 引入了Java Web Services API,用于实现 Web 服务。
- 增加了Java NIO (New I/O) API,提供了一种新的 I/O 处理方式。
- 引入了Java Assertions,用于检查 Java 程序的错误。
- 引入了Java Web Start,使得 Java 应用程序可以自动下载和更新。
以下是 JDK 4 中的一些示例:
- 增强的异常处理机制:
try {
// some code that may throw an exception
} catch (SomeException e) {
// handle the exception
} catch (AnotherException e) {
// handle another exception
} finally {
// always executed
}
- 可扩展的注释:
/**
* This is a Javadoc comment.
*
* @param foo the foo parameter
* @return the result
* @throws SomeException if something goes wrong
*/
public int myMethod(int foo) throws SomeException {
// some code
}
- XML 处理 API:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new File("myfile.xml"));
Element root = document.getDocumentElement();
NodeList nodes = root.getElementsByTagName("element");
for (int i = 0; i < nodes.getLength(); i++) {
Element element = (Element) nodes.item(i);
String text = element.getTextContent();
// process text
}
- NIO(New Input/Output)库:
Path path = Paths.get("myfile.txt");
Charset charset = StandardCharsets.UTF_8;
String content = new String(Files.readAllBytes(path), charset);
// process content
- 改进的 JAR 文件格式:
jar cfm myapp.jar Manifest.txt *.class
java -jar myapp.jar
- 改进的 GUI 工具包:
JFrame frame = new JFrame("My Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
JLabel label = new JLabel("Hello, world!");
frame.getContentPane().add(label);
frame.setVisible(true);
JDK 1.5(2004年9月30日发布)
- 引入了Java 语言的泛型支持。
- 增加了Java 并发 API,用于实现多线程和并发编程。
- 引入了Java 虚拟机的 JMX (Java Management Extensions) 技术,用于管理和监控 Java 应用程序。
- 增加了自动装箱/拆箱,允许基本数据类型和其对应的包装类型进行互相转换。
- 引入了枚举类型,允许程序员定义一个固定的枚举集合。
- 增加了可变参数方法,允许程序员定义可变数量的参数。
- 增加了静态导入,允许程序员在不使用类名的情况下直接使用静态成员。
以下是 JDK 5 中的一些示例:
- 泛型:
List<String> list = new ArrayList<String>();
list.add("foo");
String str = list.get(0);
- 自动装箱/拆箱:
Integer i = 42;
int j = i;
- 增强的 for 循环:
List<String> list = new ArrayList<String>();
list.add("foo");
list.add("bar");
for (String str : list) {
System.out.println(str);
}
- 枚举类型:
public enum DayOfWeek {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
- 静态导入:
import static java.lang.Math.*;
double result = sqrt(pow(x, 2) + pow(y, 2));
- 可变参数方法:
public static void printValues(String... values) {
for (String value : values) {
System.out.println(value);
}
}
printValues("foo", "bar", "baz");
- 注解:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotation {
String value();
}
public class MyClass {
@MyAnnotation("Hello, world!")
public void myMethod() {
// some code
}
}
JDK 1.6(2006年12月11日发布)
- 支持JDBC4.0
- 集成了JAXB,支持XML绑定
- 引入了Java Compiler API,允许Java程序在运行时调用Java编译器
- 引入了JConsole工具,用于监控Java应用程序的性能和资源使用情况
- 引入了Scripting API,支持在Java中调用脚本语言
以下是 JDK 6 中的一些示例:
- 插入式注解处理 API:
@SupportedAnnotationTypes("com.example.MyAnnotation")
public class MyAnnotationProcessor extends AbstractProcessor {
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
for (TypeElement annotation : annotations) {
for (Element element : roundEnv.getElementsAnnotatedWith(annotation)) {
// process annotated elements
}
}
return true;
}
}
- JDBC 4.0 改进:
Connection conn = DriverManager.getConnection(url, username, password);
try (PreparedStatement stmt = conn.prepareStatement("SELECT * FROM mytable");
ResultSet rs = stmt.executeQuery()) {
while (rs.next()) {
// process result set
}
}
- JAX-WS 2.0 和 JAXB 2.0 的支持:
@WebService
public class MyWebService {
@WebMethod
public String helloWorld(String name) {
return "Hello, " + name + "!";
}
}
@XmlRootElement
public class MyObject {
@XmlElement
public String name;
@XmlElement
public int age;
}
- 脚本语言支持:
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
Object result = engine.eval("var x = 1 + 2; x * 3;");
System.out.println(result); // prints "9"
- 改进的 GUI 工具包:
JFrame frame = new JFrame("My Frame");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
frame.setVisible(true);
- 更好的性能和稳定性:
JDK 6 改进了 JVM 的性能和稳定性,包括更快的启动时间、更低的内存消耗、更快的垃圾回收等。
JDK 1.7(2011年7月28日发布)
- 字符串在 switch 语句中的支持
- 数字字面量的二进制表示法支持
- Try-with-resources 语句的支持,可以简化资源管理
- 对泛型类型实例化的简化语法
- 多个异常类型的捕获和处理
- 可变参数方法的改进
- 增强的字节码支持,包括 invokedynamic 指令
以下是 JDK 7 中的一些示例:
- 字符串在 switch 语句中的支持:
String day = "MON";
switch (day) {
case "MON":
System.out.println("星期一");
break;
case "TUE":
System.out.println("星期二");
break;
case "WED":
System.out.println("星期三");
break;
default:
System.out.println("无效的日期");
}
- 数字字面量的二进制表示法支持:
int binary = 0b1010;
System.out.println(binary);
- Try-with-resources 语句的支持:
try (BufferedReader br = new BufferedReader(new FileReader(file))) {
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
- 对泛型类型实例化的简化语法:
List<String> list = new ArrayList<>();
- 多个异常类型的捕获和处理:
try {
// some code
} catch (IOException | SQLException e) {
e.printStackTrace();
}
- 可变参数方法的改进:
public static void printValues(String... values) {
for (String value : values) {
System.out.println(value);
}
}
- invokedynamic 指令的使用:
MethodHandles.Lookup lookup = MethodHandles.lookup();
MethodHandle mh = lookup.findStatic(Math.class, "sqrt",
MethodType.methodType(double.class, double.class));
CallSite cs = new ConstantCallSite(mh);
MethodHandle sqrt = cs.dynamicInvoker();
double result = (double) sqrt.invokeExact(4.0);
System.out.println(result);
JDK 8(2014年3月18日发布)
- Lambda 表达式,可以方便地在 Java 中实现函数式编程;
- 接口默认方法,允许接口定义默认的方法实现;
- 函数式接口,标识只有一个抽象方法的接口,为 Lambda 表达式提供类型支持;
- Stream API,提供更方便的集合处理方式;
- 新的日期时间 API,更方便地处理日期和时间;
- 元注解 @Repeatable,允许在同一个元素上多次使用相同的注解;
- Type Annotations,增加了对注解的上下文类型检查;
- 其他改进,如 JVM 的性能提升、Base64 编解码等。
Java 8(JDK 8)是Java平台的一个重要版本,它于2014年3月发布。下面是Java 8的一些升级内容和示例:
- Lambda表达式:Lambda表达式是Java 8中最重要的新特性之一,它可以用更简洁的方式定义匿名函数。
示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(name -> System.out.println(name));
- Stream API:Stream API是Java 8中引入的一种新的集合处理方式,它可以让我们更加方便地对集合进行过滤、映射、排序等操作。
示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> filteredNames = names.stream().filter(name -> name.startsWith("A")).collect(Collectors.toList());
- 新的日期时间API:Java 8中引入了一种全新的日期时间API,它可以更好地处理日期时间操作,而且比旧的Date和Calendar类更加简单易用。
示例:
LocalDateTime currentDateTime = LocalDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateTime = currentDateTime.format(formatter);
System.out.println(formattedDateTime);
- 默认方法:Java 8中接口可以定义默认方法,这些方法可以在接口的实现类中直接调用,而不需要重新实现。
示例:
public interface MyInterface {
default void printHello() {
System.out.println("Hello");
}
}
public class MyClass implements MyInterface {
// 不需要重新实现printHello()方法
}
MyClass obj = new MyClass();
obj.printHello(); // 输出:Hello
- 方法引用:方法引用是一种更简洁的Lambda表达式写法,它可以直接引用已有的方法来替代Lambda表达式。
示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(System.out::println);
这些是Java 8的一些升级内容和示例,Java 8还引入了其他一些新特性和改进,如重复注解、类型注解、可重复注解、Nashorn JavaScript引擎等。这些新特性和改进使得Java 8成为了一个更加强大和现代化的平台。
JDK 9(2017年9月21日发布)
- 模块化系统,引入了 Jigsaw 项目,将 JDK 分为多个模块;
- 接口私有方法,允许在接口中定义私有方法;
- Java REPL(JShell),可以直接在命令行运行 Java 代码;
- 改进的 Stream API,新增了 takeWhile 和 dropWhile 等方法;
- HTTP 2 客户端,提供了对 HTTP/2 协议的支持;
- 改进的 GC,引入了 G1 改进版 GC 算法,减少了 GC 停顿时间;
- 重构了集合实现,将原来的 Vector、Hashtable 等类改为基于数组实现的 ArrayList、HashMap 等类。
Java 9(JDK 9)是Java平台的另一个重要版本,它于2017年9月发布。下面是Java 9的一些升级内容和示例:
- 模块化系统:Java 9引入了模块化系统,它可以让开发者更好地管理和组织代码,同时还可以提高应用程序的安全性和性能。
示例:
模块化系统可以通过module-info.java文件来定义模块和模块之间的依赖关系,如下所示:
module my.module {
requires some.module;
exports my.package;
}
- JShell:JShell是Java 9中引入的一个交互式编程工具,它可以让开发者更快速地测试和调试代码。
示例:
在JShell中,可以直接输入Java代码进行测试和调试,如下所示:
jshell> int a = 10;
a ==> 10
jshell> int b = 20;
b ==> 20
jshell> a + b
$3 ==> 30
- 接口私有方法:Java 9允许在接口中定义私有方法,这些方法可以被接口的默认方法或静态方法调用。
示例:
public interface MyInterface {
default void printHello() {
print("Hello");
}
private void print(String message) {
System.out.println(message);
}
}
MyInterface obj = new MyInterface() {};
obj.printHello(); // 输出:Hello
- 改进的集合工厂方法:Java 9中引入了一种更加简单易用的集合工厂方法,它可以让我们更方便地创建集合对象。
示例:
List<String> names = List.of("Alice", "Bob", "Charlie");
Set<Integer> numbers = Set.of(1, 2, 3, 4, 5);
- 改进的try-with-resources语句:Java 9中的try-with-resources语句可以让我们更方便地处理多个资源的情况。
示例:
try (InputStream in = new FileInputStream("file1.txt");
OutputStream out = new FileOutputStream("file2.txt")) {
// 处理输入输出流
} catch (IOException e) {
// 处理异常
}
HTTP/2 客户端:
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://example.com"))
.GET()
.build();
HttpResponse<String> response = client.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println(response.body(
这些是Java 9的一些升级内容和示例,Java 9还引入了其他一些新特性和改进,如HTTP/2客户端、改进的注解处理器、改进的垃圾回收器等。这些新特性和改进进一步提升了Java平台的性能和可用性。
JDK 10(2018年3月20日发布)
- 引入了var关键字,支持类型推断
- 引入了局部变量类型推断
- 引入了Graal JIT编译器
- 引入了应用程序数据共享(Application Data Sharing)功能,用于加速应用程序的启动时间
- 引入了ThreadLocal握手协议(Thread-Local Handshakes),用于更有效地管理线程的执行状态
以下是 JDK 10 中的一些示例:
- 局部变量类型推断:
var list = new ArrayList<String>();
list.add("foo");
list.add("bar");
for (var str : list) {
System.out.println(str);
}
- 应用类数据共享:
java -Xshare:dump
java -Xshare:on -jar myapp.jar
- 改进的 G1 垃圾收集器:
java -XX:+UseG1GC -Xms512m -Xmx512m myapp.jar
- 线程本地握手:
Thread.currentThread().handshake();
- 改进的 Optional 类:
Optional<String> optional = Optional.ofNullable(someString);
optional.ifPresent(str -> System.out.println(str));
String result = optional.orElse("default");
- 改进的集合工厂方法:
List<String> list = List.of("foo", "bar", "baz");
Set<Integer> set = Set.of(1, 2, 3);
Map<String, Integer> map = Map.of("foo", 1, "bar", 2);
- 基于时间的版本控制(Experimental):
java -XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler myapp.jar
JDK 11(2018年9月25日发布)
- HTTP 客户端(HTTP Client)
- Unicode 10 支持
- 局部变量语法(Local-Variable Syntax)
- 垃圾收集器接口(Garbage Collector Interface)
- Epsilon 垃圾收集器(Experimental)
- ZGC 垃圾收集器(Experimental)
- 改进的 Optional 类
- 废弃的功能和限制
- 改进的 JVM
以下是 JDK 11 中的一些示例:
- HTTP 客户端:
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://www.example.com"))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
- Unicode 10 支持:
String emoji = "\uD83D\uDE01";
System.out.println(emoji);
- 局部变量语法:
var list = List.of("foo", "bar", "baz");
for (var str : list) {
System.out.println(str);
}
- 垃圾收集器接口:
List<GarbageCollectorMXBean> gcMxBeans = ManagementFactory.getGarbageCollectorMXBeans();
for (GarbageCollectorMXBean gcMxBean : gcMxBeans) {
System.out.println(gcMxBean.getName());
}
- Epsilon 垃圾收集器(Experimental):
java -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC myapp.jar
- ZGC 垃圾收集器(Experimental):
java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC myapp.jar
- 改进的 Optional 类:
Optional<String> optional = Optional.ofNullable(someString);
optional.ifPresentOrElse(str -> System.out.println(str), () -> System.out.println("Not present"));
String result = optional.orElseThrow();
- 废弃的功能和限制:
- 废弃的功能:Java EE 和 CORBA 模块
- 限制:对于未经授权的代码,不再支持运行 applet 和 WebStart 应用程序
- 改进的 JVM:
- 改进了应用程序类数据共享(Application Class-Data Sharing)功能,加快了启动时间
- 改进了垃圾收集器性能
- 改进了动态类文件常量(Dynamic Class-File Constants)功能,支持在常量池中存储运行时生成的常量值
- 改进了 JVM 代码库的模块化
JDK 12(2019年3月19日发布)
- Switch 表达式(Switch Expressions)
- File.mismatch() 方法
- 改进的 Shenandoah 垃圾收集器
- 废弃的 Nashorn JavaScript 引擎
- 改进的 JVM
- 新的标准库特性
以下是 JDK 12 中的一些示例:
- Switch 表达式:
int dayOfWeek = 1;
String dayOfWeekName = switch (dayOfWeek) {
case 1 -> "Monday";
case 2 -> "Tuesday";
case 3 -> "Wednesday";
case 4 -> "Thursday";
case 5 -> "Friday";
case 6 -> "Saturday";
case 7 -> "Sunday";
default -> throw new IllegalArgumentException("Invalid day of the week: " + dayOfWeek);
};
System.out.println(dayOfWeekName);
- File.mismatch() 方法:
Path path1 = Paths.get("file1.txt");
Path path2 = Paths.get("file2.txt");
long mismatch = Files.mismatch(path1, path2);
if (mismatch == -1L) {
System.out.println("Files are identical.");
} else {
System.out.println("Files differ at byte position " + mismatch + ".");
}
- 改进的 Shenandoah 垃圾收集器:
Shenandoah 是 JDK 12 中的一个实验性垃圾收集器,旨在提高大内存堆的 GC 性能。使用 Shenandoah 垃圾收集器时,需要通过添加以下标志来启用:
java -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC myapp.jar
- 废弃的 Nashorn JavaScript 引擎:
Nashorn JavaScript 引擎在 JDK 11 中被标记为废弃,在 JDK 12 中被移除。建议使用其他的 JavaScript 引擎。
- 改进的 JVM:
- 改进了应用程序类数据共享(Application Class-Data Sharing)功能,加快了启动时间
- 改进了 ZGC 垃圾收集器性能
- 改进了 JVM 对 Docker 容器的支持
- 新的标准库特性:
JDK 12 的标准库新增了一些功能,例如:
- 支持 Unicode 11.0 版本
- 新的 String 方法:indent()、transform()、describeConstable() 等
- 新的 Collectors 方法:teeing()、filtering() 等
- 新的集合操作:Collectors.toUnmodifiableMap()、List.copyOf()、Set.copyOf() 等
JDK 13(2019年9月17日发布)
- 引入了 Text Blocks,允许程序员在 Java 代码中使用多行字符串。
- 引入了 Switch 表达式的增强版本,允许程序员在 Switch 语句中使用 Yield 语句。
- 引入了新的垃圾收集器 ZGC(Experimental),用于处理大型内存堆。
下面是JDK 13的主要升级内容和示例:
- Switch表达式:支持在Switch语句中使用表达式,从而提高代码的可读性和简洁性。
示例:
String day = "MONDAY";
int numLetters = switch (day) {
case "MONDAY", "FRIDAY", "SUNDAY" -> 6;
case "TUESDAY" -> 7;
case "THURSDAY", "SATURDAY" -> 8;
case "WEDNESDAY" -> 9;
default -> throw new IllegalStateException("无效的日期 " + day);
};
- 文本块:简化了多行字符串的创建方式,从而提高代码的可读性和易用性。
示例:
String html = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
- ZGC(Z Garbage Collector):新的垃圾回收器,支持大内存应用程序。
示例:
在启动JVM时,可以使用以下选项启用ZGC垃圾回收器:
java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC MyApp
- 新增了一些API:包括迭代器API、垃圾回收API等。
示例:
List<Integer> list = Arrays.asList(1, 2, 3);
list.forEach(System.out::println);
//输出:
//1
//2
//3
JDK 14(2020年3月17日发布)
- 引入了 Pattern Matching for instanceof,允许程序员在 instanceof 表达式中使用模式匹配。
- 引入了 Records,允许程序员轻松地定义不可变的数据类。
- 引入了 Switch 表达式的增强版本,允许程序员在 Switch 语句中使用箭头语法。
- Records(记录类型):提供了一种紧凑的语法来声明一个只包含数据的类,从而简化了Java中的数据类的创建。
示例:
public record Person(String name, int age) {}
- instanceof 模式匹配:扩展了instanceof运算符,支持在判断对象类型的同时,将对象转换为该类型。
示例:
if (obj instanceof String str) {
System.out.println(str.toUpperCase());
}
- Text Blocks(文本块):在JDK 13中引入的文本块功能得到了改进和扩展,可以更灵活地处理字符串。
示例:
String html = """
<html>
<body>
<p>Hello, world</p>
</body>
</html>
""";
- Switch 表达式增强:Switch表达式支持yield语句,可以返回一个值,从而减少了代码的复杂度。
示例:
public enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
public int getDayValue(Day day) {
return switch (day) {
case MONDAY -> 1;
case TUESDAY -> 2;
case WEDNESDAY -> 3;
case THURSDAY -> 4;
case FRIDAY -> 5;
case SATURDAY, SUNDAY -> {
int value = day.name().length();
yield value;
}
};
}
- Packaging Tool(打包工具):提供了一个打包工具,可以将Java应用程序打包成可执行文件或可发布的文件。
示例:
jpackage --name MyApp --input target/myapp-1.0.jar --main-jar myapp-1.0.jar --type dmg
这些是JDK 14的主要升级内容和示例,但不限于此。详细的升级内容可以参考官方文档。
JDK 15(2020年9月15日发布)
- 引入了 Sealed Classes,允许程序员限制继承某个类的子类的数量。
- 引入了 Hidden Classes,允许程序员在运行时动态生成类并将其隐藏。
- 引入了 Text Blocks 的增强版本,允许程序员在字符串中使用转义字符。
- Sealed Classes(封闭类):提供了一种新的类限制机制,可以限制类的子类化,从而提高了代码的安全性和可读性。
示例:
public abstract sealed class Animal permits Cat, Dog {
// 类定义
}
public final class Cat extends Animal {
// 子类定义
}
public final class Dog extends Animal {
// 子类定义
}
- Hidden Classes(隐藏类):提供了一种新的类加载机制,可以隐藏类的实现细节,从而提高了代码的安全性。
示例:
Lookup lookup = MethodHandles.lookup();
Class<?> clazz = lookup.defineHiddenClass(bytes, true).lookupClass();
Object instance = clazz.getDeclaredConstructor().newInstance();
- Text Blocks(文本块)增强:在JDK 14中引入的文本块功能得到了改进和扩展,支持在文本块中使用转义字符。
示例:
String sql = """
SELECT * \
FROM customers \
WHERE id = ? \
ORDER BY name DESC
""";
- ZGC(Z Garbage Collector)增强:ZGC垃圾回收器支持在多个处理器上并行处理垃圾回收任务,从而提高了性能。
示例:
在启动JVM时,可以使用以下选项启用ZGC垃圾回收器:
java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC MyApp
- Pattern Matching for instanceof(instanceof模式匹配)增强:instanceof模式匹配功能得到了改进,支持在判断对象类型的同时,将对象转换为该类型。
示例:
if (obj instanceof String str && str.length() > 5) {
System.out.println(str.toUpperCase());
}
这些是JDK 15的主要升级内容和示例,但不限于此。详细的升级内容可以参考官方文档。
JDK 16(2021年3月16日发布)
- 引入了 Records 的增强版本,允许程序员在 Records 中使用构造函数和静态方法。
- 引入了 Pattern Matching for instanceof 的增强版本,允许程序员在 switch 表达式中使用模式匹配。
- 引入了 Vector API,允许程序员使用向量运算优化性能。
下面是JDK 16的主要升级内容和示例:
- Records(记录类型)增强:在JDK 14中引入的记录类型功能得到了改进,可以使用更灵活的语法来定义记录类型。
示例:
public record Person(String name, int age) {
public Person {
if (age < 0) {
throw new IllegalArgumentException("Invalid age: " + age);
}
}
}
- Pattern Matching for instanceof(instanceof模式匹配)增强:在JDK 15中引入的instanceof模式匹配功能得到了改进,支持在lambda表达式和匿名类中使用。
示例:
list.forEach(obj -> {
if (obj instanceof String str && str.length() > 5) {
System.out.println(str.toUpperCase());
}
});
- Sealed Classes(封闭类)增强:在JDK 15中引入的封闭类功能得到了改进,支持使用permits语句来声明允许的子类。
示例:
public abstract sealed class Shape permits Circle, Rectangle {
// 类定义
}
public final class Circle extends Shape {
// 子类定义
}
public final class Rectangle extends Shape {
// 子类定义
}
- Vector API:提供了一组新的API,可以在向量化计算中提高性能。
示例:
import jdk.incubator.vector.*;
VectorSpecies<Integer> species = VectorSpecies.of(int.class, VectorShape.S_256_BIT);
int[] arr1 = new int[256], arr2 = new int[256];
IntVector vec1 = IntVector.fromArray(species, arr1, 0);
IntVector vec2 = IntVector.fromArray(species, arr2, 0);
IntVector vec3 = vec1.add(vec2);
vec3.intoArray(arr1, 0);
- Packaging Tool(打包工具)增强:在JDK 14中引入的打包工具功能得到了改进,支持在打包过程中添加附加模块和资源。
示例:
jpackage --name MyApp --input target/myapp-1.0.jar --main-jar myapp-1.0.jar --type dmg --add-modules java.sql --add-resources src/main/resources
这些是JDK 16的主要升级内容和示例,但不限于此。详细的升级内容可以参考官方文档。
JDK 17(2021年9月14日发布)
- 引入了 Sealed Classes 的增强版本,允许程序员将接口声明为密封接口。
- 引入了无意义的 NullPointerException,用于更好地诊断 NullPointerException 的来源。
- 引入了弱密钥的警告,用于诊断使用弱密钥的代码。
下面是JDK 17的主要升级内容和示例:
- 增强的Switch表达式:在JDK 12中引入的Switch表达式功能得到了改进,可以支持更多的语法,例如支持使用多个逗号分隔的值和箭头语法。
示例:
String result = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> "No";
case TUESDAY -> "Maybe";
case THURSDAY, SATURDAY -> "Yes";
case WEDNESDAY -> "Depends";
default -> throw new IllegalArgumentException("Invalid day: " + day);
};
- 类型模式匹配:在JDK 16中引入的模式匹配功能得到了改进,可以支持类型模式匹配,用于在模式匹配中匹配对象类型。
示例:
if (obj instanceof String str) {
System.out.println("The length of the string is " + str.length());
} else if (obj instanceof List list && !list.isEmpty()) {
System.out.println("The first element of the list is " + list.get(0));
}
- 垃圾收集器ZGC改进:ZGC垃圾收集器得到了改进,可以在Windows和macOS上使用,并且支持使用透明Huge Pages。
示例:
java -XX:+UseZGC -Xmx8g MyApp
- 改进的安全性:Java SE 17引入了许多安全性改进,例如:禁用不安全的RSA密钥、限制HTTP和Sockets的使用、禁止使用不安全的TLS版本等。
- 其他改进:还有一些其他改进,例如支持在Java程序中使用嵌入式Elasticsearch、支持使用Records作为Switch表达式的结果类型、提供新的HttpClient API等。
这些是JDK 17的主要升级内容和示例,但不限于此。详细的升级内容可以参考官方文档。