1. JDK 5新特性:

JDK 5是Java平台第一个引入大规模变化的主要版本,其中一些显著的新特性包括自动装箱和拆箱、泛型、枚举类型、可变参数、增强型for循环、静态导入等。以下是这些特性的简要介绍:

自动装箱和拆箱:自动转换基本数据类型和对应的包装类是JDK 5中的一个重要特性。自动装箱允许将基本数据类型隐式转换为对应的包装类,而自动拆箱允许将包装类隐式转换为基本数据类型。

// 自动装箱
Integer num = 10;
// 自动拆箱
int value = num;

泛型:泛型是JDK 5的另一个重要特性,它允许在编译时对类、接口和方法的参数进行类型检查,以提高代码的类型安全性和重用性。

// 定义泛型类
public class MyClass<T> {
  private T value;
  public T getValue() {
    return value;
  }
  public void setValue(T value) {
    this.value = value;
  }
}

枚举类型:枚举类型提供了一种将常量组织起来的方式,使得代码更加清晰和可读。

// 定义枚举类型
public enum Weekday {
  MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

2. JDK 8新特性:

JDK 8引入了许多新特性,其中最显著的包括Lambda表达式、Stream API、新的日期和时间API等。

Lambda表达式:Lambda表达式是一种轻量级的匿名函数,它可以简洁地表示函数式接口,并且使代码更加简洁和易于阅读。

// 使用Lambda表达式实现Runnable接口
Runnable runnable = () -> {
  System.out.println("Hello, Lambda!");
};
// 启动线程
Thread thread = new Thread(runnable);
thread.start();

Stream API:Stream API提供了一种高效且易于使用的处理集合数据的方式,能够实现并行化操作,提高程序的性能。

// 使用Stream API求和
List numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream().reduce(0, Integer::sum);
System.out.println("Sum: " + sum);

新的日期和时间API:JDK 8引入了全新的日期和时间API,提供了更好的日期和时间操作方法,并且解决了旧API中的一些问题。

// 使用新的日期和时间API获取当前日期
LocalDate currentDate = LocalDate.now();
System.out.println("Current Date: " + currentDate);

3. JDK 11新特性:

JDK 11是JDK 8之后的又一个重要版本,其中一些主要的新特性包括局部变量类型推断、HTTP客户端API、增强的安全性、ZGC垃圾收集器等。

局部变量类型推断:局部变量类型推断是JDK 11的一个重要特性,它允许在局部变量的初始化时根据上下文自动推断变量的类型,使得代码更加简洁和易于阅读。

// 使用局部变量类型推断
var list = new ArrayList<String>();
list.add("Hello");
list.add("World");

HTTP客户端API:JDK 11引入了新的HTTP客户端API,提供了更灵活且易于使用的方式来进行HTTP通信。

// 使用新的HTTP客户端API发送GET请求
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
  .uri(URI.create("https://api.example.com"))
  .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Response: " + response.body());

增强的安全性:JDK 11在安全性方面进行了一些改进,包括拒绝通过加密算法进行SSL/TLS连接、增加了一些新的安全算法支持等。

// 增强的安全性示例
System.setProperty("jdk.tls.client.protocols", "TLSv1.3");
System.setProperty("jdk.tls.disabledAlgorithms", "");