JDK17 与 JDK11 特性差异浅谈

从 JDK11 到 JDK17 ,JAVA 的发展经历了一系列重要的里程碑 。其中最重要的是 JDK17 的发布,这是一个长期支持(LTS)版本,它将获得长期的更新和支持,有助于保持程序的稳定性和可靠性 。此外,Java 的性能也有了显著的提升 。这些进步都反映了 Java 在持续改进和适应现代编程需求方面的承诺 。1.1 switch 表达式语法变化

  1. 在 JDK12 之前如果 switch 忘记写 break 将导致贯穿,在 JDK12 中对 switch 的这一贯穿性做了改进 。你只要将 case 后面的冒号改成箭头 , 那么你即使不写break也不会贯穿了 。
  2. switch 可作为表达式,不再是单独的语句 。
  3. 当你把 switch 中的 case 后的冒号改为箭头之后,此时 switch 就不会贯穿了,但在某些情况下,程序本来就希望贯穿比如我就希望两个 case 共用一个执行体 。JDK12 的 switch 中的 case 也支持多值匹配,这样程序就变得更加简洁了 。
  4. JDK13 引入了一个新的 yield 语句来产生一个值 , 该值成为封闭的 switch 表达式的值 。yield 和 return 的主要区别在于它们如何控制程序的流程 。return 会结束当前的方法或函数,并将控制权返回给调用者 。而 yield 则会暂时离开当前的 switch 表达式 , 将一个值返回给调用者,然后再回到 switch 表达式的地方继续执行 。
public class Demo{public static void mAIn(String[] args){var score = 'C';// 执行switch分支语句String s = switch (score){case 'A', 'B' -> "上等";case 'C' -> "中等";case 'D', 'E' -> "下等";default -> {if (score > 100) {yield "数据不能超过100";} else {yield score + "此分数低于0分";}}}}}1.2 微基准测试套件JMH ,即 Java Microbenchmark Harness ,是专门用于代码微基准测试的工具套件 。
JMH 典型的应用场景
  1. 想定量地知道某个方法需要执行多长时间,以及执行时间和输入参数的相关性 。
  2. 一个接口有两种不同实现,希望比较哪种实现性能更好 。
JMH 使用案例增加 JMH 的依赖<properties><jmh.version>1.14.1</jmh.version></properties><dependencies><dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-core</artifactId><version>${jmh.version}</version></dependency><dependency><groupId>org.openjdk.jmh</groupId><artifactId>jmh-generator-annprocess</artifactId><version>${jmh.version}</version><scope>provided</scope></dependency></dependencies>代码编写import org.openjdk.jmh.annotations.*;@State(Scope.Thread)public class MyBenchmark {@Benchmark@BenchmarkMode(Mode.All)public void testMethod() {try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}}@Benchmark@BenchmarkMode(Mode.All)public void testMethod2() {try {Thread.sleep(600);} catch (InterruptedException e) {e.printStackTrace();}}} import org.openjdk.jmh.runner.Runner;import org.openjdk.jmh.runner.options.Options;import org.openjdk.jmh.runner.options.OptionsBuilder;public class BenchmarkRunner {public static void main(String[] args) throws Exception {Options opt = new OptionsBuilder().include(MyBenchmark.class.getSimpleName()).forks(1).warmupIterations(5).measurementIterations(5).build();new Runner(opt).run();}}//以下这些方法都是JMH的一部分,可以在任何版本的JMH中使用 。//include(SimpleBenchmark.class.getSimpleName()) :这个方法表示你想要运行哪个类的基准测试 。//exclude("xxx") :这个方法表示你想要在基准测试中排除哪个方法 。//forks(1) :这个方法表示你想要进行多少轮的基准测试 。每一轮测试都会在一个新的 JVM 进程中进行,以确保每轮测试的环境是独立的 。//warmupIterations(5) :这个方法表示你想要进行多少次预热迭代 。预热迭代是为了让 JVM 达到稳定状态,预热迭代的结果不会被计入最终的基准测试结果 。//measurementIterations(5) :这个方法表示你想要进行多少次正式的基准测试迭代 , 这些迭代的结果会被用来计算基准测试的最终结果 。结果输出(只截取了一部分)
JDK17 与 JDK11 特性差异浅谈

文章插图
图片
JDK17 与 JDK11 特性差异浅谈

文章插图
图片
相关注解@BenchmarkMode对应 Mode 选项,可用于类或者方法上 , 需要注意的是,这个注解的 value 是一个数组,可以把几种 Mode 集合在一起执行,还可以设置为 Mode.All ,即全部执行一遍 。


推荐阅读