阶段十-java新特性

JDK9新特性

1.模块化系统

      jar包结构的变化

        jar -》model -》package -》class

      通过不同的模块进行开发

      每个模块都有自己的模块配置文件module-info.java

阶段十-java新特性_第1张图片

2.JShell

        JDK9自带的命令行开发,在进行简单的代码调试时可以直接编译使用

        可以定义变量,方法,和java中的一样

        /list 所有的代码片段 /vars 所有的变量  /methods 所有的方法

 

3.接口私有方法

       阶段十-java新特性_第2张图片

4.钻石操作符使用升级

在jdk8中,如下代码是报错的

Comparator com = new Comparator<>() {
    @Override
    public int compare(Object o1, Object o2) {
        return 0;
    }
};

<>必须写类型。

而在jdk9中,上述代码就不报错,这是对<>钻石运算符的一个升级。

5.try语句升级

阶段十-java新特性_第3张图片

6.String存储结构变更

String底层的char[]字符数组发生改变,变成了byte[]字节数组

StringBuffer和StringBuilder也变成了byte[]字节数组

ISO-8859-1/Latin-1(每个字节一个字节)的字符字符)或UTF-16(每个字符两个字节),具体取决于内容字符串的。编码标志将指示使用哪种编码。

7.集合特性of

public class Demo {
    public static void main(String[] args) {
        //对于不可变集合的增强
        //JDK8创建一个不可变集合
        ArrayList list = new ArrayList<>();
        list.add("张三");
        list.add("张三");
        list.add("张三");
        //集合工具类
        Collection results = Collections.unmodifiableCollection(list);
        System.out.println(results);
        //报错
        /*results.add("李四");
        System.out.println(results);*/

        //JDK9中创建自读集合
        List list2 = List.of("张三", "张三", "张三");
        //报错
        /*list2.set(0,"李四");*/
        System.out.println(list2);
        Set set1 = Set.of("AA", "BB", "CC");
        System.out.println(set1);
        Map map = Map.of("k1", "v1", "k2", "v2");
        System.out.println(map);

    }
}

8.InputStream增强

public class Demo {
    public static void main(String[] args) throws Exception{
        //直接通过一个方法将输入流传递到输出流
        FileInputStream fileInputStream = new FileInputStream("D:\\a.txt");
        FileOutputStream fileOutputStream = new FileOutputStream("D:\\b.txt");

        try(fileOutputStream;fileInputStream) {
            fileInputStream.transferTo(fileOutputStream);
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

9.增强的Stream API

public class Demo {
    public static void main(String[] args) {
        //从开头开始,到第一个不满足条件的结束
        List list = Arrays.asList(10,20,30,40,30,20,10);
        list.stream().takeWhile(t->t<40).forEach(System.out::println);

        //和takeWhile相反,从头开始第一个不满足开始后面的
        List list2 = Arrays.asList(5,20,30,50,60,20,10);
        list2.stream().dropWhile(t->t<40).forEach(System.out::println);

        //允许通过
        Stream streams = Stream.of("AA","BB",null);
        System.out.println(streams.count());
        //不允许通过
        Stream stream1 = Stream.of(null);
        System.out.println(stream1.count());
        //允许通过,ofNullable中可以为一个null
        Stream stream2 = Stream.ofNullable(null);
        System.out.println(stream2.count());

        //iterate
        //可以提供条件结束迭代
        //原本的方式
        Stream.iterate(1,integer -> integer + 1).limit(50).forEach(System.out::println);
        //增强的方式
        //条件写在括号里面
        Stream.iterate(1,i -> i<60,i -> i + 1).forEach(System.out::println);
    }
}

10.Optional 类中stream()使用

public class Demo {
    public static void main(String[] args) {
        List list = new ArrayList<>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("赵六");
        Optional> optional = Optional.ofNullable(list);
        optional.stream().forEach(System.out::println);
        //flatMap可以便利Optional中的每一个元素
        optional.stream().flatMap(x->x.stream()).forEach(System.out::println);
    }
}

JDK10新特性

1.局部变量类型推断

java是强语言类型,前面是什么类型,后面就是什么类型,这个var能推断出后面是什么类型

js是弱语言类型,什么类型都行

public class Demo {
    public static void main(String[] args) {
        //局部类型推断
        var i = 1;
        var list = new ArrayList();
        //不能推断的情况
        //初始值为null
        var a = null;
        //方法引用
        var r = System.out::println;
        //Lambda表达式
        var c = (Integer b) -> {
            return b+"";
        };
        var d = {2,3,4};
    }
}

var 不是一个关键字:你不需要担心变量名或方法名会与 var发生冲突

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

public class Demo1 {
    public static void main(String[] args) {
        //只读集合增强
        //将不是只读集合的集合变成只读集合
        //copyOf
        //示例1
        var list1 = List.of("AA","BB","CC");
        var list2 = List.copyOf(list1);
        System.out.println(list1==list2);//true

        //示例2
        var list3 = new ArrayList();
        list3.add("AA");
        list3.add("BB");
        List list4 = List.copyOf(list3);
        System.out.println(list3==list4); //false
    }
}

JDK11新特性

1.垃圾回收器ZGC

2.Optional加强

isEmpty()判断是否为空

3.新增HTTP客户端API

public static void main(String[] args) throws Exception {
    HttpClient client = HttpClient.newHttpClient();
    HttpRequest request =
        HttpRequest.newBuilder(URI.create("http://www.baidu.com")).build();
    HttpResponse.BodyHandler responseBodyHandler = HttpResponse.BodyHandlers.ofString();
    HttpResponse response = client.send(request, responseBodyHandler);
    String body = response.body();
    System.out.println(body);
}

JDK 14 新特性

空指针异常更加具体

JDK 16 新特性

switch增强

public class Demo {
    public static void main(String[] args) {
        int level = new Random().nextInt(12);
        String jiJi = null;
        switch (level){
            case 3,4,5 -> jiJi =  "春天";
            case 6,7,8 -> jiJi =  "夏天";
            case 9,10,11 -> jiJi =  "秋天";
            case 12,1,2 -> jiJi = "冬天";
        };
        System.out.println(jiJi);
    }
}

你可能感兴趣的:(java学习之路,java,开发语言)