String中新增的API
API
代码
package com.dance;
public class SpringApiTest {
public static void main(String[] args) {
isBlankTest();
stripTest();
stripTest2();
repeatTest();
linesCount();
}
/**
* 判断字符串是否为空
* \t \n 都属于空
*/
public static void isBlankTest() {
System.out.println(" \t \n ".isBlank());
}
/**
* 去除字符串首尾空格
* 为什么有了trim方法后,还要出strip呢
* 因为在trim方法中,只能去除半角空白字符,全角的空白字符是去除不了的
* 所以又除了strip方法,可以去除半角和全角的空白
*/
public static void stripTest(){
System.out.println(" 这是一个很寂寞的天,下着有些伤心的雨 \u3000".trim() + "!");
System.out.println(" 这是一个很寂寞的天,下着有些伤心的雨 \u3000".strip() + "!");
}
/**
* stripTrailing : 去除尾部空格
* stripLeading : 去除首部空格
*/
public static void stripTest2(){
System.out.println(" flower ".stripTrailing() + "!");
System.out.println(" flower ".stripLeading() + "!");
}
/**
* 重复, 返回一个新的String
*/
public static void repeatTest(){
System.out.println("123".repeat(3));
}
/**
* 统计行数
* \n \r 都是换行
*/
public static void linesCount(){
System.out.println("123\n12\r3".lines().count());
}
}
执行结果
true
这是一个很寂寞的天,下着有些伤心的雨 !
这是一个很寂寞的天,下着有些伤心的雨!
flower!
flower !
123123123
3
Optional中新增API
Optional中也增加了几个方法,现在可以很方便的讲一个 Optional转换成一个Stream,或者当一个空Optional时给他一个代替
API
代码
package com.dance;
import java.util.Optional;
public class OptionalApiTest {
public static void main(String[] args) {
isEmpty();
ifPresentOrElse("abc");
ifPresentOrElse(null);
System.out.println(or("abc"));
System.out.println(or(null));
orElseThrow();
}
/**
* 判断当前Optional是否为空
*/
public static void isEmpty() {
// 创建一个空的
Optional<Object> empty = Optional.empty();
// 调用方法
// 是否存在
System.out.println(empty.isPresent());
// 是否为空
System.out.println(empty.isEmpty());
}
/**
* 如果值非空执行参数1,为空执行参数2
*
* @param str 字符串
*/
public static void ifPresentOrElse(String str) {
Optional.ofNullable(str).ifPresentOrElse(
s -> {
System.out.println("value is " + s + " insert to db...");
},
() -> {
System.out.println("value is empty insert to db...");
});
}
/**
* 如果value有值,就返回自身,没有值就返回参数1的结果
*
* @param str 字符串
*/
private static Optional<String> or(String str) {
return Optional.ofNullable(str).or(() -> {
System.out.println("select to db by xxx....");
return Optional.of("db data");
});
}
/**
* 如果值不为空就返回值,为空就抛异常
*/
public static Object orElseThrow(){
return Optional.ofNullable(null).orElseThrow();
}
}
执行结果
false
true
value is abc insert to db...
value is empty insert to db...
Optional[abc]
select to db by xxx....
Optional[db data]
Exception in thread "main" java.util.NoSuchElementException: No value present
at java.base/java.util.Optional.orElseThrow(Optional.java:382)
at com.dance.OptionalApiTest.orElseThrow(OptionalApiTest.java:59)
at com.dance.OptionalApiTest.main(OptionalApiTest.java:12)
局部变量类型推断升级
在var 上添加注解的语法格式,在JDK10中是不能实现的,在JDK11中加入了这样的语法
代码
package com.dance;
import java.util.function.Consumer;
public class LocalVariableTest {
public static void main(String[] args) {
// 错误的形式: 必须要有类型,可以加上var
// Consumer<String> consumer = (String t) -> System.out.println(t.toUpperCase());
// 在不使用var的前提下可以显示声明类型
Consumer<String> consumer = (@Deprecated String t) -> System.out.println(t.toUpperCase());
// 使用var声明,其实还是语法糖,应为已经通过前面的泛型推断出来了后面的类型
Consumer<String> consumer2 = (@Deprecated var t) -> System.out.println(t.toUpperCase());
}
}
全新的HTTP客户端API
- 这是Java9开始引入的一个处理HTTP请求的HTTP Client API ,该API支持同步和异步,以前是在jdk.incubator.httpclient包下的,在Java的依赖库中是找不到的,需要单独添加模块,而在JDK11中已经为正式可用状态,已经可以在Java.net网络包中找到了
更简化的编译运行程序
看下面的代码 // 编译 javac xxx.java // 运行 java xxx 在我们的认知里面,要运行一个Java源代码必须先编译,再运行,两步执行动作,而在未来的Java11中,通过一个Java 命令就直接搞定了 // 举例 java xxx.java
一个命令编译运行源代码的注意点:
- 执行源文件中的第一个类,第一个类必须包含主方法
并且不可以使用其他源文件中的自定义类,本文件中的自定义类是可以使用的
废弃Nashorn引擎
废除Nashorn javascript引擎,在后续版本准备移除掉,有需要的可以考虑使用GraalVM
ZGC
GC是Java主要优势之一,然而当GC时间过长,就会开始影响应用的响应时间,消除或者减少GC停顿时长,Java将会对更广泛的应用场景是一个更有吸引力的平台,此外,现在系统中可用内存不断增长,用户和程序员希望JVM能够以高效的方式充分利用这些内存,并且无需长时间的GC暂停时间
- ZGC, A Scalable low-latency Garbage Conllector(Experimental)
- 翻译: ZGC,一个可扩展的低延迟垃圾收集器(实验)
- 这是JDK11最瞩目的特性,没有之一,但是后面带了experimental,说明这还不建议用到生产环境
- ZGC是一个并发, 基于region(区域),压缩型的垃圾收集器,只有ROOT扫描阶段会STW(Stop the world),因此GC停顿时间不会随着堆的增长而变长
- 优势
- GC暂停时间不会超过10ms
- 既能处理几百兆的小堆,也能处理几个T的大堆(OMG…)
- 和G1相比,应用吞吐能力不会下降超过15%
- 为未来的GC功能和利用colord(彩色的)指针以及Load barriers(负载屏障)优化奠定基础
- 初始只支持64位系统
- ZGC的设计目标是: 支持TB级内存容量,暂停延迟低(<10ms),对整个程序吞吐量的影响小于15%,将来还可以扩展实现机制,以支持不少令人兴奋的功能,例如:多层堆(即热对象置于DRAM和冷对象置于NVMe闪存)或堆压缩
其他新特性
- Unicode10
- Deprecate the Pack200 Tools And API
- 新的Epsilon垃圾收集器
- 完全支持Linux容器(包括Docker)
- 支持G1上的并行完全垃圾收集
- 最新的HTTPS安全协议TLS 1.3
- Java Flight Recorder