Java9新特性

Java9

概述:java9是在2017年9月21日发布,

在java8的新特性,主要有(接口、注解、新的时间日期API、Optional类、Lambda表达式、StreamAPI)

安装:

下载地址:https://www.oracle.com/java/technologies/downloads/archive

image-20230426220307835

下载的安装包 - 直接解压安装,放到指定安装目录下,安装JDK9与安装JDK8一样步骤;

查看java版本

java -version

如果之前版本是jdk8,解压安装后,直接更换环境变量就可以;

新特性

模块化系统

模块化可以根据模块的需要加载程序运行的class。

创建模块化文件
image-20230430232837691

内容定义,需要哪些包对外访问,哪些不对外。

// 导出包
module jdk9demo {
    // 导出的包
    exports cn.xxx.包名;
}

// 引入包
module jdk9test {
    // 引入的是 模块化名
    requires jdk9demo;
}

jShell脚本

命令行模式下,进行创建文件、声明类、提供单元测试方法。

多版本兼容jar包

可以在不同JDK环境下,运行不同的jar包文件。

接口定义私有方法

public interface MyInterface {
    // jdk 7 声明的抽象方法
    void thod1();
    // jdk 8 声明的静态抽象方法
    public static void thod2(){
        System.out.println("默认 static 方法");
    };
    // jdk 8 声明的默认方法
    default void thod3(){
        System.out.println("默认方法");
        thod1();
        thod4();
    };
    // jdk 9 声明的私有方法
    private void  thod4(){
        System.out.println("私有方法");
        thod1();
    }
}

异常处理改变

// jdk 8 之前的写法
InputStreamReader reader = null;
try {
    reader = new InputStreamReader(System.in);
    reader.read();
} catch (Exception e) {
    e.printStackTrace();
} finally {
    try {
        reader.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
// jdk 8 的写法
try (InputStreamReader reader2 = new InputStreamReader(System.in)) {
    reader2.read();
} catch (Exception e) {
    e.printStackTrace();
}
// jdk 9 的写法
InputStreamReader reader3 = new InputStreamReader(System.in);
try (reader3) {
    reader3.read();
} catch (Exception e) {
    e.printStackTrace();
}

String底层存储结构的变化

jdk8之前,String底层是char[]存储;

jdk9:底层使用byte[] + encoding flag(指定什么结构),StringBuffer和StringBuilder也是一样。

因为:byte一个字节、char是2个字节存储,在JVM堆空间中,String占据很大一部分,并且很多abc单字节就可以存的数据,改为了byte[],节省空间。

public final class String ..{
    @Stable
    private final byte[] value;
}

集合工厂方法

// jdk8 之前写法 创建只读的
List<Integer> list1 = Collections.unmodifiableList(Arrays.asList(1, 3, 4));
Set<Integer> set1 = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(1, 3, 4)));
Map<Object, Object> map1 = Collections.unmodifiableMap(new HashMap<>() {{
   put("Tom", 19);
   put("Tim", 25);
}});
// map1.forEach((k, v) -> System.out.println(k + " -> " + v));

// jdk9 的写法:创建只读的集合
List<Integer> list2 = List.of(1, 3, 4);
Set<Integer> set2 = Set.of(2, 3, 4);
Map<String, Integer> map2 = Map.of("Tom", 12, "Jom", 23);
Map<String, Integer> map3 = Map.ofEntries(Map.entry("TT", 14), Map.entry("MK", 39));

StreamAPI

List<Integer> lsit1 = Arrays.asList(1, 3, 4, 6, 2);
// takeWhile 从开头开始获取满足的元素,直到不满足为止
List<Integer> c1 = lsit1.stream().takeWhile(x -> x < 3).collect(Collectors.toList());
System.out.println(c1); // 结果是 3

// dropWhile 与takeWhile相反,取出不满足的,直到满足为止
List<Integer> c2 = lsit1.stream().dropWhile(x -> x < 3).collect(Collectors.toList());
System.out.println(c2); // 结果是 3

// ofNullable
Stream<Object> o1 = Stream.ofNullable(null);
long count = o1.count(); // 结果是0  不会出现异常
System.out.println(count);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值