jdk新特性

JDK9

  1. 模块系统(Module System):这是Java 9最大的特性,它提供了类似于OSGI框架的功能,模块之间存在相互的依赖关系,可以导出一个公共的API,并且隐藏实现的细节。Java提供该功能的主要的动机在于,减少内存的开销

  2. 模块系统(Module System):这是Java 9最大的特性,它提供了类似于OSGI框架的功能,模块之间存在相互的依赖关系,可以导出一个公共的API,并且隐藏实现的细节。Java提供该功能的主要的动机在于,减少内存的开销。

  3. JShell和Jlink:JShell是Java 9中新增的交互式Java编程环境,类似于Python的交互式环境。它允许开发者在命令行界面中快速编写和测试Java代码。Jlink是Java 9中新增的工具,用于生成自定义的Java运行时映像,可以包含或排除特定的模块。

  4. 不可变集合类工厂方法:Java 9新增了一些不可变集合类工厂方法,这些方法可以更方便地创建不可变集合。

  5. 接口中的私有方法:在Java 9中,接口可以包含私有方法,这使得接口的实现更加灵活。

  6. try-with-resources改进:Java 9对try-with-resources进行了改进,使其能够更好地处理异常和资源关闭。

  7. 平台日志API和服务:Java 9提供了新的平台日志API和服务,这使得开发者可以更加方便地记录日志。

  8. 垃圾回收器:Java 9新增了Shenandoah垃圾回收器,这是一种新的垃圾回收器,旨在提供更高效的垃圾回收。

模块化系统

  1. 本质上讲也就是说,用模块来管理各个package,通过声明某个package暴露,模块(module)的概念,其实就是package外再裹一层,不声明默认就是隐藏。因此,模块化使得代码组织上更安全,因为它可以指定哪些部分可以暴露,哪些部分隐藏。

  2. 实现目标        模块化的主要目的在于减少内存的开销       只须必要模块,而非全部jdk模块,可简化各种类库和大型应用的开发和维护         改进 Java SE 平台,使其可以适应不同大小的计算设备           改进其安全性,可维护性,提高性能

JShell命令

像Python 和 Scala 之类的语言早就有交互式编程环境 REPL (read - evaluate - print - loop)了,以交互式的方式对语句和表达式进行求值。开发者只需要输入一些代码,就可以在编译前获得对程序的反馈。而之前的Java版本要想执行代码,必须创建文件、声明类、提供测试方法方可实现。

接口私有方法

public interface JDK9Demo4 {
    //接口默认都是共有静态常量
    public static final int NUM = 10;
    //接口默认方法都是抽象方法
    public abstract void method1();

    //jdk8接口可以有静态方法
    public static void method2(){
        System.out.println("接口中的静态方法");
    }
    //jdk8接口可以有默认方法
    public default void method3(){
        System.out.println("接口中的默认方法");
    }
    //jdk9接口可以有私有方法
    private void method4(){
        System.out.println("接口中的私有方法");
    }
}

钻石操作符使用升级

<>必须写类型。

try 语句

Java 8 中,可以实现资源的自动关闭,但是要求执行后必须关闭的所有资源必须在try子句中初始化,否则编译不通过。 Java 9 中,用资源语句编写try将更容易,我们可以在try子句中使用已经初始化过的资源,此时的资源是final的

String 存储结构变更

结论:String 再也不用 char[] 来存储啦,改成了 byte[] 加上编码标记,节约了一些空间。

集合特性of()

  //jdk8以前创建只读集合
        List<String> list = new ArrayList<>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        Collection<String> list2 = Collections.unmodifiableCollection(list);
//        list2.add("赵六");
//        System.out.println(list2);
        //jdk9创建只读集合
        List<String> list3 = List.of("张三", "李四", "王五");
        System.out.println(list3);
        Set<String> set1 = Set.of("AA", "BB", "CC");
        System.out.println(set1);
        Map<String, String> map = Map.of("k1", "v1", "k2", "v2");
        System.out.println(map);

InputStream增强

InputStream 终于有了一个非常有用的方法:transferTo,可以用来将数据直接传输到 OutputStream,这是在处理原始数据流时非常常见的一种用法

增强的 的 Stream API

  • 在 Java 9 中,Stream API 变得更好,Stream 接口中添加了 4 个新的方法:takeWhile, dropWhile, ofNullable,还有个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代。

takeWhile() 的使用

用于从 Stream 中获取一部分数据,接收一个 Predicate 来进行选择。在有序的Stream 中,takeWhile 返回从开头开始的尽量多的元素

public static void main(String[] args) throws Exception {
    List<Integer> list = Arrays.asList(10,20,30,40,30,20,10);
    list.stream().takeWhile(t->t<40).forEach(System.out::println);

    List<Integer> list2 = Arrays.asList(1,2,3,4,5,6,7);
    list2.stream().takeWhile(t->t<7).forEach(System.out::println);
}

dropWhile() 的 使用

dropWhile 的行为与 takeWhile 相反,返回剩余的元素

ofNullable() 的 使用

Java 8 中 Stream 不能完全为null,否则会报空指针异常。而 Java 9 中的 ofNullable 方法允许我们创建一个单元素 Stream,可以包含一个非空元素,也可以创建一个空Stream。

public static void main(String[] args) throws Exception {
    //允许通过
    Stream<String> streams = Stream.of("AA","BB",null);
    System.out.println(streams.count());
    //不允许通过
    /*Stream<Object> stream2 = Stream.of(null);
        System.out.println(stream2.count());*/
    //允许通过
    Stream<Object> stream2 = Stream.ofNullable(null);
    System.out.println(stream2.count());
}

iterate() 重载的使用

public static void main(String[] args) throws Exception {
    //原始方式
    Stream.iterate(1,i->i+1).limit(50).forEach(System.out::println);
    //增强方式
    Stream.iterate(1,i->i<60,i->i+1).forEach(System.out::println);
}

JDK10 新特性

 

public static void method2(){
        //由于值是null,类型无法推断
//        var i = null;
        //方法引用无法使用var
        //var a = System.out::println;
        //lamdba无法推断var的类型,故不能用
       /* Function<Integer,String> fun = (Integer a)->{
            return a+"";
        };*/
       /* var fun2 = (Integer a)->{
            return a+"";
        };*/
        //静态数组后面不加类型的时候推断不出来var的类型,故不能用
        int[] arr = new int[]{1,2,3};
        int[] arr2 = {1,2,3};
        //var arr3 = {1,3,4};
    }

新增不可变集合方法(只读)

自 Java 9 开始,Jdk 里面为集合(List / Set / Map)都添加了 of (jdk9新增)和copyOf (jdk10新增)方法,它们两个都用来创建不可变的集合,来看下它们的使用和区别。

public static void main(String[] args) throws Exception {
    //示例1
    var list1 = List.of("AA","BB","CC");
    var list2 = List.copyOf(list1);
    System.out.println(list1==list2);//true
    //示例2
    var list3 = new ArrayList<String>();
    list3.add("AA");
    list3.add("BB");
    List<String> list4 = List.copyOf(list3);
    System.out.println(list3==list4); //false
}

JDK 11新特性

增加ZGC垃圾回收器

GC是java主要优势之一。 然而, 当GC停顿太长, 就会开始影响应用的响应时间。消除或者减少GC停顿时长, java将对更广泛的应用场景是一个更有吸引力的平台

优势:

  • GC暂停时间不会超过10ms

  • 既能处理几百兆的小堆, 也能处理几个T的大堆(OMG)

  • 和G1相比, 应用吞吐能力不会下降超过15%

  • 为未来的GC功能和利用colord指针以及Load barriers优化奠定基础

  • 初始只支持64位系统

Optional加强

Optional 也增加了几个非常酷的方法,现在可以很方便的将一个 Optional 转换成一个 Stream, 或者当一个空 Optional 时给它一个替代的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值