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 来切换到旧版本 。
一般来说动态生成的类生命周期更短 , 并且其可?性要更低 。但是现有的 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) {}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ChatGPT元年之后,AI重塑世界,人类如何与其“智慧共生”?
- 网站SEO优化:方法与案例
- 一段微信小程序前端与后端连接的代码,带注解
- 谢楠发长文回应吴京近期争议:尊重与爱护并存
- 汪峰与新女友竟相差16岁,身高还超过他,看来有代沟了
- 绝了!曝布克前女友与坏兔子分手后又约会!
- 贾玲瘦身照流出,A先生替身露脸,剧透的尺度与节奏
- 黄海冰:与丁克妻子离婚后,娶小12岁娇妻,今50岁把俩孩子宠上天
- 林志颖娇妻晒母子生活照!肤白貌美显年轻,与15岁儿子kimi似姐弟
- 47岁陈建州近照认不出!与范玮琪一家人合影,脸部发福判若两人