Java11常用新特性的学习和使用

1. JShell

是Java的交互式客户端

[root@bigdata001 opt]# zulu11.56.19-ca-jdk11.0.15-linux_x64/bin/jshell 
5月 29, 2022 1:38:14 下午 java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
|  欢迎使用 JShell -- 版本 11.0.15
|  要大致了解该版本, 请键入: /help intro

jshell> System.out.println(
   ...> "hello world"
   ...> )
hello world

jshell> /help

2. var"关键字"

能进行局部变量类型推断。局部变量是在方法中申明的变量,不能用于类中的属性。如下所示

jshell> List<Integer> list = new ArrayList<>()
list ==> []

jshell> 

jshell> var str = "hello world"
str ==> "hello world"

jshell> 

jshell> Consumer<String> consumer = (@Deprecated var str) -> System.out.println(str.toUpperCase())
consumer ==> $Lambda$24/0x00000008000b5c40@5e3a8624

jshell> consumer.accept("hello world")
HELLO WORLD

jshell> 

3. Java集合新增API

jshell> List<Integer> list = List.of(1, 2, 3)
list ==> [1, 2, 3]

jshell> list.add(4)
|  异常错误 java.lang.UnsupportedOperationException
|        at ImmutableCollections.uoe (ImmutableCollections.java:72)
|        at ImmutableCollections$AbstractImmutableCollection.add (ImmutableCollections.java:76)
|        at (#16:1)

jshell> 

jshell> Set<Integer> set = Set.of(1, 3, 7, 5, 3)
|  异常错误 java.lang.IllegalArgumentException:duplicate element: 3
|        at ImmutableCollections$SetN.<init> (ImmutableCollections.java:604)
|        at Set.of (Set.java:541)
|        at (#21:1)

jshell> Set<Integer> set = Set.of(1, 3, 7, 5)
set ==> [5, 7, 1, 3]

jshell>

4. String新增API

  1. 判断字符串是否为空白字符。其中空白字符包含\t、\n、\r、英文中文等其它语言空格
jshell> var str = "\t \n \r"
str ==> "\t \n \r"

jshell> str.isBlank()
$2 ==> true

jshell> 
  1. 去除首尾空白字符。其中str.stripLeading()去除首部空白字符,str.stripTrailing()去除尾部空白字符
jshell> var str = "\t abc\n \r"
str ==> "\t abc\n \r"

jshell> str.strip()
$5 ==> "abc"

jshell>
  1. 复制字符串
jshell> "java".repeat(3)
$8 ==> "javajavajava"

jshell> 

4 行数统计

jshell> "A\nB\nC".lines().count()
$9 ==> 3

jshell>

5. InputStream.transferTo方法

用来将数据从InputStream直接传输到OutputStream

查看test.input文件内容如下

[root@bigdata005 opt]# cat test.input 
hello world
hello java
[root@bigdata005 opt]#

使用transferTo方法,将test.input文件内容拷贝到test.output文件

jshell> InputStream is = new FileInputStream("/opt/test.input")
is ==> java.io.FileInputStream@7f13d6e

jshell> OutputStream os = new FileOutputStream("/opt/test.output")
os ==> java.io.FileOutputStream@59494225

jshell> is.transferTo(os)
$14 ==> 23

jshell> is.close()

jshell> os.close()

jshell>

查看test.output文件内容如下

[root@bigdata005 opt]# cat test.output 
hello world
hello java
[root@bigdata005 opt]#

6. Java原生的HTTP客户端

支持同步请求和异步请求两种方式

import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.concurrent.CompletableFuture;

public class Java11Test {
    public static void main(String[] args) throws Exception {

        var client = HttpClient.newHttpClient();
        var request = HttpRequest
                .newBuilder(URI.create("http://192.168.8.111:8081"))
                .build();
        HttpResponse.BodyHandler<String> bodyHandler = HttpResponse.BodyHandlers.ofString();

        // ======================================同步请求方式================================
        HttpResponse<String> response = client.send(request, bodyHandler);
        System.out.println(response.body());

        // ======================================异步请求方式================================
        CompletableFuture<HttpResponse<String>> sendAsync = client.sendAsync(request, bodyHandler);
        // 异步处理姐结果
        sendAsync.whenComplete((HttpResponse<String> asyncResponse, Throwable throwable) -> {
            System.out.println(asyncResponse.body());
        });
        // 阻塞等待所有任务执行完成
        CompletableFuture.allOf(sendAsync).join();
        
    }
}

7. java命令直接运行单个.java文件

说明:

  • 不会产生.class文件
  • 会执行.java文件中的第一个类, 且第一个类必须包含main方法
  • 可以使用本.java文件中的自定义类,不可以使用其它.java文件中的自定义类

示例如下:

[root@bigdata001 ~]# cat Test.java 
public class Test {
    public static void main(String[] args) {
        new Person();
        System.out.println("hello world");
    }
}

class Person {
    private String name;
}
[root@bigdata001 ~]# 
[root@bigdata001 ~]# java Test.java 
hello world
[root@bigdata001 ~]#

8. ZGC垃圾收集器

ZGC(A Scalable Low-Latency Garbage Collector),特点如下:

  • GC暂停时间不会超过10ms
  • 能处理几百MB到几个TB的堆
  • 和G1相比, 应用吞吐能力下降不会超过15%
  • 并发进行垃圾收集,且只有root扫描阶段会stop the world, 因此GC停顿时间不会随着堆的增长而变长

开启ZGC垃圾收集器示例

[root@bigdata001 ~]# javac Test.java 
[root@bigdata001 ~]# 
[root@bigdata001 ~]# java -XX:+UnlockExperimentalVMOptions -XX:+UseZGC Test
hello world
[root@bigdata001 ~]#  

猜你喜欢

转载自blog.csdn.net/yy8623977/article/details/125030004