标签:table handle res 新特性 多层 声明变量 stat string 环境
产生背景:开发者经常抱怨Java中引用代码的程度。局部变量的显示类型声明,常常被认为是是不必须的,给一个好听的名字经常可以很清楚的表达出下面应该怎样继续。
好处:减少了啰嗦和形式的代码,避免了信息冗余,而且对齐了变量名,更容易阅读!
使用:var关键字
public static void main(String[] args) {
//声明变量时,根据所赋的值,推断变量的类型
var num = 10;
var str = "string";
var str2 = "string2";
System.out.println(str instanceof String);
var list = new ArrayList<String>();
//list.add(num); //本行编译不通过
list.add(str);
list.add(str2);
for (var o : list) {
System.out.println(o);
}
}
上述代码字节码反编译后:
方法返回值:
方法参数类型:
构造器参数类型:
类的属性:
catch块:
在处理var时,编译器先是查看表达式右边部分,并根据右边变量值的类型进行推断,作为左边变量的类型,然后将该类型写入字节码当中。
注意:var不是一个关键字
你不需要担心变量名或方法名会与var发生冲突,因为var实际上并不是一个关键字,而是一个类型名,只有在编译器需要知道类型的地方才需要用到它。除此之外,它就是一个普通合法的标识符。也就是说,除了不能用它作为类名,其他的都可以,但极少人会用它作为类名。
List.copyOf:创建一个只读集合
此外不只List有,Set和Map都添加了该API
public static void main(String[] args) {
//jdk9新特性 List.of
var list1 = List.of("java","spring","js");
//jdk10新特性 List.copyOf
var list2 = List.copyOf(list1);
System.out.println(list1 == list2);
var list3 = new ArrayList<>();
var list4 = List.copyOf(list3);
System.out.println(list3 == list4);
}
为什么一个true一个false?
源码如下:当原集合是只读集合就直接返回,否则创建一个新的只读集合并返回。而List.of创建的就是只读集合,不可修改。
jdk11是一个长期支持的版本
判断是否为空:isBlank
去除首尾空格:strip
去除尾部空格:stripTrailing
去除首部空格:stripLeading
复制字符串:repeat
行数统计:lines
public static void main(String[] args) {
System.out.println(" \r\n \t ".isBlank());
System.out.println("--"+" \r\n \t ".strip()+"--");
System.out.println("--"+" java ".stripTrailing()+"--");
System.out.println("--"+" java ".stripLeading()+"--");
System.out.println(" java".repeat(2));
System.out.println(" \r\n \t ".lines().count());
}
Optional<Object> op = Optional.empty();
System.out.println(op.isEmpty());//判断内部value是否为空
System.out.println(op.isPresent());//判断内部value是否存在
var op2 = Optional.of("op");
System.out.println(op2.orElseThrow());
var o = op.orElseThrow();
在var上添加注解的语法格式,在jdk10中不能实现,在jdk11中加入了该语法。
public static void main(String[] args) {
aSync();
sync();
}
/**
* 同步调用
* @author wen.jie
* @date 2021/4/21 14:45
*/
private static void sync() {
try {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder(URI.create("http://www.baidu.com")).build();
HttpResponse.BodyHandler<String> bodyHandler = HttpResponse.BodyHandlers.ofString();
HttpResponse<String> response = client.send(request, bodyHandler);
String body = response.body();
System.out.println(body);
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
/**
* 异步调用
* @author wen.jie
* @date 2021/4/21 14:45
*/
private static void aSync() {
try {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder(URI.create("http://www.baidu.com")).build();
HttpResponse.BodyHandler<String> bodyHandler = HttpResponse.BodyHandlers.ofString();
CompletableFuture<HttpResponse<String>> completableFuture = client.sendAsync(request, bodyHandler);
HttpResponse<String> response = completableFuture.get();
String body = response.body();
System.out.println(body);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
以往我们运行代码要经过两部,先javac,再java
现在只需要一步,只需要一个java命令就行了。
我在桌面上放了一个Hello.java文件,内容很简单,输出Hello
运行这个文件很简单:
java Hello.java
一个命令编译运行源代码的注意点:
废除Nashorn javascript引擎,在后续版本准备移除掉,有需要的可以考虑使用GraalVM。
GC是java主要优势之一。然而,当GC停顿太长,就会开始影响应用的响应时间。消除或者减少GC停顿时长,java将对更广泛的应用场景是一个更有吸引力的平台。此外,现代系统中可用内存不断增长,用户和程序员希望JVM能够以高效的方式充分利用这些内存,并且无需长时间的GC暂停时间。
ZGC,A Scalable Low-Latency Garbage Collector (Experimental) ZGC,这应该是JDK11最为瞩目的特性,没有之一。但是后面带了Experimental,说明这还不建议用到生产环境。
ZGC是一个并发,基于region,压缩型的垃圾收集器,只有root扫描阶段会STW(stop the world),因此GC停顿时间不会随着堆的增长和存活对象的增长而变长。
优势:
ZGC的设计目标是:支持TB级内存容量,暂停时间低(<10ms),对整个程序吞吐量的影响小于15%。将来还可以扩展实现机制,以支持不少令人兴奋的功能,例如多层堆(即热对象置于DRAM和冷对象置于NVMe闪存),或压缩堆。
标签:table handle res 新特性 多层 声明变量 stat string 环境
原文地址:https://www.cnblogs.com/wwjj4811/p/14685373.html