• 112.java基础21(java11新特性回顾)


    1.JShell

    最低java9 jdk; 并配置环境变量
    cmd 中启动 jshell 进入 命令行,可以直接执行java代码,不需要编译
    /help  帮助界面
    

    2.局部变量类型推断:

    List<interger> list = new ArrayList<>();  
    list.add("abc");  // 不能添加,转化不了Integer
    var a = "abc"; == String a = "abc";
    
    var b = new StringBuffer("123");
    var a = new ArrayList<Integer>();
    
    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<T>: 消费型函数式接口
            public void accept(T t):
        Counsumer<String> consumer = t -> Systeom.out.println(t.toUpperCase());
    	Counsumer<String> consumer = (var t) -> Systeom.out.println(t.toUpperCase());
    	
     	Counsumer<String> 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<Integer> set = Set.of(100, 50, 20, 30, 10, 8, 100, 8);
    		Set<Integer> set = Set.of(100, 50, 20, 30, 10, 8);
    		System.out.println(set.getClass());
    		Stream<Integer> stream = Stream.of(50, 20, 30, 70);
    	}
    	@Test
    	public void test2() {
    		//快速创建数组
    		int[] arr = {1, 9, 3, 2, 8};
    		// 快速把数据变成集合的方法
    		List<String> list1 = Arrays.asList("aa", "yyy", "zzz", "123");
    		//list1.add("ppp"); // 是一个不可以添加元素的集合
    		// 集合的创建可以使用更简单的方式
    		List<String> list2 = List.of("aa", "bbb", "cc", "DD");
    		System.out.println(list2);
    		//list2.add("yyy"); // 不可以添加元素
    		System.out.println(list2);
    	}
    	@Test
    	public void test1() {
    		List<String> 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<Integer> stream1 = Stream.iterate(1, t -> (2 * t) + 1);
    		stream1.limit(10).forEach(System.out::println);
    		
    		System.out.println("*************************");
    		// 有限的迭代
    		Stream<Integer> stream2 = Stream.iterate(1, t -> t < 1000, t -> (2 * t) + 1);
    		stream2.forEach(System.out::println);
    	}
    	
    	@Test
    	public void test2() {
    		Stream<Integer> stream1 = Stream.of(3, 9, 20, 22, 40, 7);
    		// 新方法, takeWhile, dropWhile
    		// 从流中一直获取判定器为真的元素, 一旦遇到元素为假, 就终止处理.
    		Stream<Integer> 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<Integer> stream3 = stream1.dropWhile(t -> t % 2 != 0);
    		stream3.forEach(System.out::println); //输出 20,22,40,7
    		
    	}
    	
    	@Test
    	public void test1() {
    		Stream<Integer> stream1 = Stream.of(3, 9, 20, 22, 40);
    		//stream1.forEach(t -> System.out.println(t));
    		stream1.forEach(System.out::println);
    		
    		System.out.println("***********************************");
    		
    		Stream<Object> stream2 = Stream.of(); // 流中没有数据
    		stream2.forEach(System.out::println);
    		
    		System.out.println("***********************************");
    		
    		// 传入null会被解析为是一个数组对象, 会进一步访问它的长度信息
    		//Stream<Object> stream3 = Stream.of(null);
    		//stream3.forEach(System.out::println);
    		
    		// 可以传入 一个null来创建流对象
    		Stream<Object> 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 = " 	  
     ";
    		System.out.println(string.isBlank()); // 判断字符串中的字符是否都是空白
    		
    		System.out.println("**************************");
    		
    		string = " 	  
     abc 	 ";
    		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<String> optional = Optional.of(null);
    		// ofNullable可以兼容空指针, 但是实际传入null后要小心
    		Optional<Object> 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<String> responseBodyHandler = BodyHandlers.ofString();
    		CompletableFuture<HttpResponse<String>> sendAsync = client.sendAsync(request, responseBodyHandler);
    		sendAsync.thenApply(t -> t.body()).thenAccept(System.out::println);
    		//HttpResponse<String> 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<String> responseBodyHandler = BodyHandlers.ofString();
    		HttpResponse<String> 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<Garbage> 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<Garbage> 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();
    			}
    		}
    	}
    }
    
    
  • 相关阅读:
    自动化测试selenium教程
    Java开发.gitignore文件包含.iml,.log的看法
    基于接口设计与编程
    搭建大众点评CAT监控平台
    正确的打日志姿势
    【每天一条Linux指令-Day1】kill掉多个mysql的进程
    一道SQL面试题——表行列数据转换(表转置)
    @SuppressWarnings注解用法详解
    Spring IoC的底层技术支持——Java反射机制
    出现java.lang.NoSuchMethodError错误的原因
  • 原文地址:https://www.cnblogs.com/liuzhanghao/p/13958319.html
Copyright © 2020-2023  润新知