一、性能提升
在JDK1.8之前,Java的运行速度一直是一个问题,但是自JDK1.8开始,Java在性能方面得到了改善。JDK1.8引入了在Stream API等多个方面的改进,使得其能够更有效地并行执行任务,实现了比以前更快的执行。
JDK17又在这方面取得了更进一步的改进,引入了Java语言规范(JLS)特定的JVM指令,从而加速了一些lambda表达式的执行速度。同时,JDK17也针对现代CPU的架构和内存层次结构进行了优化,从而获得了更快的运行速度。
//JDK1.8代码示例
List<String> list = Arrays.asList("a", "b", "c", "d");
String result = list.stream()
.filter(s -> !"c".equals(s))
.map(String::toUpperCase)
.collect(Collectors.joining(", "));
System.out.println(result);
//JDK17代码示例
List<String> list = Arrays.asList("a", "b", "c", "d");
String result = list.parallelStream()
.filter(s -> !"c".equals(s))
.map(String::toUpperCase)
.collect(Collectors.joining(", "));
System.out.println(result);
二、增强的安全性
JDK1.8引入了一些新的安全特性,如增强的加密算法和证书验证协议,以及更强大的安全密钥管理功能。这些特性能够保障Java应用程序的安全性和可靠性,特别是在网络环境下。
JDK17在安全方面做出的改进也是十分显著的。它引入了加密算法TLS1.3和EdDSA签名,以及HTTP/2协议,从而增强了Java在分布式系统中的安全性和可靠性。
//JDK1.8代码示例
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class HashingUtils {
public static byte[] hash(String message) throws NoSuchAlgorithmException {
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(message.getBytes());
return md.digest();
}
}
//JDK17代码示例
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.ECGenParameterSpec;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
public class EcdhUtil {
public static SecretKey generateSecretKey() throws NoSuchAlgorithmException, InvalidAlgorithmParameterException {
KeyPairGenerator kpg = KeyPairGenerator.getInstance("EC");
kpg.initialize(new ECGenParameterSpec("secp256r1"), new SecureRandom());
KeyPair kp = kpg.generateKeyPair();
KeyAgreement ka = KeyAgreement.getInstance("ECDH");
ka.init(kp.getPrivate());
ka.doPhase(kp.getPublic(), true);
return ka.generateSecret("AES");
}
}
三、新的语言特性
JDK1.8引入了一些新的语言特性,如Lambda表达式、函数式接口、默认方法、重复注解等。这些特性大大简化了Java的开发模式,使开发人员能够更加轻松地使用函数式编程。
JDK17在这方面也有不俗的表现,引入了Sealed类和Switch表达式,使得代码更加可读性强、更加类型安全。同时,它还对其它特性如Records等进行了增强和优化。
//JDK1.8代码示例
public interface InterfaceDemo {
void test();
default void defaultMethod() {
System.out.println("This is a default method.");
}
}
public class DemoClass implements InterfaceDemo {
public void test() {
System.out.println("This is a test method.");
}
public static void main(String[] args) {
DemoClass demo = new DemoClass();
demo.defaultMethod();
}
}
//JDK17代码示例
public sealed interface Fruit permits Apple, Banana, Pear {
String getName();
}
public final class Apple implements Fruit {
@Override
public String getName() {
return "apple";
}
}
public class Test {
public static void main(String[] args) {
Fruit fruit = new Apple();
String name = fruit.getName();
System.out.println(name);
}
}
四、Futures的增强
JDK1.8引入的CompletableFuture类改变了在Java中处理异步任务的方式。它支持异步执行,可以并行计算,并允许在计算完成后执行回调函数。JDK1.8中的Futures为Java编程人员提供了更灵活的异步编程能力。
JDK17中的Futures在功能和性能方面得到了增强。它引入了新的异步IO API,支持无阻塞的IO操作和类似Netty的事件驱动的编程模型,从而提高了Java的编程效率和执行速度。
//JDK1.8代码示例
CompletableFuture.supplyAsync(() -> "Hello, ")
.thenApplyAsync(s -> s + "world")
.thenAcceptAsync(System.out::println);
//JDK17代码示例
AsynchronousFileChannel channel = AsynchronousFileChannel.open(Path.of("file.txt"), StandardOpenOption.READ);
ByteBuffer buffer = ByteBuffer.allocate(1024);
long position = 0;
channel.read(buffer, position, null, new CompletionHandler<>() {
@Override
public void completed(Integer result, Object attachment) {
System.out.println("Bytes read: " + result);
}
@Override
public void failed(Throwable exc, Object attachment) {
System.out.println("Read failed: " + exc);
}
});
五、模块化
JDK1.9开始正式引入了Java平台模块系统,使得Java更加可扩展、更容易部署和维护。引入模块化的目的是为了减少不必要的依赖,提高Java应用程序的可靠性和安全性,并让开发人员更好地组织代码。
JDK17在这方面的改进也是明显的,它提供了更强大的对模块的定义、控制和重用的支持,使得Java开发人员能够更灵活地管理和定制应用程序,并确保代码的可靠性和稳定性。
//JDK1.9代码示例
module hello.world {
requires org.apache.logging.log4j;
requires com.google.guava;
}
//JDK17代码示例
module com.example.shopping {
requires transitive com.example.product;
requires java.sql;
requires java.xml;
exports com.example.shopping;
}