java11新特性_Java11新特性

局部变量类型推断增强

Java11中可以在lambda表达式的形参中使用var,好处是可以在形参上加注解

使用示例

(@Deprecated var x, @Nullable var y)->x.process(y)

API增强

不可修改集合API

//Jdk 里面为集合(List/ Set/ Map)都添加了 of 和 copyOf 方法,它们两个都用来创建不可变的集合

//示例1

var list = List.of("Java", "Python", "C");

var copy = List.copyOf(list);

System.out.println(list == copy); // true

//示例2

var list = new ArrayList();

var copy = List.copyOf(list);

System.out.println(list == copy); // false

//示例1和2代码差不多,为什么一个为true,一个为false?

//源码部分

static List of(E... elements) {

switch (elements.length) { // implicit null check of elements

case 0:

return ImmutableCollections.emptyList();

case 1:

return new ImmutableCollections.List12<>(elements[0]);

case 2:

return new ImmutableCollections.List12<>(elements[0], elements[1]);

default:

return new ImmutableCollections.ListN<>(elements);

}

}

static List copyOf(Collection extends E> coll) {

return ImmutableCollections.listCopy(coll);

}

static List listCopy(Collection extends E> coll) {

if (coll instanceof AbstractImmutableList && coll.getClass() != SubList.class) {

return (List)coll;

} else {

return (List)List.of(coll.toArray());

}

}

/**

* 可以看出 copyOf 方法会先判断来源集合是不是 AbstractImmutableList 类型的,如果是,就直接返回,如果不是,则调用 of 创建一个新的集合。

* 示例2因为用的 new 创建的集合,不属于不可变 AbstractImmutableList 类的子类,所以 copyOf 方法又创建了一个新的实例,所以为false.

* 注意:使用of和copyOf创建的集合为不可变集合,不能进行添加、删除、替换、排序等操作,不然会报 java.lang.UnsupportedOperationException 异常。

* 上面演示了 List 的 of 和 copyOf 方法,Set 和 Map 接口都有

*/

Stream 加强

//1) 增加单个参数构造方法,可为null

Stream.ofNullable(null).count(); // 0

//2) 增加 takeWhile 和 dropWhile 方法

Stream.of(1, 2, 3, 2, 1)

.takeWhile(n -> n < 3)

.collect(Collectors.toList()); // [1, 2]

//从开始计算,当 n < 3 时就截止。

Stream.of(1, 2, 3, 2, 1)

.dropWhile(n -> n < 3)

.collect(Collectors.toList()); // [3, 2, 1]

//这个和上面的相反,一旦 n < 3 不成立就开始计算。

//3)iterate重载

//这个 iterate 方法的新重载方法,可以让你提供一个 Predicate (判断条件)来指定什么时候结束迭代

增加了一系列字符串处理的方法

// 判断字符串是否为空白

" ".isBlank(); // true

// 去除首尾空白

" Javastack ".strip(); // "Javastack"

// 去除尾部空格

" Javastack ".stripTrailing(); // " Javastack"

// 去除首部空格

" Javastack ".stripLeading(); // "Javastack "

// 复制字符串

"Java".repeat(3);// "JavaJavaJava"

// 行数统计

"A\nB\nC".lines().count(); // 3

Optional增强

//Opthonal 也增加了几个非常酷的方法,现在可以很方便的将一个 Optional 转换成一个 Stream, 或者当一个空 Optional 时给它一个替代的。

Optional.of("javastack").orElseThrow(); // javastack

Optional.of("javastack").stream().count(); // 1

Optional.ofNullable(null)

.or(() -> Optional.of("javastack"))

.get(); // javastack

InputStream加强

//InputStream 终于有了一个非常有用的方法:transferTo,可以用来将数据直接传输到 OutputStream,这是在处理原始数据流时非常常见的一种用法,如下示例

var classLoader = ClassLoader.getSystemClassLoader();

var inputStream = classLoader.getResourceAsStream("javastack.txt");

var javastack = File.createTempFile("javastack2", "txt");

try (var outputStream = new FileOutputStream(javastack)) {

inputStream.transferTo(outputStream);

}

移除的一些内容

//移除项

移除了com.sun.awt.AWTUtilities

移除了sun.misc.Unsafe.defineClass,

使用java.lang.invoke.MethodHandles.Lookup.defineClass来替代

移除了Thread.destroy()以及 Thread.stop(Throwable)方法

移除了sun.nio.ch.disableSystemWideOverlappingFileLockCheck、sun.locale.formatasdefault属性

移除了jdk.snmp模块

移除了javafx,openjdk估计是从java10版本就移除了,oracle jdk10还尚未移除javafx,而java11版本则oracle的jdk版本也移除了javafx

移除了Java Mission Control,从JDK中移除之后,需要自己单独下载

移除了这些Root Certificates :Baltimore Cybertrust Code Signing CA,SECOM ,AOL and Swisscom

//废弃项

-XX+AggressiveOpts

-XX:+UnlockCommercialFeatures

-XX:+LogCommercialFeatures

标准Java异步HTTP客户端

/**

* 这是 Java 9 开始引入的一个处理 HTTP 请求的的 HTTP Client API,该 API 支持同步和异步,而在 Java 11 中已经为正式可用状态,你可以在 java.net 包中找到这个 API

*/

var request = HttpRequest.newBuilder().uri(URI.create("https://javastack.cn")).GET().build();

var client = HttpClient.newHttpClient();

// 同步

HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());

System.out.println(response.body());

// 异步

client.sendAsync(request, HttpResponse.BodyHandlers.ofString())

.thenApply(HttpResponse::body)

.thenAccept(System.out::println);

更简化的编译运行程序

// 之前编译运行的流程

// 编译

javac Javastack.java

// 运行

java Javastack

/**

* Java11之后一行命令

* 使用条件:

* 1)执行源文件中的第一个类, 第一个类必须包含主方法

* 2)并且不可以使用别源文件中的自定义类, 本文件中的自定义类是可以使用的

*/

java Javastack.java

Unicode 10

Unicode 10 增加了8518个字符, 总计达到了136690个字符. 并且增加了4个脚本.同时还有56个新的emoji表情符号

Remove the JavaEE and CORBA Moudles

在java11中移除了不太使用的JavaEE模块和CORBA技术

CORBA来自于二十世纪九十年代,Oracle说,现在用CORBA开发现代Java应用程序已经没有意义了,维护CORBA的成本已经超过了保留它带来的好处。

但是删除CORBA将使得那些依赖于JDK提供部分CORBA API的CORBA实现无法运行。目前还没有第三方CORBA版本,也不确定是否会有第三方愿意接手CORBA API的维护工作。

在java11中将java9标记废弃的Java EE及CORBA模块移除掉,具体如下:

(1)xml相关的,

java.xml.ws,

java.xml.bind,

java.xml.ws,

java.xml.ws.annotation,

jdk.xml.bind,

jdk.xml.ws被移除,

只剩下java.xml,java.xml.crypto,jdk.xml.dom这几个模块

(2)java.corba

java.se.ee,

java.activation,

java.transaction被移除,

但是java11新增一个java.transaction.xa模块

Epsilon垃圾收集器

A NoOp Garbage Collector

JDK上对这个特性的描述是: 开发一个处理内存分配但不实现任何实际内存回收机制的GC, 一旦可用堆内存用完, JVM就会退出.

如果有System.gc()调用, 实际上什么也不会发生(这种场景下和-XX:+DisableExplicitGC效果一样), 因为没有内存回收, 这个实现可能会警告用户尝试强制GC是徒劳

用法 : -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC

使用这个选项的原因 :

提供完全被动的GC实现, 具有有限的分配限制和尽可能低的延迟开销,但代价是内存占用和内存吞吐量.

众所周知, java实现可广泛选择高度可配置的GC实现. 各种可用的收集器最终满足不同的需求, 即使它们的可配置性使它们的功能相交. 有时更容易维护单独的实现, 而不是在现有GC实现上堆积另一个配置选项.

主要用途如下 :

性能测试(它可以帮助过滤掉GC引起的性能假象)

内存压力测试(例如,知道测试用例 应该分配不超过1GB的内存, 我们可以使用-Xmx1g –XX:+UseEpsilonGC, 如果程序有问题, 则程序会崩溃)

非常短的JOB任务(对象这种任务, 接受GC清理堆那都是浪费空间)

VM接口测试

Last-drop 延迟&吞吐改进

ZGC, 这应该是JDK11最为瞩目的特性, 没有之一. 但是后面带了Experimental, 说明这还不建议用到生产环境,这里简单介绍,稍后单独介绍ZGC

ZGC的特点:

GC暂停时间不会超过10ms

既能处理几百兆的小堆, 也能处理几个T的大堆(OMG)

和G1相比, 应用吞吐能力不会下降超过15%

为未来的GC功能和利用colord指针以及Load barriers优化奠定基础

初始只支持64位系统

用法:

-XX:+UnlockExperimentalVMOptions –XX:+UseZGC

杰笛数据透视表格 Pivot Grid 杰笛数据透视表格利用Java/Swing实现了在Microsoft Excel里面非常著名的数据透视表(PivotTable)功能。这个功能也在很多数据分析和OLAP应用程序里出现过。数据透视表的特点就是帮助您从一堆看似杂乱的数据里找到您想要的趋势或者规律,所以把Pivot Table翻译成数据透视表,倒是很贴切。您可以组织、统计、比较、排序,来找到对您感兴趣的方面有用的信息,就好像透视一样。有了杰笛数据透视表,您就可以把这样一个有用的工具集成到您的Java应用程序里,而不需要借助于第三方应用程序。该产品是建立在杰笛表格基础上的,并且充分利用了杰笛表格提供的各种表格功能。 功能介绍 支持从任何TableModel读取数据。至于TableModel,您可以从很多途径来产生,比如数据库,XML,文件,网络等等都可以。 用户可以用拖放来调整布局 自动计算出统计结果,包括SUM、MAX、MIN、MEAN、VAR、STDDEV、COUNT等等统计,您也可以引进自己的统计结果。 自动对行和列进行分类汇总和全部汇总。 对原始数据分类。 支持表格色彩、字体等等的调节,突出重点。 数据过滤功能。 数据排序功能。 支持衍生域,所谓衍生域就是从其它现有的域算出来的新的域,计算方法可以是一个自定义表达式。 支持保存布局到XML文件。 单独的AggregateTable控件,支持对数据进行分类合并,可以展开折叠。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值