1)2018年3月21日,Oracle官方宣布Java 10正式发布。
2)需要注意的是Java 9和Java 10都不是LTS(Long-Term-Support)版本。和过去的Java大版本升级不同,这两个只有半年左右的开发和维护期。而未来的Java 11,也就是18.9 LTS,才是Java 8之后第一个LTS版本。
3)JDK 10一共定义了109个新特性,其中包含12个JEP(对程序员来讲,真正的新特性其实就一个),还有一些新API和JVM规范以及JAVA语言规范上的改动。
局部变量类型推断:1)产生背景:
开发者经常抱怨Java中引用代码的程度,局部变量的显示类型声明,常被认为是不必须的,给一个好听的名字可以清楚表达出下面应该怎样继续。
2)好处:
减少了啰嗦和形式的代码,避免了信息荣誉,而且对其了变量名,更容易阅读。
3)举例如下:
场景一:类实例化时
作为Java开发者,在声明一个变量时,我们总是习惯了敲打两次变量类型,第一次用于声明变量类型,第二次用于构造器。
linkedHashSet
场景二:返回值类型含复杂泛型结构
变量的声明类型书写复杂且较长,尤其是加上泛型的使用。
Iterator
场景三:
我们经常声明一种变量,它只会被使用一次,而且是用在下一行代码中,比如:
URL url=new URL("http://www.baidu.com");
URLConnection connection=url.openConnection();
Reader reader=new BufferedReader(new InputStreamReader(connection.getInputStream()));
尽管IDE可以帮我们自动完成这些代码,但当变量总是跳来跳去的时候,可读性还是会受到影响,因为变量类型的名称由各种不同长度的字符组成。而且,有时候开发人员会尽力避免声明中间的变量,因为太多的类型声明只会分散注意力,不会带来额外的好处。
适用于以下情况:
//1.局部变量的初始化
var list=new ArrayList<>();
//2.增强for循环中的索引
for(var v:list){
System.out.println(v);
}
//3.传统for循环中
for(var i=0;i<100;i++){
System.out.println(i);
}
在局部变量中使用时,如下情况不适用:
初始值为null、方法引用、Lambda表达式、为数组静态初始化
不适用于以下的结构:
没有初始化的局部变量声明、方法的返回类型、方法的参数类型、构造器的参数类型、属性、catch块
工作原理:在处理var时,编译器先是查看表达式右边部分,并根据右边变量值的类型进行推断,作为左边变量的类型,然后将该类型写入字节码当中。
注意:var不是一个关键字。不需要担心变量名或方法名会与var发生冲突,因为var实际上并不是一个关键字,而是一个类型名,只有在编译器需要知道类型的地方才需要用到它。除此之外,它就是一个普通合法的标识符。也就是说,除了不能用它作为类名,其他的都可以,但极少数人会用它做类名。
这不是Javascript。var并不会改变Java是一门静态类型语言的试试。编译器负责推断出类型,并把结果写入字节码文件,就好像是开发人员自己敲入类型一样。下面是使用IntelliJ(实际上是Fernflower的反编译器)反编译器反编译出的代码:
var url=new URL("http://www.baidu.com");
var connection=url.openConnection();
var reader=new BufferedReader(new InputStreamReader(connection.getInputStream()));
//反编译后
URL url=new URL("http://www.baidu.com");
URLConnection connection=url.openConnection();
BufferedReader reader=new BufferedReader(new InputStreamReader(connection.getInputStream()));
从代码来看,就好像之前声明了这些类型一样。事实上,这一特性只发生在编译阶段,与运行时无关,所以对运行时的性能不会产生任何影响。所以这不是Javascript。
Java 11简介:JDK11是一个长期支持版本(LTS,Long-Term-Support)。对于企业来说,选择11将意味着长期的、可靠的、可预测的技术路线图。其中免费的OpenJDK11确定将得到OpenJDK社区的长期支持,LTS版本将是可以放心选择的版本。
从JVM GC的角度,JDK11引入了两种新的GC,其中包括也许是划时代意义的ZGC,虽然其目前还是实验特性,但是从能力上来看,这是JDK的一个巨大突破,为特定生产环境的苛刻需求提供了一个可能的选择。例如,对部分企业核心存储等产品,如果能够保证不超过10ms的GC暂停,可靠性会上升。
新增一系列字符串处理方法:| 描述 | 举例 |
| 判断字符串是否为空白 | " ".isBlank(); //true |
| 去除首尾空白 | " Javastack ".strip(); //"Javastack" |
| 去除尾部空格 | " Javastack ".stripTrailing(); //" Javastack" |
| 去除首部空格 | " Javastack ".stripLeading(); //"Javastack " |
| 复制字符串 | "Java".repeat(3);//"JavaJavaJava" |
| 行数统计 | "AnBnC".lines().count();//3 |
Optional也增加了几个方法,现在可以很方便的将一个Optional转换成一个Stream,或者当一个空Optional时给它一个替代的。
| 新增方法 | 描述 | 新增的版本 |
| boolean isEmpty() | 判断value是否为空 | JDK 11 |
| ifPresentOrElse(Consumer super T>action,Runnable emptyAction) | value非空,执行参数1功能;如果value为空,执行参数2功能 | JDK 9 |
| Optional | value非空,返回对应的Optional;value为空,返回形参封装的Optional | JDK 9 |
| Stream | value非空,返回仅含此value的Stream;否则,返回一个空的Stream | JDK 9 |
| T orElseThrow() | value非空,返回value;否则抛异常NoSuchElementException | JDK10 |
举例:
@Test
public void test5(){
var op=Optional.empty();
System.out.println(op.isPresent());//判断内部的value是否存在
System.out.println(op.isEmpty());//判断内部的value是否为空
op=Optional.of("abc");
//orElseThrow():value非空,返回value;否则抛异常NoSuchElementException
var obj=op.orElseThrow();
System.out.println(obj);
Optional op1=Optional.of("hello");
//op=Optional.empty();
//or:value非空,返回对应的Optional;value为空,返回形参封装Optional
Optional
局部变量类型推断升级:
在var上添加注解的语法格式,在jdk 10中是不能实现的。在JDK 11中加入了这样的语法。
//错误的形式:必须要有类型,可以加上var //Consumer全新的HTTP客户端API:con1=(@Deprecated t)-> //System.out.println(t.toUpperCase()); //正确的形式: //使用var的好处是在使用lambda表达式时给参数加上注解 Consumer con2=(@Deprecated var t)-> System.out.println(t.tpUpperCase());
1)HTTP,用于传输网页的协议,早在1997年就被采用在目前的1.1版本中。直到2015年,HTTP2才成为标准。
2)HTTP/1.1和HTTP/2的主要区别是如何在客户端和都武器之间构建和传输数据。HTTP/1.1依赖于请求/响应周期。HTTP/2允许服务器“push”数据:它可以发送比客户端请求更多的数据。这使得它可以优先处理并发送对于首先加载网页至关重要的数据。
3)这是Java 9开始引入的一个处理HTTP请求的HTTP Client API,该API支持同步和异步,而在Java 11中已经成为正式可用状态,你可以在java.net包中找到这个API。
4)它将替代仅适用于blocking模式的HttpURLConnection,并提供对WebSocket和HTTP/2的支持
更简化的编译运行程序:
看看下面的代码
//编译
javac Javastack.java
//运行
java Javastack
要运行一个Java源代码必须先编译,再运行,两步执行动作。而在未来的Java 11版本中,通过一个java命令就直接搞定了,如下所示:java Javastack.java
一个命令编译运行源代码的注意点:
执行源文件中的第一个类,第一个类必须包含主方法。
并且不可以使用其他源文件中的自定义类,本文件中的自定义类是可以使用的。
废弃Nadhorn引擎:废除Nashorn javascript引擎,在后续版本中准备移除掉,有需要的可以考虑使用GraalVM。
ZGC:1)GC是java主要优势之一。然而,当GC停顿太长,就会开始影响应用的响应时间。消除或减少GC停顿时长,java将对更广泛的应用场景是一个更有吸引力的平台。此外,现代系统中可用内存不断增长,用户和程序员希望JVM能够以高效的方式充分利用这些内存,并且无需长时间的GC暂停时间。
2)ZGC,是JDK11最为瞩目的特性没有之一。但是后面带了Experimental,说明这还不建议用到生产环境。
3)ZGC是一个并发,基于region,压缩型的垃圾收集器,只有root扫描阶段会STW,因此GC停顿时间不会随着堆的增长和存活对象的增长而变长。



