JDK17 与 JDK11 特性差异浅谈( 四 )

 String html = "<html>n" +"<body>n" +"<p>Hello, world</p>n" +"</body>n" +"</html>n";//使用文本块语法String html = """<html><body><p>Hello, world</p></body></html>""";缩进示例Java 编译器会自动删除不需要的缩进:

  • 每行结尾的空格都会删除 。
  • 每行开始的共有的空格会自动删除 。
  • 只保留相对缩进 。
  • 新行 """ 结束时 , 将 """ 向左调整,则可以给所有行前加相应数量的空格 。将 """ 向右调整,没有作用 。
System.out.println("""Hello,multilinetext blocks!""");// 结果// >Hello,// >multiline// >text blocks!1.12 重新实现旧版 Socket API背景:现在已有的 java.NET.Socket 和 java.net.ServerSocket 以及它们的实现类,都可以回溯到 JDK1.0 时代了 。原始 socket 的维护和调试都很痛苦 。实现类还使用了线程栈作为 I/O 的缓冲 , 导致在某些情况下还需要增加线程栈的大小 。该实现还存在几个并发问题,需要彻底解决 。在未来的网络世界,要快速响应,不能阻塞本地方法线程,当前的实现不适合使用了 。
JDK13 全新实现的 NIOSocketImpl 来替换 JDK1 的 SocketImpl 和 PlainSocketImpl 。
  • 它便于维护和调试,与 NewI/O (NIO) 使用相同的 JDK 内部结构,因此不需要使用系统本地代码 。
  • 它与现有的缓冲区缓存机制集成在一起 , 这样就不需要为 I/O 使用线程栈 。
  • 它使用 java.util.concurrent 锁,而不是 synchronized 同步方法,增强了并发能力 。
  • 新的实现是 JDK13 中的默认实现,但是旧的实现还没有删除,可以通过设置参数 -Djdk.net.usePlainSocketImpl=true 来切换到旧版本 。
1.13 Hidden Classes通常我们在使用大型的框架或者 lambda 表达式的时候,会动态生成很多类 。但是不幸的是标准的定义类的API:ClassLoader::defineClass 和 Lookup::defineClass 不能够区分出这些类是动态生成(运行时生成)的还是静态生成(编译生成)的 。
一般来说动态生成的类生命周期更短 , 并且其可?性要更低 。但是现有的 JDK 并没有这个功能 。
所有有了 HiddenClasses 的提案,通过 HiddenClasses,不管是 JDK 还是 JDK 外部的框架 , 在生成动态类的时候都可以定义为 HiddenClasses,这样可以更加有效的控制这些动态生成类的生命周期和可?性 。
1.14 instanceof 关键词instanceof关键词主要用来判断某个对象是不是某个类的实例 。
比如,有时候我们要处理一个类似这样的数据集:
Map<String, Object> data = https://www.isolves.com/it/cxkf/yy/JAVA/2024-01-26/new HashMap<>();data.put("test", "111");data.put("test2", 222);JDK16 之前需要先判断获取的 value 是否是 String ,再做强制类型转换:
Object value = https://www.isolves.com/it/cxkf/yy/JAVA/2024-01-26/data.get("test");if (value instanceof String){String s = (String) value;System.out.println(s.substring(1));}在 JDK16 的增强之后,对于 instanceof 的判断以及类型转换可以合二为一了:
Object value = https://www.isolves.com/it/cxkf/yy/JAVA/2024-01-26/data.get("test");if (value instanceof String s){ System.out.println(s.substring(1));}1.15 档案类Records 的目标是扩展 Java 语言语法,Records 为声明类提供了一种紧凑的语法,通过对类做这样的声明,编译器可以通过自动创建所有方法并让所有字段参与 hashCode() 等方法 。其目的是为了充当不可变数据的透明载体的类 。
旧方法定义实体类,代码如下:
public final class User {final String name;final int age;public User(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "User{" +"name='" + name + ''' +", age=" + age +'}';}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;User user = (User) o;return age == user.age && Objects.equals(name, user.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}}通过 Record 类方式 , 一句话就可以实现以上功能,代码如下:
public record User(String username, String password) {}


推荐阅读