最早做美食团购的网站wordpress微信设置密码

当前位置: 首页 > news >正文

最早做美食团购的网站,wordpress微信设置密码,联通腾讯合作,阳江招聘网站大全JDK版本升级的非常快#xff0c;现在已经到JDK20了。JDK版本虽多#xff0c;但应用最广泛的还得是JDK8#xff0c;正所谓“他发任他发#xff0c;我用Java8”。 但实际情况却不是这样#xff0c;越来越多的java工程师拥抱 JDK17#xff0c;于是了解了一下 JDK17新语法现在已经到JDK20了。JDK版本虽多但应用最广泛的还得是JDK8正所谓“他发任他发我用Java8”。 但实际情况却不是这样越来越多的java工程师拥抱 JDK17于是了解了一下 JDK17新语法感觉确实香啊推荐大家一起试一下 长期支持版本 JDK17是Oracle于2021年9月14日发布的一个长期支持版本LTS。它将获得长期的更新和支持帮助保持程序的稳定性和可靠性。 性能提升 经过综合评估我们发现在从Java 8升级到Java 11后G1GC的平均速度提升了16.1%ParallelGC则提升了4.5%。当从Java 11升级到Java 17时G1GC的平均速度提升了8.66%而ParallelGC则提升了6.54%。这些结果是基于对OptaPlanner用例的基准测试得出的。总的来说这些优 化让垃圾回收器更加优秀。 最大的亮点是带来了稳定版的ZGC垃圾回收器达到亚毫秒级停顿。 新语法和特性 Switch表达式简化、Text Blocks文本块、instanceof的模式匹配升级和NullPointerException提示信息改进等 支持最新的技术和框架 Spring framework6 和Spring Boot3 都默认使用 Java 17作为最低版本 压测结果 JDK17相对于JDK8和JDK11所有垃圾回收器的性能都有很明显的提升特别是稳定版的ZGC垃圾回收器。不论任何机器配置下都推荐使用ZGCZGC的停顿时间达到亚毫秒级吞吐量也比较高
一、JDK17 新语法

  1. 文本块 推荐指数⭐️⭐️⭐️⭐️⭐️ 这个更新非常实用。在没有这个特性之前编写长文本非常痛苦充满拼接符号。现在通过字符串块我们可以轻松编写JSON、HTML、SQL等内容效果更清爽。 原来的写法 /*** 使用JDK8返回HTML文本** return 返回HTML文本/ public static final String getHtmlJDK8() {return html\n body\n pHello, world/p\n /body\n /html; } 新的写法 /** 使用JDK17返回HTML文本** return 返回HTML文本*/ public static final String getHtmlJDK17() {return htmlbodypHello, world/p/body/html; }
  2. NullPointerException增强 推荐指数⭐️⭐️⭐️⭐️⭐️ 这一功能非常强大且实用相信每位Java开发者都期待已久。空指针异常NPE一直是Java程序员的痛点因为报错信息无法直观地指出哪个对象为空只抛出一个NullPointerException和一堆堆栈信息定位问题耗时且麻烦。 Java17终于在这方面取得了突破提供了更详细的空指针异常信息帮助开发者迅速定位问题源头。 public static void main(String[] args) {try {//简单的空指针String str null;str.length();} catch (Exception e) {e.printStackTrace();}try {//复杂一点的空指针var arr List.of(null);String str (String)arr.get(0);str.length();} catch (Exception e) {e.printStackTrace();} }运行结果
  3. Records 推荐指数⭐️⭐️⭐️⭐️ 在Java中POJO对象如DO、PO、VO、DTO等通常包含成员变量及相应的Getter和Setter方法。尽管可以通过工具或IDE生成这些代码但修改和维护仍然麻烦。 Lombok插件为此出现能够在编译期间自动生成Getter、Setter、hashcode、equals和构造函数等代码使用起来方便但对团队有依赖要求。 为此Java引入了标准解决方案Records。它通过 简洁的语法定义数据类大大简化了POJO类的编写如下所示。虽然hashcode和equals方法仍需手动编写但IDE能够自动生成。这一特性有效解决了模板代码问题提升了代码整洁度和可维护性。 package com.summo.jdk17;/**** param stuId 学生ID* param stuName 学生名称* param stuAge 学生年龄* param stuGender 学生性别* param stuEmail 学生邮箱*/ public record StudentRecord(Long stuId,String stuName,int stuAge,String stuGender,String stuEmail) {public StudentRecord {System.out.println(构造函数);}public static void main(String[] args) {StudentRecord record new StudentRecord(1L, 张三, 16, 男, xxxqq.com);System.out.println(record);} }
  4. 全新的switch表达式 推荐指数⭐️⭐️⭐️ 在Java12的时候就引入了switch表达式注意这里是表达式而不是语句原来的switch是语句。 如果不清楚两者的区别的话最好先去了解一下。主要的差别就是就是表达式有返回值而语句则没有。 配合 模式匹配以及yield和“-”符号的加入全新的switch用起来爽到飞起来。 package com.summo.jdk17;public class SwitchDemo {/*** 在JDK8中获取switch返回值方式** param week* return/public int getByJDK8(Week week) {int i 0;switch (week) {case MONDAY, TUESDAY:i 1;break;case WEDNESDAY:i 3;break;case THURSDAY:i 4;break;case FRIDAY:i 5;break;case SATURDAY:i 6;break;case SUNDAY:i 7;break;default:i 0;break;}return i;}/** 在JDK17中获取switch返回值** param week* return*/public int getByJDK17(Week week) {// 1, 现在的switch变成了表达式可以返回值了而且支持yield和-符号来返回值// 2, 再也不用担心漏写了break而导致出问题了// 3, case后面支持写多个条件return switch (week) {case null - -1;case MONDAY - 1;case TUESDAY - 2;case WEDNESDAY - 3;case THURSDAY - {yield 4;}case FRIDAY - 5;case SATURDAY, SUNDAY - 6;default - 0;};}private enum Week {MONDAY,TUESDAY,WEDNESDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY} }
  5. 私有接口方法 推荐指数⭐️⭐️⭐️ 从Java8开始允许在interface里面添加 默认方法但有一个问题如果一个default方法体很大怎么办拆到另外的类去写吗实在有些不太合理 所以在Java17里面如果一个default方法体很大那么可以通过新增接口私有方法来进行一个合理的拆分了。 public interface PrivateInterfaceMethod {/*** 接口默认方法*/default void defaultMethod() {privateMethod();}// 接口私有方法在Java8里面是不被允许的不信你试试private void privateMethod() {} }
  6. 模式匹配 推荐指数⭐️⭐️⭐️⭐️ 在JDK 17中模式匹配 主要用于 instanceof 表达式。 模式匹配 增强了instanceof的语法和功能使 类型检查 和 类型转换 更加简洁和高效。 在传统的Java版本中我们通常使用 instanceof 结合 类型转换 来 判断对象类型 并 进行处理这往往会导致冗长的代码。 原来的写法 /*** 旧式写法** param value/ public void matchByJDK8(Object value) {if (value instanceof String) {String v (String)value;System.out.println(遇到一个String类型 v.toUpperCase());} else if (value instanceof Integer) {Integer v (Integer)value;System.out.println(遇到一个整型类型 v.longValue());} } 新的写法 /** 转换并申请了一个新的变量极大地方便了代码的编写** param value*/ public void matchByJDK17(Object value) {if (value instanceof String v) {System.out.println(遇到一个String类型 v.toUpperCase());} else if (value instanceof Integer v) {System.out.println(遇到一个整型类型 v.longValue());} }
  7. 集合类的工厂方法 推荐指数⭐️⭐️⭐️⭐️⭐️ 在Java8的年代即便创建一个很小的集合或者 固定元素 的集合都是比较麻烦的。 原来的写法 SetString set new HashSet(); set.add(a); set.add(b); set.add(c新的写法 SetString set Set.of(a, b, c);二、其他的新特性
  8. 新的String方法 repeat重复生成字符串isBlank不用在引入第三方库就可以实现字符串判空了strip去除字符串两边的空格支持全角和半角之前的trim只支持半角lines能根据一段字符串中的终止符提取出行为单位的流indent给字符串做缩进接受一个int型的输入transform接受一个转换函数实现字符串的转换
  9. Stream API的增强 增加takeWhile, dropWhile, ofNullable, iterate以及toList的API越来越像一些函数式语言了。用法举例如下。 // takeWhile 顺序返回符合条件的值直到条件不符合时即终止继续判断 // 此外toList方法的加入也大大减少了节省了代码量免去了调用collect(Collectors::toList)方法了 ListInteger list Stream.of(2,2,3,4,5,6,7,8,9,10).takeWhile(i-(i%20)).toList(); // 返回2, 2// dropWhile 顺序去掉符合条件的值直到条件不符合时即终止继续判断 ListInteger list1 Stream.of(2,2,3,4,5,6,7,8,9,10).dropWhile(i-(i%20)).toList(); //返回3, 4, 5, 6, 7, 8, 9, 10// ofNullable支持传入空流若没有这个且传入一个空流那么将会抛NPE var nullStreamCount Stream.ofNullable(null).count(); //返回0// 以下两行都将输出0到9 Stream.iterate(0, n - n 10, n - n 1).forEach(x - System.out.println(x)); Stream.iterate(0, n - n 1).limit(10).forEach(x - System.out.println(x));
  10. 全新的HttpClient 这个API首次出现在9之中不过当时并非是一个稳定版本 在Java11中正式得到发布所以在Java17里面可以放心地进行使用。 原来的JDK自带的Http客户端真的非常难用这也就给了很多像okhttp、restTemplate、Apache的HttpClient和feign这样的第三方库极大的发挥空间几乎就没有人愿意去用原生的Http客户端的。 但现在不一样了感觉像是 新时代的API了。FluentAPI风格处处充满了现代风格用起来也非常地方便再也不用去依赖第三方的包了好用。 // 同步请求 HttpClient client HttpClient.newBuilder().version(Version.HTTP_1_1).followRedirects(Redirect.NORMAL).connectTimeout(Duration.ofSeconds(20)).proxy(ProxySelector.of(new InetSocketAddress(proxy.example.com, 80))).authenticator(Authenticator.getDefault()).build();HttpResponseString response client.send(request, BodyHandlers.ofString());System.out.println(response.statusCode());System.out.println(response.body()); // 异步请求 HttpRequest request HttpRequest.newBuilder().uri(URI.create(https://foo.com/)).timeout(Duration.ofMinutes(2)).header(Content-Type, application/json).POST(BodyPublishers.ofFile(Paths.get(file.json))).build();client.sendAsync(request, BodyHandlers.ofString()).thenApply(HttpResponse::body).thenAccept(System.out::println);
  11. JShell 在新的JDK版本中支持直接在命令行下执行java程序类似于python的交互式REPL。 简而言之使用 JShell你可以输入代码片段并马上看到运行结果然后就可以根据需要作出调整这样在验证一些简单的代码的时候就可以通过jshell得到快速地验证非常方便。 5. java命令 直接执行 java文件 在现在可以直接通过执行“java xxx.java”即可运行该java文件无须先执行javac然后再执行java是不是又简单了一步。 6. ZGC 在ParallelOldGC、CMS和G1之后JDK 11引入了全新的ZGCZ Garbage Collector。这个名字本身就显得很牛。官方宣称ZGC的 垃圾回收 停顿时间不超过10ms能支持高达16TB的堆空间并且停顿时间不会随着堆的增大而增加。 . 那么ZGC到底解决了什么问题 Oracle官方介绍它是一个可伸缩的低延迟垃圾回收器旨在降低停顿时间尽管这可能会导致吞吐量的降低。 不过通过横向扩展服务器可以解决吞吐量问题。官方已建议ZGC可用于生产环境这无疑将成为未来的主流垃圾回收器。 小结: 随着Java8即将停止免费官方支持越来越多的项目将转向Java17包括大名鼎鼎的Spring Boot 3.0它在2022年1月20日发布的第一个里程碑版本M1正是基于Java17构建的。 大多数情况下从 JDK 8 升级到 JDK 17 是可行的但需要对应用程序进行适当的测试和调整以确保其在新版本上的稳定运行。 但是如果项目中其他成员使用了某些新特性在Java8下将无法通过编译.到时候再换就有点晚了 三、各版本 收费情况 JDK4 系列 Java 4.2.30 以后的所有版本 JDK5系列 Java 5.0.22 以后的所有版本 JDK6系列 Java 6.0.45以后的所有版本 JDK7系列 Java 7.0.80以后的所有版本 JDK8系列 Java 8.0.202以后的所有版本 JDK11~16系列 Java 11~16的所有版本 JDK17系列 Java 17 – 2024年12月以后所发布的所有版本 JDK21系列 预计到2027年JDK21也开始收费