探索 JDK 11 的新特性:迈向 Java 平台的下一个里程碑

随着时间的推移,Java 平台一直在不断演进和改进,为开发人员提供更好的工具和功能。JDK 11 是 Java 平台的一个重要版本,引入了许多新的特性和改进,为开发人员带来了全新的体验和可能性。本文将介绍 JDK 11 中一些重要的新特性,以及它们对 Java 开发的影响。

1.局部变量类型推断(Var 关键字)

JDK 11 引入了局部变量类型推断,允许使用 var 关键字声明局部变量而无需显式指定变量类型。这样可以简化代码,提高开发效率,同时不会影响代码的可读性和健壮性。例如:

package cn.qiang.tmall.admin.mall.demo;

/**
 * @author :Nan Yang
 * @version :V1.0
 * @program :Software development
 * @date :2024/3/26 23:06
 * @description :新的变量定义
 */
public class VariableDefinitions {
    public static void main(String[] args) {
        //以前的变量定义
        int a = 40;
        int b = 50;
        //基于jdk11的变量定义,编译器会自动推断变量的类型
        var x = 40;
        var y = 50;
    }
}

在上面的示例中,var 关键字用于声明一个 ArrayList 类型的变量 list,编译器会根据右侧的表达式自动推断出变量的类型。

当然针对初始化也有一些区别,如下所示:

注意成员变量的定义是不允许的:

这样循环也行:

import java.util.List;

/**
 * @author :Nan Yang
 * @version :V1.0
 * @program :Software
 * @date :2024/3/27 0:10
 * @description :JDK11新特性
 */
public class VariableDefinitions {
    public static void main(String[] args) {
        //of静态方法属于JDK9新增
        var list1 = List.of("雷神", "风神", "火神", "水神");
        var list2 = List.of("草神", "男主", "女主");
        var list3 = List.of("雷神", "风神", "火神", "水神", "草神", "男主", "女主");
        var newList = List.of(list1, list2, list3);
        for (var list : newList) {
            for (var item : list) {
                System.out.println(item);
            }
        }
    }
}

2.HTTP 客户端增强

JDK 11 提供了一个标准化的 HTTP 客户端 API,支持异步和同步请求,并包含对 HTTP/2 和 WebSocket 的原生支持。这使得在 Java 应用程序中进行 HTTP 请求变得更加灵活和高效。

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://www.example.com"))
        .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

在这个示例中,我们创建了一个新的 HttpClient 对象,并使用它发送了一个 HTTP GET 请求到指定的 URL。随后,我们可以通过 response.body() 获取服务器返回的响应体内容。

3.支持源文件直接运行(无需javac)

在JDK11中支持源文件直接运行,不用再执行javac命令了:

import java.util.List;

/**
 * @author :Nan Yang
 * @version :V1.0
 * @program :Software
 * @date :2024/3/27 0:10
 * @description :JDK11新特性
 */
public class VariableDefinitions {
    public static void main(String[] args) {
        //of静态方法属于JDK9新增
        var list1 = List.of(1,2,3,4,5);
        var list2 = List.of(6,7,8,9);
        var list3 = List.of(1,2,3,4,5,6,7,8,9);
        var newList = List.of(list1, list2, list3);
        for (var list : newList) {
            for (var item : list) {
                System.out.println(item);
            }
        }
    }
}

4.FileInputStream的增强

jdk11提供了一个关于FileInputStream文件快速copy的方法,如下图所示:

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @author :nan_yang
 * @version :V1.0
 * @program :Software
 * @date :2024/3/27 0:27
 * @description :
 */
public class FileStreamDemo {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("D:\\Code\\a.txt");
        FileOutputStream fos = new FileOutputStream("D:\\Code\\b.txt");
        //快速简单的将a.txt文件内容复制到b.txt
        fis.transferTo(fos);
    }
}

5.关于FIles类提供的静态方法

Files类提供了一个静态方法readString(),用于快速读取文件的内容;同时也提供了一个静态方法writeString(),用于快速写出一个字符串数据到文件。



/**
 * @author :nan_yang
 * @version :V1.0
 * @program :Software
 * @date :2024/3/27 0:36
 * @description :
 */
public class FileStaticDemo {
    public static void main(String[] args) throws IOException {
        Path path = Paths.get("D:\\Code\\a.txt");
        String str = Files.readString(path);
        System.out.println("读取的内容:" + str);
        Path path2 = Paths.get("D:\\Code\\b.txt");
        Files.writeString(path2, "大家好,我是八重樱!");
    }
}

6.针对String提供的新功能

从jdk11开始,String提供了isBlank(),strip(), stripLeading(), stripTrailing()等方法:

/**
 * @author :nan_yang
 * @version :V1.0
 * @program :Software
 * @date :2024/3/27 0:43
 * @description :针对String提供的新功能
 */
public class StringDemo {
    public static void main(String[] args) {
        String str = " ";
        //结果为true
        boolean blank = str.isBlank();
        String str2 = " soft ";
        //去掉两端空格
        String strip = str2.strip();
        System.out.println(strip);
        String stripHeader = " soft ";
        //去掉头部空格
        String stripLeading = stripHeader.stripLeading();
        System.out.println(stripLeading);
        String stripTrailing = " soft ";
        //去掉尾部空格
        String stripTrailing2 = stripTrailing.stripTrailing();
        System.out.println(stripTrailing2);
        //将字符串内容复制5次,组合成新的字符串
        String repeat = str2.repeat(5);
        System.out.println(repeat);
    }
}

进入源码发现比如类似isBlank这样的方法的确实在jdk11开始出现的:

7.针对单列集合以及双列集合的增强

集合提供了快速复制的方法copy()等:

import java.util.List;
import java.util.Map;

/**
 * @author :nan_yang
 * @version :V1.0
 * @program :Software
 * @date :2024/3/27 0:56
 * @description :针对单列集合以及双列集合的增强
 */
public class ListDemo {
    public static void main(String[] args) {
        //针对单列集合以及双列集合的增强
        var list = List.of("琪亚娜","八重樱","芽衣");
        var newList1 = List.copyOf(list);
        System.out.println(list);
        System.out.println(newList1);

        //双列集合
        var map = Map.of("琪亚娜","100分","八重樱","110分");
        var newMap = Map.copyOf(map);
        System.out.println(map);
        System.out.println(newMap);
    }
}

8.对于Stream的功能扩展

Stream中新增了takeWhile()和dropWhile()截止结算的方法:

import java.util.List;
import java.util.stream.Collectors;

/**
 * @author :nan_yang
 * @version :V1.0
 * @program :Software
 * @date :2024/3/27 1:01
 * @description :对于Stream的功能扩展
 */
public class StreamDemo {
    public static void main(String[] args) {
        var list = List.of("琪亚娜","八重樱","芽衣");

        // 从集合中删除满足条件的元素,直到不满足为止
        var newList = list.stream()
                .dropWhile( name -> name.equals("琪亚娜"))
                .collect(Collectors.toList());
        System.out.println(newList);

        // 从集合中获取满足条件的元素,直到不满足为止
        var newList2 = list.stream()
                .takeWhile( name -> name.equals("琪亚娜"))
                .collect(Collectors.toList());
        System.out.println(newList2);
    }
}

9.对于JDK11出现的新GC(ZGC)

Java 11新增了一个全新的垃圾收集器--ZGC,它由Oracle开发,宣传可以在数TB的堆上具有非常低的暂停时间。

其实在Java10中已经有四种发布多年的垃圾收集器,并且几乎都是无限可调的,那又为什么会新增一个GC呢?换个角度看,G1是2006年时引入Hotspot VM的。当时最大的AWS实例有1 vCPU和1.7GB内存,而今天AWS很乐意租给你一个x1e.32xlarge实例,该类型实例有128个vCPU和3,904GB内存。

ZGC的设计目标是:支持TB级内存容量,暂停时间低(<10ms),对整个程序吞吐量的影响小于15%。将来还可以扩展实现机制,以支持不少令人兴奋的功能,例如多层堆(即热对象置于DRAM和冷对象置于NVMe闪存),或压缩堆。

zgc在进行对象转移的过程中,只需要修改对象指针的几个标志位,相对于g1需要在对象转移时读取对象头来说,少了内存读取的操作,速度更快。不过也正是由于zgc使用了对象指针的几个标志位来完成并发标识和并发转移等的工作,所以zgc不能压缩指针,并且只能运行在基于64位的操作系统上。

zgc的内存区域分成三个页面,小页面2M,中页面32M,大页面2的n次方,而g1页面一般分成2048个region,每个region大小是2M/4M/8M。

10.基于垃圾回收器的 Epsilon 内存分配器

JDK 11 引入了 Epsilon 内存分配器,这是一种实验性的垃圾回收器,适用于对垃圾回收器行为进行压力测试和性能基准测试的场景。Epsilon 内存分配器可用于禁用垃圾收集,从而帮助开发人员更好地理解其应用程序的内存使用情况。

11.其他改进和更新

除了上述新特性外,JDK 11 还包括了诸多其他改进和更新,如对 Lambda 参数的语法支持、新的垃圾收集器接口、动态类文件常量等。这些改进为 Java 平台带来了更好的性能、可维护性和安全性。

通过充分利用 JDK 11 提供的这些新特性,开发人员可以更加高效地编写现代化的 Java 应用程序,并且为未来的发展做好充分准备。希望以上介绍对您有所帮助,欢迎尝试并探索 JDK 11 中更多的功能和改进!

  • 28
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值