zoukankan      html  css  js  c++  java
  • Java 9新特性

    1、jdk 目录结构

    JDK9 具体目录结构如下所示:

    bin: 该目录包含所有的命令。 conf: 包含用户可以编辑的配置文件,例如以前位于 jrelib 目录中的.properties 和 .policy 文件。 include: 包含一些编译本地代码时使用的 C/C++头文件。 jmods: 包含 JMOD 格式的平台模块,创建自定义运行映射时需要它。 legal: 包含法律声明。 lib: 包含非 Windows 平台上动态链接的本地库,其子目录和文件不应由开发人员直接编辑或使用。Windows 平台的动态链接库直接放在了 bin 目录下。注:JDK9 目录中不再有 jre 子目录,以前 JDK 和 JRE 是分开的,二者主要区别在于 JRE 只提供运行环境,而 JDK 额外提供了 Java 编译器。

    2、模块化

    module-info.java:该文件必须位于项目的根目录中。该文件用于定义模块需要什么依赖,以及那些包被外部使用。 exports:控制着那些包可以被其他模块访问到,所有不被 exports 的包默认都被封装在模块里面不被外界所使用。 requires:指明对其他模块的依赖。

    3、JShell

    JShell 是 Java 的交互式命令行。输入/help 查看帮助。

    4、多版本兼容 jar

    使用 javac、jar 等命令可以以任意版本编译、打包 Java 代码。

    5、接口支持私有方法

    Java8 之前接口只能定义方法的声明,这些方法都是共有的,接口的实现类必须实现这些方法。 Java8 中接口可以使用 default 关键字定义默认方法,这样接口的实现类即便不实现这些方法也不会报错。这个改进可以大大减少 Java 中 AbstractClass 的数量。 Java9 中接口可以使用 private 关键字定义私有方法,这样接口的默认方法就可以把逻辑放到私有方法中。接口的实现类无法访问接口的私有方法。

    public class Haha {
    interface Animal {
        //Java8提供了默认方法,却没有提供私有方法,这就十分脑残
        default void shout() {
            this.realShout();
        }
    
        //接口只能定义default方法和私有方法,不能什么都不写
        //void run(){}
    
        //Java9接口终于提供了私有方法,以供默认方法调用
        private void realShout() {
            System.out.println("我该怎么叫?");
        }
    }
    static class Dog implements Animal {
        //无法重写realShout,只能重写shout
        @Override
        public void shout() {
            System.out.println("汪汪汪");
        }
    }
    public static void main(String[] args) {
        Dog d = new Dog();
        d.shout();
    }
    }
    

    6、改进 try-with-resources

    Java8 以前为了关闭打开的资源,需要写很多 finally 代码。 Java8 提供了增强的 try 语句,可以让 try 中的资源在抛出异常时或者正常结束时自动关闭资源。 Java9 进一步增强 try 语句,try 中可以指明让 try 接管的资源。

    import java.io.Closeable;
    import java.io.IOException;
    
    class Haha {
    static class Resource implements Closeable {
        @Override
        public void close() throws IOException {
            System.out.println("I am closed");
        }
    }
    
    public static void main(String[] args) {
        //java8中只能把资源定义在try语句中
        try (Resource r1 = new Resource(); Resource r2 = new Resource()) {
    
        } catch (IOException e) {
            e.printStackTrace();
        }
        //Java9中资源可以放在try外面
        Resource r3 = new Resource();
        Resource r4 = new Resource();
        try (r3; r4) {
    
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    }
    

    7、增强钻石运算符

    这个特性实际上是更加强大的自动类型推导机制。

    Set<String> a = new HashSet<>() {
        @Override
        public boolean add(String s) {
            return super.add(s);
        }
    };
    

    8、限制使用下划线标识符

    在 Java 中,_$都是合法的标识符。但从 JDK9 开始,_成为不合法的标识符。

    9、更省内存的 String 实现

    String 类型无疑是 Java 中最常用的非基本类型,以前它的底层实现是用char[]来存储各个字符,这种方式导致一些 ASCII 码需要占用两个字节来保存,因为一个 char 占用 2 个字节。JDK9 中将 String 的底层实现改成了byte[],同样 StringBuilder 也进行了相同的变换。

    10、集合的 of 函数快速创建集合

    告别铅与火,走向光与电。以前的 Java 创建集合对象只能不停地 add,现在可以直接使用 of。需要注意,使用 of 创建的集合是只读的,尝试修改它们会抛出异常java.lang.UnsupportedOperationExceptionList.of()Set.of()接受的变量类型会自动求类型的最近公共祖先,在 Java 中一切对象皆为 Object,整个类型系统可以视为一棵树。Map.of()接受的变量类型是交替的 K、V 对,对于K和V会分别计算最近公共祖先。

    import java.util.List;
    import java.util.Map;
    import java.util.Set;
    
    class Haha {
    
    public static void main(String[] args) {
        List<String> a = List.of("one", "two", "three");
        //a.add("four");//java.lang.UnsupportedOperationException
        System.out.println(a);
        System.out.println(List.of("one two three".split("\s+")));
        System.out.println(Set.of("one two three".split("\s")));
        System.out.println(Map.of(1, "one", 2, "two", 3, "three"));
    }
    }
    

    11、增强的stream API

    (1)takeWhile
    从第一个元素开始,一直到不满足条件为止。

    List<Integer> list = Arrays.asList(45,43,76,87,42,77,90,73,67,88);
    list.stream().takeWhile((x) -> x < 80 ).forEach(System.out::println);
    

    (2)dropWhite
    从第一个元素开始,如果满足条件则忽略该元素,一直到不满足该条件才开始接受元素。
    (3)ofNullable
    以前Stream不能完全为null,JDK9中可以了。

    //NullPointerException
    //Stream<Object> stream1 = Stream.of(null);
    //System.out.println(stream1.count());
    //不报异常  允许这样写
    Stream<String> stringStream = Stream.of("AA", "BB", null);
    System.out.println(stringStream.count());
    //不报异常  允许这样写
    List<String> list = new ArrayList<>();
    list.add("A");
    list.add(null);
    System.out.println(list.stream().count());
    //ofNullable() :允许值为 null
    Stream<Object> stream = Stream.ofNullable(null);
    System.out.println(stream.count());
    Stream<String> stream2 = Stream.ofNullable("Hello World");
    System.out.println(stream2.count());
    

    (4)iterate
    iterate可以充当循环用,在JDK8中iterate需要配合limit作为终止条件,这样不够灵活。JDK9中提供了类似for的形式iterate函数重载。

    //JDK8 使用iterate方法,需配合limit截止。
    Stream.iterate(1, (x) -> x + 1).limit(10).forEach(System.out::print);
    System.out.println();
    //JDK9 使用iterate的重载方法可以直接使用Predicate来截止。
    Stream.iterate(1,(x) -> x <= 10, (x) -> x + 1).forEach(System.out::print);
    

    12、全新的HTTP客户端API

    HTTP,用于传输网页的协议,早在 1997 年就被采用在目前的 1.1版本中。直到 2015 年,HTTP2 才成为标准。

    HTTP/1.1和HTTP/2的主要区别是如何在客户端和服务器之间构建和传输数据。HTTP/1.1 依赖于请求/响应周期。 HTTP/2 允许服务器“push”数据:它可以发送比客户端请求更多的数据。 这使得它可以优先处理并发送对于首先加载网页至关重要的数据。

    Apache的HTTP Client可以被淘汰了,Java标准库越来越强大。

    import java.io.IOException;
    import java.net.URI;
    import java.net.http.HttpClient;
    import java.net.http.HttpRequest;
    import java.net.http.HttpResponse;
    
    class Haha {
    public static void main(String[] args) throws IOException, InterruptedException {
        HttpClient cli = HttpClient.newHttpClient();
        HttpResponse<String> res = cli.send(HttpRequest.newBuilder().GET().uri(URI.create("https://www.cnblogs.com")).build(), HttpResponse.BodyHandlers.ofString());
        System.out.println(res.body());
    }
    }
    

    其它

    • java.awt.image新增多分辨率API。
    • 改进的Optional类
    • 统一的 JVM 日志系统
    • 智能 JAVA 编译工具
    • Javadoc 的 HTML5 支持
    • Java 动态编译器

    参考资料

    https://www.cnblogs.com/peter1018/p/9209951.html

  • 相关阅读:
    php操作apache服务器上的ftp
    win7配置ftp服务
    php访问远程服务器上的文件
    php操作ini配置文件
    php操作redis简单例子
    win7 32位安装php redis驱动
    mysql事务处理
    php使用PDO连接mysql数据库
    远程连接redis
    设置表格td宽度
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/10920840.html
Copyright © 2011-2022 走看看