java 11 新特性

此博内容全为自己的笔记,是写给自己看的,当然很多都可以从网上查到,我只不过做了个归纳、整理,方便查阅。如果看客觉得有用,不用客气,觉得没用,也不要咒骂,抱怨…

java 11 和之前的 java 5,java 8一样是个里程碑式的更新,本次总结自 java 8以来重要的一些特性

  • jshell
    在这里插入图片描述

    jshell 就相当于在main 方法里面,可以直接输出,或是定义类(内部类)

  • 局部变量类型推断

    var str = "我是刘和广";
    
    var list = new ArrayList<>();
    list.add("aa");
    list.add("bb");
    list.add("cc");
    list.add(233);//如果 new ArrayList<Strnig>规定的泛型是 String,就不能这么写了
    list.forEach(s-> System.out.println(s));
    
  • lamada 语法

    new Thread(()->{
        for (int i=0; i<5; i++){
            System.out.println(i);
        }
    }).start();
    
    public interface Customer {
        void accpet(String str);
    }
    
    Customer customer = (var str1) -> System.out.println(str1.toUpperCase());
            customer.accpet("sdflksjf");
    
  • 增强的方法

     //集合的创建可以更简单,Set 也有 of()
      List<String> list1 = List.of("aa","bb","cc");//Arrays.asList() 效果一样
      list1.add("dd");//java.lang.UnsupportedOperationException
      System.out.println(list1);
    
  • Stream 流

    /**
     * 流的处理的三个步骤
      * 1,创建流
      * 2,中间操作
      * 3,终止操作
      */
     Stream<Integer> stream1 = Stream.of(1,10, 3, 20, 30, 50);
     //stream.forEach(t-> System.out.println(t));
     stream1.forEach(System.out::println);//有参数无返回值
    
     //如果为空不会报错,但传入null会报空指针,
     Stream<Object> stream2 = Stream.of();//Stream.of(null);
     stream2.forEach(System.out::println);
     //对于 null 的情况,可以用 ofNullable
     Stream<Object> stream3 = Stream.ofNullable(null);
     stream3.forEach(System.out::println);
    
     System.out.println("****************");
     Stream<Integer> stream4 = Stream.of(1,5, 3, 20, 30, 50);
     //Stream<Integer> takeWhile = stream4.takeWhile(t -> t % 2 != 0);//为奇数时留下,形成新 Stream
     //takeWhile.forEach(System.out::println);
     Stream<Integer> dropWhile = stream4.dropWhile(t -> t % 2 != 0);//为奇数时丢弃,形成新 Stream
     dropWhile.forEach(System.out::println);
    
     //流的迭代,创建流
     Stream<Integer> iterate = Stream.iterate(1, t -> (2 * t) + 1);
     //如果不加limit(10),会无限迭代输出,这是 jdk11 之前的做法(用 limit 限制)
     iterate.limit(10).forEach(System.out::println);
     //jdk 11 的做法
     System.out.println("***************");
     Stream<Integer> stream = Stream.iterate(1, t -> t < 1000, t -> (2 * t) + 1);
     stream.forEach(System.out::println);
    
  • 字符串和 Operational

    String str1 = "\t \n\r ";
    //判断字符串是否是空白字符
    System.out.println(str1.isBlank());
    System.out.println("*****===========");
    str1 = "\t abc \r \n  ";
    //去除字符串首尾中的空白,包括英文和其它所有语言的空白字符
    String strip = str1.strip();
    //去除字符串首部的空白,包括汉字
    String stripLeading = strip.stripLeading();
    //去除字符串尾部的空白,包括汉字
    String stripTrailing = strip.stripTrailing();
    System.out.println(strip+"<====>"+strip.length());
    
    str1 = "java";
    str1.repeat(3);//把str1 重复三次,输出   javajavajava
    
    //去除字符串首尾中的空白,只能去除码值小于32的(如果是中文全角的空白是去除不了的)
    String trim = str1.trim();
    System.out.println(trim+"<====>"+trim.length());
    
    String str = null;
    //of 和 get() 都不建议用,如果传入的null,会报空指针
    /**Optional<String> stringOptional = Optional.of(str);
    System.out.println(stringOptional.get());**/
    
    //一般用 ofNullable,取值用 orElse()
    Optional<String> optionalS = Optional.ofNullable(str);
    //如果str不为null,返回str的内容,否则返回 "空串代替"
    String orElse = optionalS.orElse("空串代替");
    如果 str 不为null,返回 str 的内容,否则执行 f() 方法
    orElse = optionalS.orElse(f());
    System.out.println(orElse);
    //orElse 和 orElseGet 区别:无论 str是否为空,orElse里面的都会执行,orElseGet 只有 str 为空才执行
    String orElseGet = optionalS.orElseGet(() -> f());
    System.out.println(orElseGet);
    
    //orElseThrow也有重载方法,跟orElseGet 用法类似..
    String orElseThrow = optionalS.orElseThrow();
    System.out.println(orElseThrow);//抛出 NoSuchElementException,底层还是空指针,不过源码做了控制而已
    
    static String f(){
       System.out.println("执行了f() 这个方法");
        return "lhg";
    }
    
  • 字符串和输入流的 API

    • 以前输入输出文件

      FileInputStream fis = new FileInputStream("D:\\ideaProjects\\Demo_JDK12\\src\\com\\lhg\\demo\\StringTest.java");
      FileOutputStream fos = new FileOutputStream("d://demo.java");
      BufferedReader br = new BufferedReader(new FileReader("D:\\ideaProjects\\Demo_JDK12\\src\\com\\lhg\\demo\\StringTest.java"));
      BufferedWriter bw = new BufferedWriter(new FileWriter("d:/demo3.java"));
      byte[] buff = new byte[fis.available()];//fis.available():得到文件的有效字节数
      int len;//读进缓冲数组里面
      String line;
      //br bw方式
      while ((line = br.readLine()) != null){
          bw.write(line);
          bw.newLine();
      }
      //fis fos 方式
      while((len=fis.read(buff)) != -1){
          fos.write(buff, 0, len);
      }
      
      fos.close();
      fis.close();
      bw.close();
      br.close();
      
    • 通过 Stream

       FileInputStream fis = new FileInputStream("D:\\ideaProjects\\Demo_JDK12\\src\\com\\lhg\\demo\\StringTest.java");
       byte[] buff = new byte[fis.available()];//fis.available():得到文件的有效字节数
       int len;//读进缓冲数组里面
       fis.close();
       String string = new String(buff);
       string.lines().forEach(System.out::println);//可以直接输出或其它操作
      
    • transfer 复制流

      InputStream is = StringTest.class.getClassLoader().getResourceAsStream("config.properties");
      try(var os = new FileOutputStream("config_bak.properties")){
          is.transferTo(os);//输入流的数据自动复制到输出流
      }
      is.close();
      
  • Http 客户端
    在这里插入图片描述

  • 更简化的编译运行程序
    之前的做法是 先javac Demo.java,然后java Demo 运行程序,
    现在直接 java Demo.java 一步到位,不过 Demo.java 文件中所引用的 类必须全部来自文件本身(比如这个类 引用了 Teacher 这个类,那么 Teacher 这个类必须定义在 Demo.java 中),如果 Demo.java 中有多个类,多个 main方法,哪个类在前,就执行哪个类的 main 方法(当然只有一个 public 类)

  • 垃圾收集器改进

    • 默认的 gc
      在这里插入图片描述
    • epsilon gc
      在这里插入图片描述
      设置好后,重新运行上面那段代码,发现程序会因为堆空间不足很快退出在这里插入图片描述
  • ZGC java 11 最为瞩目的特性没有之一
    在这里插入图片描述在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值