java 1_112.java基础21(java11新特性回顾)

1.JShell

最低java9 jdk; 并配置环境变量

cmd 中启动 jshell 进入 命令行,可以直接执行java代码,不需要编译

/help 帮助界面

2.局部变量类型推断:

List list = new ArrayList<>();

list.add("abc"); // 不能添加,转化不了Integer

var a = "abc"; == String a = "abc";

var b = new StringBuffer("123");

var a = new ArrayList();

System.out.println(a.getClass()); // class java.util.ArrayList

var n; 无法推断类型,不能这样使用,同时类的属性的数据类型不可以使用var

Thread t = new Thread(()->Systeom.out.println(Thread.currentThread().getName()));

t.start();

有参数的lambda表达式使用

函数式接口:

Consumer: 消费型函数式接口

public void accept(T t):

Counsumer consumer = t -> Systeom.out.println(t.toUpperCase());

Counsumer consumer = (var t) -> Systeom.out.println(t.toUpperCase());

Counsumer consumer = (@Nullnull/Deprecated var t) -> Systeom.out.println(t.toUpperCase()); // 可以给变量加注解,没有用var声明不能加注解

3.集合中的一些增强的API:

package com.atguigu.java11;

import java.time.LocalDate;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.List;

import java.util.Set;

import java.util.stream.Stream;

import org.junit.Test;

public class APITest {

// 集合中的一些增强的API

@Test

public void test3() {

LocalDate localDate = LocalDate.of(2019, 1, 21);

// 在添加重复元素时, 不是无法添加, 而是抛出异常

//Set set = Set.of(100, 50, 20, 30, 10, 8, 100, 8);

Set set = Set.of(100, 50, 20, 30, 10, 8);

System.out.println(set.getClass());

Stream stream = Stream.of(50, 20, 30, 70);

}

@Test

public void test2() {

//快速创建数组

int[] arr = {1, 9, 3, 2, 8};

// 快速把数据变成集合的方法

List list1 = Arrays.asList("aa", "yyy", "zzz", "123");

//list1.add("ppp"); // 是一个不可以添加元素的集合

// 集合的创建可以使用更简单的方式

List list2 = List.of("aa", "bbb", "cc", "DD");

System.out.println(list2);

//list2.add("yyy"); // 不可以添加元素

System.out.println(list2);

}

@Test

public void test1() {

List list = new ArrayList<>();

list.add("aa");

list.add("bbb");

list.add("cc");

list.add("DD");

System.out.println(list);

}

}

4.Stream 加强:

package com.atguigu.java11;

import java.util.stream.Stream;

import org.junit.Test;

/**

* 流的处理

* 1) 创建流

* 2) 中间操作

* 3) 终止操作

*/

public class StreamTest {

@Test

public void test3() {

// 流的迭代, 创建流

Stream stream1 = Stream.iterate(1, t -> (2 * t) + 1);

stream1.limit(10).forEach(System.out::println);

System.out.println("*************************");

// 有限的迭代

Stream stream2 = Stream.iterate(1, t -> t < 1000, t -> (2 * t) + 1);

stream2.forEach(System.out::println);

}

@Test

public void test2() {

Stream stream1 = Stream.of(3, 9, 20, 22, 40, 7);

// 新方法, takeWhile, dropWhile

// 从流中一直获取判定器为真的元素, 一旦遇到元素为假, 就终止处理.

Stream stream2 = stream1.takeWhile(t -> t % 2 != 0);

stream2.forEach(System.out::println); // 输出 3,9

System.out.println("**********************");

stream1 = Stream.of(3, 9, 20, 22, 40, 7);

Stream stream3 = stream1.dropWhile(t -> t % 2 != 0);

stream3.forEach(System.out::println); //输出 20,22,40,7

}

@Test

public void test1() {

Stream stream1 = Stream.of(3, 9, 20, 22, 40);

//stream1.forEach(t -> System.out.println(t));

stream1.forEach(System.out::println);

System.out.println("***********************************");

Stream stream2 = Stream.of(); // 流中没有数据

stream2.forEach(System.out::println);

System.out.println("***********************************");

// 传入null会被解析为是一个数组对象, 会进一步访问它的长度信息

//Stream stream3 = Stream.of(null);

//stream3.forEach(System.out::println);

// 可以传入 一个null来创建流对象

Stream stream3 = Stream.ofNullable(null);

stream3.forEach(System.out::println);

}

}

5.string 字符串新增方法:

package com.atguigu.java11;

import static org.junit.Assert.*;

import java.io.FileInputStream;

import org.junit.Test;

public class StringTest {

@Test

public void testName3() throws Exception {

FileInputStream fis = new FileInputStream("src/com/atguigu/java11/StringTest.java");

byte[] buffer = new byte[fis.available()];// fis.available() 整个文件的字符数

fis.read(buffer);

fis.close();

String string = new String(buffer);

string.lines().forEach(System.out::println); // string.lines()是stream流

}

@Test

public void testName2() throws Exception {

String string = "Java";

String string2 = string.repeat(5); //复制五次

System.out.println(string2); // JavaJavaJavaJavaJava

}

@Test

public void testName() throws Exception {

String string = " \t \r\n ";

System.out.println(string.isBlank()); // 判断字符串中的字符是否都是空白

System.out.println("**************************");

string = " \t \r\n abc \t ";

String string2 = string.strip(); // 去重字符串首尾的空白, 包括英文和其他所有语言中的空白字符

System.out.println(string2);

System.out.println(string2.length());

String string3 = string.trim(); // 去重字符串首尾的空白字符, 只能去除码值小于等于32的空白字符

System.out.println(string3);

System.out.println(string3.length());

System.out.println("**************************");

String string4 = string.stripLeading(); // 去重字符串首部的空白

System.out.println(string4);

System.out.println(string4.length());

String string5 = string.stripTrailing(); // 去重字符串尾部的空白

System.out.println(string5);

System.out.println(string5.length());

}

}

6.Optional 加强:

package com.atguigu.java11;

import static org.junit.Assert.*;

import java.util.Optional;

import org.junit.Test;

public class OptionalTest {

@Test

public void testName() throws Exception {

// of方法中如果传入的参数是null, 会抛出空指针异常

//Optional optional = Optional.of(null);

// ofNullable可以兼容空指针, 但是实际传入null后要小心

Optional optional = Optional.ofNullable(null);

Object object = optional.orElse("abc"); // 如果内部引用为空, 则返回参数中的引用, 否则返回内部引用: 打印abc

System.out.println(object);

Object object2 = optional.orElseThrow();

System.out.println(object2);

}

}

7.流自动文件复制:

package com.atguigu.java11;

import static org.junit.Assert.*;

import java.io.FileOutputStream;

import org.junit.Test;

public class InputStreamTest {

@Test

public void testName() throws Exception {

var cl = this.getClass().getClassLoader();

try (var is = cl.getResourceAsStream("file"); var os = new FileOutputStream("file2")) {

is.transferTo(os); // 把输入流中的所有数据直接自动地复制到输出流中

}

}

}

8.HTTPClient:

package com.atguigu.java11;

import static org.junit.Assert.*;

import java.net.URI;

import java.net.http.HttpClient;

import java.net.http.HttpRequest;

import java.net.http.HttpResponse;

import java.net.http.HttpResponse.BodyHandler;

import java.net.http.HttpResponse.BodyHandlers;

import java.util.concurrent.CompletableFuture;

import org.junit.Test;

public class HTTPClientTest {

@Test

public void testName2() throws Exception {

HttpClient client = HttpClient.newHttpClient();

HttpRequest request = HttpRequest.newBuilder(URI.create("http://127.0.0.1:8080/test/")).build();

BodyHandler responseBodyHandler = BodyHandlers.ofString();

CompletableFuture> sendAsync = client.sendAsync(request, responseBodyHandler);

sendAsync.thenApply(t -> t.body()).thenAccept(System.out::println);

//HttpResponse response = sendAsync.get();

//String body = response.body();

//System.out.println(body);

}

@Test

public void testName() throws Exception {

HttpClient client = HttpClient.newHttpClient();

HttpRequest request = HttpRequest.newBuilder(URI.create("http://127.0.0.1:8080/test/")).build();

BodyHandler responseBodyHandler = BodyHandlers.ofString();

HttpResponse response = client.send(request, responseBodyHandler);

String body = response.body();

System.out.println(body);

}

}

9.增强java启动器:

增强java启动器支持运行单个java源代码文件的程序.

注意点 :

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

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

一个命令编译运行源代码

看下面的代码。

// 编译

javac Javastack.java

// 运行

java Javastack

在我们的认知里面,要运行一个 Java 源代码必须先编译,再运行,两步执行动作。而在未来的 Java 11 版本中,通过一个 java 命令就直接搞定了,如以下所示。

java Javastack.java

10.新的Epsilon垃圾收集器:

package com.atguigu.java11;

import java.util.ArrayList;

import java.util.List;

class Garbage {

private double d1 = 1;

private double d2 = 2;

// 这个方法是GC在清除本对象时, 会调用一次

@Override

public void finalize() {

System.out.println(this + " collecting");

}

}

public class EpsilonTest {

// 执行: -XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC

public static void main(String[] args) {

List list = new ArrayList<>();

boolean flag = true;

int count = 0;

while (flag) {

list.add(new Garbage());

if (count++ == 500) {

list.clear(); // 将前五百个设置为垃圾对象,等待gc回收,之后创建的将不再进行回收,这个时候会导致内存溢出

}

}

}

}

主要用途如下 :

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

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

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

VM接口测试

Last-drop 延迟&吞吐改进

11.zgc:

这个东西还是实验性质的,暂时可以做测试使用

// linux 64位中可以使用

package com.atguigu.java11;

import java.util.ArrayList;

import java.util.List;

public class ZGCTest {

// 执行: -XX:+UnlockExperimentalVMOptions -XX:+UseZGC

public static void main(String[] args) {

List list = new ArrayList<>();

boolean flag = true;

int count = 0;

while (flag) {

list.add(new Garbage());

if (count++ % 500 == 0) {

list.clear();

}

try {

Thread.sleep(500);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值