Java的发展:从Java0到Java14的新特性

Java的发展:从Java0到Java14的新特性_第1张图片

Java0

1996 年 1 月Sun公司发布第一个正式的Java版本,JDK1.0

Java1

1997 年 2 月Sun 公司发布 JDK1.1

  1. 重新编写了用于桌面软件开发的 AWT 库(因为上个版本的 AWT 是 Java 最弱的组件,之前的库对于不同操作系统的界面抽象太简单,各个平台并不能兼容,这也不符合 Java 承诺的 “write once,run anywhere”)
  2. 加入了内部类
  3. 支持 JavaBeans ,使得 Java 对象可以被序列化成二进制
  4. JDBC,让 Java 可以连数据库,不过还需要数据库开发自家的数据库驱动才可以。
  5. RMI 远程方法调用,本地代码调用不在本地的方法,但需要遵守相关的通信协议。
  6. 支持不能在代码运行时修改的反射
  7. Symantec 公司为 Java 开发编写的即时编译器(提前编译代码,增强代码真正执行时的性能)
  8. 支持国际化和Unicode编码

Java2

1998 年 12 月公司发布 J2SE1.2
1999年,Sun 公司发布了三个版本的 Java,标准版(J2SE,后来改名为 JavaSE)、企业版(J2EE,后来改名为 JavaEE)、微型版(J2ME,后来改名为 JavaME)

  1. strictfp 关键字,可以保证在不同平台上的浮点数计算都是一样的
  2. Swing 组件,可以看作是 AWT 增强版的桌面软件开发库
  3. Sun 公司自己开发的即时编译器
  4. Java plug-in,Java 相关的插件,如支持 Applet 程序的浏览器插件
  5. Java IDL,为 Java 和其他语言互通打下基础
  6. Collections 框架,Java 中复杂的数据类型

Java3

2000 年 5 月Sun 公司发布 J2SE1.3

  1. Sun 公开的 HotSpot JVM,经典的 Java 虚拟机
  2. 为遵循 CORVA 标准而修改了 RMI
  3. **Java Platform Debugger Architecture,**用于 Java 调式的平台
  4. JavaSound API,编写音频处理的函数库
  5. Synthetic proxy,Java 代理的基础

Java4

2002 年 2 月Sun 公司发布了在 JCP(Java Community Process) 的标准下开发的J2SE1.4

  1. 支持正则表达式
  2. assert 关键字,写测试代码用
  3. 异常链,低级异常包装后再抛出,也方便开发人员调试
  4. 支持网络 IPV6 标准
  5. NIO,非阻塞的 IO,优化 Java 的 IO 读取
  6. 日志 API
  7. XML 解析器和 XSLT 转换器
  8. 集成安全和加密扩展组件(JCE, JSSE, JAAS)
  9. Java Web Start 技术,直接从浏览器中启动 Java 平台
  10. Preference API,在 java.util.prefs 包下

Java5

2004 年 9 月Sun 公司发布 J2SE5
  1. 泛型 (Generics)
 List<Integer> list=new ArrayList<Integer>();
  1. 增强for循环(Enhanced for Loop)
 int[] array = {1, 2, 3, 4, 5};
 for (int i : array) {
    System.out.println(i);
 } 
  1. 自动封箱拆箱(Autoboxing/Unboxing )。八大基本类型和它们的包装类能够自动的相互转换。
  2. 枚举(Typesafe Enums)。枚举是一种实现线程安全的单例模式的好方式。
 enum TestEnum{
        one,
        two;
        TestEnum() {
        }
    }
  1. 可变参数 (Varargs)。可变参数本质仍然是用一个数组存储参数,只是java隐藏了这一过程。需要注意的是如果一个方法声明中含有可变参数,那必须放在最后一个位置。
    //可变参数测试
    public static void testVarargs(String... args) {
        //本质就是个数组
        System.out.println(args[1]);
        for (String arg : args) {
            System.out.println(arg);
        }
    }
  1. 静态导入(Static Import)。通过import类来使用类里的静态变量或方法(直接通过名字,不需要加上类名.),简化了代码的书写。
//单个导入
import static java.lang.Math.PI;
//批量导入
import static java.lang.Math.*;
  1. 注解(Annotations)
//注释注解的注解又叫做元注解
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface MyAnnotations {
    //注解内可以添加方法,也可以不添加
    //注解方法的返回值只能是基本类型,String,Class类,枚举,注解,可以有默认值。
    int id();
    String name() default "whh";
    Class classType();
    TestEnum enumType();
}
  1. 改进了 Java 的内存模型,提供了 java.util.concurrent 并发包。
  2. Metadata,元数据,描述数据的数据

Java6

2006 年 12 月Sun 公司发布 JavaSE6

  1. 集合框架增强,下面为新添加的接口和类
    Deque
    BlockingDeque
    NavigableSet
    NavigableMap
    ConcurrentNavigableMap
    ArrayDeque
    ConcurrentSkipListSet
    ConcurrentSkipListMap
    ConcurrentSkipListMap
    AbstractMap.SimpleEntry
    AbstractMap.SimpleImmutableEntry
  2. Scripting. 可以让其他语言在java平台上运行。 java6包含了一个基于Mozilla Rhino实现的javascript脚本引擎
  3. 支持JDBC4.0规范
  4. 提供动态语言支持
  5. 提供编译 API,即 Java 程序可以调用 Java 编译器的 API
  6. Swing 库的一些改进
  7. JVM 的优化
  8. 微型 HTTP 服务器 API

Java7

2011 年 7 月,Oracle收购Sun 公司,发布 JavaSE7

  1. 二进制前缀0b或者0B。整型(byte, short, int, long)可以直接用二进制表示。
  //二进制字面值前缀0b 或0B
    int i = 0b010;//10进制值为2
    int j = 0B010;
  1. 字面常量数字的下划线。用下划线连接整数提升其可读性,自身无含义,不可用在数字的起始和末尾。
    //数字间的下划线不影响实际值
     int k = 1_1;//值为11
  1. switch 支持String类型
  2. 泛型实例化类型自动推断
Map<String, List<String>> myMap = new HashMap<String, List<String>>();    // 之前
Map<String, List<String>> myMap = new HashMap<>();        // 现在
  1. try-with-resources语句
       /*
         * 声明在try括号中的对象称为资源,在方法执行完毕后会被自动关闭,相对与之前必须在finally关闭资源,这一特性大大提高了代码的简洁性。
         * 所有实现java.lang.AutoCloseable接口的类都作为资源被自动关闭。
        */
       try (BufferedReader reader=new BufferedReader(new FileReader("d:1.txt"))){
          return reader.readLine();
      }
  1. 单个catch中捕获多个异常类型(用| 分割)并通过改进的类型检查重新抛出异常
  2. 简化了可变参数的使用
  3. 支持二进制整数
  4. NIO 库的一些改进,增加多重文件的支持、文件原始数据和符号链接

Java8

2014 年 3 月,Java SE 8 (LTS)发布

  1. Lambda 表达式:Lambda 允许把函数作为一个方法的参数(函数作为参数传递到方法中)。
  2. 方法引用:直接引用已有Java类或对象(实例)的方法或构造器。
  3. 默认方法:在接口里面有了一个实现的方法。
  4. 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。
  5. Stream API(java.util.stream) :把真正的函数式编程风格引入到Java中。
  6. Date Time API:加强对日期与时间的处理。
  7. Optional 类:成为 Java 8 类库的一部分,用来解决空指针异常。
  8. Nashorn JavaScript 引擎:在JVM上运行特定的javascript应用。
  9. 重复注解(Repeating Annotations):提供了在同一声明或类型中多次应用相同注解类型的能力。
  10. 类型注解(Type Annotation):在任何地方都能使用注解,而不是在声明的地方。
  11. 类型推断增强。
  12. 方法参数反射(Method Parameter Reflection)
  13. HashMap改进,在键值哈希冲突时能有更好表现
  14. java.util 包下的改进,添加了几个实用的工具类:并行数组排序,标准的Base64编解码,支持无符号运算。
  15. java.util.concurrent 包下增加了新的类和方法
    java.util.concurrent.ConcurrentHashMap类添加了新的方法以支持新的StreamApi和lambada表达式。
    java.util.concurrent.atomic 包下新增了类以支持可伸缩可更新的变量。
    java.util.concurrent.ForkJoinPool类新增了方法以支持 common pool。
    新增了java.util.concurrent.locks.StampedLock类,为控制读/写访问提供了一个基于性能的锁,且有三种模式可供选择。
  16. HotSpot删除了 永久代(PermGen),方法调用的字节码指令支持默认方法
  17. 静态链接 JNI 程序库

Java9

2017 年 9 月,Oracle 发布 JavaSE9

1.java模块系统 (Project Jigsaw)(Java Platform Module System)

JDK 被重新组织成 94 个模块,可以通过新增的 jlink 工具,创建出只包含所依赖的 JDK 模块的自定义运行时镜像,极大地减少 Java 运行时环境的大小。
Java 9 模块的重要特征是在其工件(artifact)的根目录中包含了一个描述模块的 module-info.class 文件。工件的格式可以是传统的 JAR 文件或是 Java 9 新增的 JMOD 文件。

2.集合、Stream 和 Optional

  • 增加 了 List.of()、Set.of()、Map.of() 和Map.ofEntries()等工厂方法来创建不可变集合,比如List.of(“Java”, “C++”);、Map.of(“Java”,1, “C++”, 2);
  • Stream 中增加了新的方法 ofNullable、dropWhile、takeWhile 和 iterate方法。
  • Collectors 中增加了新的方法 filtering 和 flatMapping。
  • Optional 类中新增了 ifPresentOrElse、or 和 stream 等方法。

3.平台日志 API 和服务

Java 9 允许为 JDK 和应用配置同样的日志实现。新增了 System.LoggerFinder 用来管理 JDK 使 用的日志记录器实现。JVM 在运行时只有一个系统范围的 LoggerFinder 实例。
我们可以通过添加自己的 System.LoggerFinder 实现来让 JDK 和应用使用 SLF4J 等其他日志记录框架。

4.反应式流 ( Reactive Streams )

  • 在 Java9 中的 java.util.concurrent.Flow 类中新增了反应式流规范的核心接口
  • Flow 中包含了 Flow.Publisher、Flow.Subscriber、Flow.Subscription 和Flow.Processor 等 4 个核心接口。Java 9 还提供了SubmissionPublisher作为Flow.Publisher 的一个实现。

5.变量句柄

  • 变量句柄是一个变量或一组变量的引用,包括静态域,非静态域,数组元素和堆外数据结构中的组成部分等
  • 变量句柄的含义类似于已有的方法句柄MethodHandle
  • 由 Java 类java.lang.invoke.VarHandle 来表示,可以使用类java.lang.invoke.MethodHandles.Lookup 中的静态工厂方法来创建 VarHandle 对象

6.改进方法句柄(Method Handle)

方法句柄从 Java7 开始引入,Java9 在类java.lang.invoke.MethodHandles 中新增了更多的静态方法来创建不同类型的方法句柄

7. Javadoc

简化Doclet API。
支持生成HTML5格式。
加入了搜索框,使用这个搜索框可以查询程序元素、标记的单词和文档中的短语。
支持新的模块系统。

8. JVM

增强了Garbage-First(G1)并用它替代Parallel GC成为默认的垃圾收集器。
统一了JVM 日志,为所有组件引入了同一个日志系统。
删除了JDK 8中弃用的GC组合。(DefNew + CMS,ParNew + SerialOld,Incremental CMS)。

其他新特性

  1. 新的版本号格式。$MAJOR.$MINOR.$SECURITY.$PATCH
  2. java shell,交互式命令行控制台。
  3. private instance methods方法上可以使用@SafeVarargs注解
  4. diamond语法与匿名内部类结合使用
  5. 下划线_不能单独作为变量名使用
  6. 支持私有接口方法(可以使用diamond语法与匿名内部类结合使用)
  7. properties文件支持UTF-8编码,之前只支持ISO-8859-1。支持Unicode 8.0,在JDK8中是Unicode 6.2。
  8. 增加了 ProcessHandle 接口,可以对原生进程进行管理,尤其适合于管理长时间运行的进程
  9. 即时编译功能的增强
  10. XML Catalogs ,XML 文件自动校验

Java10

2018 年 3 月,Oracle 发布Java SE 10

1. var关键字(局部变量类型推断)(Local-Variable Type Inference)

//之前的代码格式
URL url = new URL("http://www.oracle.com/"); 
URLConnection conn = url.openConnection(); 
Reader reader = new BufferedReader(
    new InputStreamReader(conn.getInputStream()))
//java10中用var来声明变量
var url = new URL("http://www.oracle.com/"); 
var conn = url.openConnection(); 
var reader = new BufferedReader(
    new InputStreamReader(conn.getInputStream()));

2. Optional类添加了新的方法orElseThrow(无参数版)

3. java.util.stream.Collectors中新增了静态方法,用于将流中的元素收集为不可变的集合

4.并行全垃圾回收器 G1

G1 是以一种低延时的垃圾回收器来设计的,旨在避免进行 Full GC,但是 Java9 的 G1 的 FullGC 依然是使用单线程去完成标记清除算法,这可能会导致垃圾回收期在无法回收内存的时候触发 Full GC。
为了最大限度地减少 Full GC 造成的应用停顿的影响,从 Java10 开始,G1 的 FullGC 改为并行的标记清除算法,同时会使用与年轻代回收和混合回收相同的并行工作线程数量,从而减少了 Full GC 的发生,以带来更好的性能提升、更大的吞吐量。

5.应用程序类数据共享

在 Java 5 中就已经引入了类数据共享机制 (Class Data Sharing,简称 CDS),允许将一组类预处理为共享归档文件,以便在运行时能够进行内存映射以减少 Java 程序的启动时间,当多个 Java 虚拟机(JVM)共享相同的归档文件时,还可以减少动态内存的占用量,同时减少多个虚拟机在同一个物理或虚拟的机器上运行时的资源占用。

Java 10 在现有的 CDS 功能基础上再次拓展,以允许应用类放置在共享存档中。CDS 特性在原来的 bootstrap 类基础之上,扩展加入了应用类的 CDS (Application Class-Data Sharing) 支持。其原理为:在启动时记录加载类的过程,写入到文本文件中,再次启动时直接读取此启动文本并加载。设想如果应用环境没有大的变化,启动速度就会得到提升。

其他新特性

  1. 线程-局部管控:Java 10 中线程管控引入 JVM 安全点的概念,将允许在不运行全局 JVM 安全点的情况下实现线程回调,由线程本身或者 JVM 线程来执行,同时保持线程处于阻塞状态,这种方式使得停止单个线程变成可能,而不是只能启用或停止所有线程

  2. 备用存储装置上的堆分配:Java 10 中将使得 JVM 能够使用适用于不同类型的存储机制的堆,在可选内存设备上进行堆内存分配

  3. 统一的垃圾回收接口:Java 10 中,hotspot/gc 代码实现方面,引入一个干净的 GC 接口,改进不同 GC 源代码的隔离性,多个 GC 之间共享的实现细节代码应该存在于辅助类中。统一垃圾回收接口的主要原因是:让垃圾回收器(GC)这部分代码更加整洁,便于新人上手开发,便于后续排查相关问题。

Java11

2018 年 9 月,发布Java SE 11 (LTS)

1. 增加一系列字符串处理方法

//判断字符串是否为空
" ".isBlank();//true
//去除字符串首尾空格
" Java ".strip();// "Java" 
//去除字符串首部空格
" Java ".stripLeading();   // "Java "  
//去除字符串尾部空格
" Java ".stripTrailing();  // " Java"  
//重复字符串多少次
"Java".repeat(3);             // "JavaJavaJava"  

//返回由行终止符分隔的字符串集合。
"A\nB\nC".lines().count();    // 3 
"A\nB\nC".lines().collect(Collectors.toList()); 

2.ZGC:可伸缩低延迟垃圾收集器

ZGC 即 Z Garbage Collector,是一个可伸缩的、低延迟的垃圾收集器,主要为了满足如下目标进行设计:

  • GC 停顿时间不超过 10ms
  • 即能处理几百 MB 的小堆,也能处理几个 TB 的大堆
  • 应用吞吐能力不会下降超过 15%(与 G1 回收算法相比)
  • 方便在此基础上引入新的 GC 特性和利用 colord
  • 针以及 Load barriers 优化奠定基础

ZGC 目前 处在实验阶段,只支持 Linux/x64 平台

3.标准 HTTP Client 升级

Java 11 对 Java 9 中引入并在 Java 10 中进行了更新的 Http Client API 进行了标准化,在前两个版本中进行孵化的同时,Http Client 几乎被完全重写,并且现在完全支持异步非阻塞。
并且,Java11 中,Http Client 的包名由 jdk.incubator.http 改为java.net.http,该 API 通过 CompleteableFuture 提供非阻塞请求和响应语义。

var request = HttpRequest.newBuilder()  
    .uri(URI.create("https://javastack.cn"))  
    .GET()  
    .build();  
var client = HttpClient.newHttpClient();  
// 同步  
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());  
System.out.println(response.body());  
// 异步  
client.sendAsync(request, HttpResponse.BodyHandlers.ofString())  
    .thenApply(HttpResponse::body)  
    .thenAccept(System.out::println); 

4.简化启动单个源代码文件的方法

  • 增强了 Java 启动器,使其能够运行单一文件的 Java 源代码。此功能允许使用 Java 解释器直接执行 Java源代码。源代码在内存中编译,然后由解释器执行。唯一的约束在于所有相关的类必须定义在同一个 Java 文件中
  • 对于 Java 初学者并希望尝试简单程序的人特别有用,并且能和 jshell 一起使用
  • 一定能程度上增强了使用 Java 来写脚本程序的能力

5.用于 Lambda 参数的局部变量语法

从 Java 10 开始,便引入了局部变量类型推断这一关键特性。类型推断允许使用关键字 var作为局部变量的类型而不是实际类型,编译器根据分配给变量的值推断出类型。Java 10 中对 var 关键字存在几个限制:

  • 只能用于局部变量上
  • 声明时必须初始化
  • 不能用作方法参数
  • 不能在 Lambda 表达式中使用

Java11 开始允许开发者在 Lambda 表达式中使用 var 进行参数声明

其他新特性

  • 支持Unicode 10.0,在jdk10中是8.0
  • 编译器线程的延迟分配。添加了新的命令-XX:+UseDynamicNumberOfCompilerThreads动态控制编译器线程的数量。
  • Epsilon。一款新的实验性无操作垃圾收集器。Epsilon GC 只负责内存分配,不实现任何内存回收机制。这对于性能测试非常有用,可用于与其他GC对比成本和收益。
  • 低开销的 Heap Profiling:Java 11 中提供一种低开销的 Java 堆分配采样方法,能够得到堆分配的 Java 对象信息,并且能够通过 JVMTI 访问堆信息
  • TLS1.3 协议:Java 11 中包含了传输层安全性(TLS)1.3 规范(RFC 8446)的实现,替换了之前版本中包含的 TLS,包括 TLS 1.2,同时还改进了其他 TLS 功能,例如 OCSP 装订扩展(RFC 6066,RFC 6961),以及会话散列和扩展主密钥扩展(RFC 7627),在安全性和性能方面也做了很多提升
  • 飞行记录器:商业版 JDK 的一项分析工具,但在 Java 11 中,其代码被包含到公开代码库中,这样所有人都能使用该功能了

Java12

2019 年 3 月,发布Java SE 12

1.增强 Switch

传统的 switch 语法存在容易漏写 break 的问题,而且从代码整洁性层面来看,多个 break 本质也是一种重复。
Java12 提供了 swtich 表达式,使用类似 lambda 语法条件匹配成功后的执行块,不需要多写 break。
作为预览特性加入,需要在javac编译和java运行时增加参数–enable-preview。

switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}

2. 数字格式化工具类NumberFormat新增了对复杂的数字进行格式化的支持

NumberFormat fmt = NumberFormat.getCompactNumberInstance(Locale.US, NumberFormat.Style.SHORT);
String result = fmt.format(1000);
 System.out.println(result); // 输出为 1K,计算工资是多少K更方便了。。。

3.Shenandoah GC

Redhat 主导开发的 Pauseless GC 实现,主要目标是 99.9% 的暂停小于 10ms,暂停与堆大小无关等
和 Java11 开源的 ZGC 相比(需要升级到 JDK11 才能使用),Shenandoah GC 有稳定的 JDK8u 版本,在 Java8 占据主要市场份额的今天有更大的可落地性

4.G1 收集器提升

  • 可中止的混合收集集合:JEP344 的实现,为了达到用户提供的停顿时间目标,JEP 344通过把要被回收的区域集(混合收集集合)拆分为强制和可选部分,使 G1 垃圾回收器能中止垃圾回收过程。G1可以中止可选部分的回收以达到停顿时间目标。
  • 及时返回未使用的已分配内存:JEP346 的实现,增强 G1 GC,以便在空闲时自动将 Java 堆内存返回给操作系统。

Java13

2019 年 9 月,发布Java SE 13

1.引入 yield 关键字到 Switch 中

这个关键字 yield是用于返回一个值的。
与return 的区别在于:return 会直接跳出当前循环或者方法,而 yield 只会跳出当前 Switch 块,同时在使用 yield 时,需要有 default 条件

private static String descLanguage(String name) {
        return switch (name) {
            case "Java": yield "object-oriented, platform independent and secured";
            case "Ruby": yield "a programmer's best friend";
            default: yield name +" is a good language";
        };
 }

2.文本块

解决 Java 定义多行字符串时只能通过换行转义或者换行连接符来变通支持的问题,引入三重双引号来定义多行文本
两个"""中间的任何内容都会被解释为字符串的一部分,包括换行符

String json ="{\n" +
              "   \"name\":\"mkyong\",\n" +
              "   \"age\":38\n" +
              "}\n";   // 未支持文本块之前
String json = """
                {
                    "name":"mkyong",
                    "age":38
                }
                """;

3.增强 ZGC 释放未使用内存

  • ZGC存在未能主动将未使用的内存释放给操作系统的问题
  • ZGC 堆由一组称为 ZPages 的堆区域组成。在 GC 周期中清空 ZPages 区域时,它们将被释放并返回到页面缓存ZPageCache 中,此缓存中的 ZPages 按最近最少使用(LRU)的顺序,并按照大小进行组织
  • ZGC将向操作系统返回被标识为长时间未使用的页面,这样它们将可以被其他进程重用

4.SocketAPI 重构

为 Socket API 带来了新的底层实现方法,并默认使用新的 Socket 实现,使其易于发现并在排除问题同时增加可维护性

5.动态应用程序类-数据共享

允许在 Java 应用程序执行结束时动态进行类归档,具体能够被归档的类包括:所有已被加载,但不属于默认基层 CDS 的应用程序类和引用类库中的类

Java14

2020 年 3 月,发布Java SE 14

1.record 关键字

  • 简化数据类的定义方式,使用 record 代替 class 定义的类,只需要声明属性,就可以在获得属性的访问方法,以及toString,hashCode,equals 方法
  • 类似于使用 Class 定义类,同时使用了 lomobok插件,并打上了@Getter,@ToString,@EqualsAndHashCode注解
  • 作为预览特性引入
/**
 * 这个类具有两个特征
 * 1. 所有成员属性都是final
 * 2. 全部方法由构造方法,和两个成员属性访问器组成(共三个)
 * 那么这种类就很适合使用record来声明
 */
final class Rectangle implements Shape {
    final double length;
    final double width;

    public Rectangle(double length, double width) {
        this.length = length;
        this.width = width;
    }

    double length() { return length; }
    double width() { return width; }
}
/**
 * 1. 使用record声明的类会自动拥有上面类中的三个方法
 * 2. 在这基础上还附赠了equals(),hashCode()方法以及toString()方法
 * 3. toString方法中包括所有成员属性的字符串表示形式及其名称
 */
record Rectangle(float length, float width) { }

2.空指针异常精准提示

通过 JVM 参数中添加-XX:+ShowCodeDetailsInExceptionMessages,可以在空指针异常中获取更为详细的调用信息,更快的定位和解决问题

a.b.c.i = 99; // 假设这段代码会发生空指针

Exception in thread "main" java.lang.NullPointerException:
        Cannot read field 'c' because 'a.b' is null.
    at Prog.main(Prog.java:5) // 增加参数后提示的异常中很明确的告知了哪里为空导致

3.switch 的增强终于转正

JDK12 引入的 switch(预览特性)在 JDK14 变为正式版本,不需要增加参数来启用,直接在 JDK14 中就能使用
主要是用->来替代以前的:+break;另外就是提供了 yield 来在 block 中返回值

switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        System.out.println(6);
        break;
    case TUESDAY:
        System.out.println(7);
        break;
    case THURSDAY:
    case SATURDAY:
        System.out.println(8);
        break;
    case WEDNESDAY:
        System.out.println(9);
        break;
}
switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}

4.instanceof 增强

可以在判断的是否属于具体的类型同时完成转换

Object obj = "我是字符串";
if(obj instanceof String str){
 System.out.println(str);
}

5.其他特性

  • 从 Java11 引入的 ZGC 作为继 G1 过后的下一代 GC 算法,从支持 Linux 平台到 Java14 开始支持 MacOS和 Window
  • 移除了 CMS 垃圾收集器(功成而退)
  • 新增了 jpackage 工具,标配将应用打成 jar 包外,还支持不同平台的特性包,比如 linux 下的deb和rpm,window平台下的msi和exe

欢迎关注我的公众号

Java的发展:从Java0到Java14的新特性_第2张图片

你可能感兴趣的:(java,jvm,编程语言)