JDK9 具体目录结构以下所示:html
bin: 该目录包含全部的命令。 conf: 包含用户能够编辑的配置文件,例如之前位于 jre\lib 目录中的.properties 和 .policy 文件。 include: 包含一些编译本地代码时使用的 C/C++头文件。 jmods: 包含 JMOD 格式的平台模块,建立自定义运行映射时须要它。 legal: 包含法律声明。 lib: 包含非 Windows 平台上动态连接的本地库,其子目录和文件不该由开发人员直接编辑或使用。Windows 平台的动态连接库直接放在了 bin 目录下。注:JDK9 目录中再也不有 jre 子目录,之前 JDK 和 JRE 是分开的,两者主要区别在于 JRE 只提供运行环境,而 JDK 额外提供了 Java 编译器。java
module-info.java:该文件必须位于项目的根目录中。该文件用于定义模块须要什么依赖,以及那些包被外部使用。 exports:控制着那些包能够被其余模块访问到,全部不被 exports 的包默认都被封装在模块里面不被外界所使用。 requires:指明对其余模块的依赖。shell
JShell 是 Java 的交互式命令行。输入/help 查看帮助。api
使用 javac、jar 等命令能够以任意版本编译、打包 Java 代码。服务器
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(); } }
Java8 之前为了关闭打开的资源,须要写不少 finally 代码。 Java8 提供了加强的 try 语句,可让 try 中的资源在抛出异常时或者正常结束时自动关闭资源。 Java9 进一步加强 try 语句,try 中能够指明让 try 接管的资源。ide
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(); } } }
这个特性其实是更增强大的自动类型推导机制。模块化
Set<String> a = new HashSet<>() { @Override public boolean add(String s) { return super.add(s); } };
在 Java 中,_
和$
都是合法的标识符。但从 JDK9 开始,_
成为不合法的标识符。函数
String 类型无疑是 Java 中最经常使用的非基本类型,之前它的底层实现是用char[]
来存储各个字符,这种方式致使一些 ASCII 码须要占用两个字节来保存,由于一个 char 占用 2 个字节。JDK9 中将 String 的底层实现改为了byte[]
,一样 StringBuilder 也进行了相同的变换。工具
告别铅与火,走向光与电。之前的 Java 建立集合对象只能不停地 add,如今能够直接使用 of。须要注意,使用 of 建立的集合是只读的,尝试修改它们会抛出异常java.lang.UnsupportedOperationException
。 List.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")); } }
(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);
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()); } }
https://www.cnblogs.com/peter1018/p/9209951.html