Java新特性

Java11

可伸缩低延迟垃圾收集器-ZGC

(最核心)无论开了多大的堆内存(128G,2T),保证低于10ms的JVM停顿,远胜于前一代的G1

简单介绍

  • 所有阶段几乎(除了开始的GCRoot的扫描)都是并发执行(应用线程与GC线程并发)
  • 像G1一样划分Region,但更加灵活。每个region的大小不固定,动态创建销毁Region,动态决定大小,不同大小的对象分配在不同的Region里
  • 和G1一样会做Compacting-压缩,

Unicode10

升级了现有平台API,支持Unicode10

支持emoji表情:例如 \uD83E

基于嵌套的访问控制

在private、public、protected基础上,提供了一种新的访问控制机制:Nest

如果在一个类中嵌套了多个子类,那么子类可以访问彼此的私有成员。

class Test{
	private static class X{
		private int x;
	}

	private static class Y{
		void test(){
			X x = new X();
			x.x = 1; // 以上操作在java11之前也是允许的

			Field field = X.getClass().getDeclaredField("x");
			// 在java11之前需要将访问权限设置为true才可以进行私有字段的值设置,否则会报错
			// field.setAccessible(true);
			// java11中,不需要进行setAccessible(true)
			field.setInt(x, 2);
		}
	}
}

动态类文件常量

增加了一个常量类型 CONSTANT_Dynamic

public class DynamicTest{
	public void static main(String[] args) throws Throwable{
		// MethodHandles为 java7中添加的常量类型
		MethodHandles.Loopup lookup = MethodHandles.loopup();
		// 使用 lookup寻找一个静态方法,参数为 类、静态方法名、返回值类型
		// 它在运行的时候才会判断返回值类型
		MethodHandle mh = lookup.findStatic(
			DynamicTest.class, "test", MethodType.methodType(void.class)
		);
		// 此时 MethodHandle对象封装了test方法的全部信息
		mh.invokeExact();// 运行结果会输出hello
	}

	private static void test(){
		System.out.println("hello");
	}
}

标准HTTP客户端

在JDK9中就已经引入了HTTPClient,到JDK11时,HTTPClient API作为一个标准API提供在java.net.http包中

目标:取代HttpURLConnection,此API在1.1发布,使用繁琐,并且只能以阻塞模式工作

public class HttpClientExample{
	// 同步Get方法
	private static void sysnGet(String uri) throws Exception {
		HttpClient client = HttpClient.newHttpClient();
		// 通过uri的方式创建一个request请求,参数为uri,调用build方法创建
		HttpRequest request = HttpRequest.newBuilder().uri(
			URI.create(uri)
		).build();
		// 声明一个HttpResponse对象接收 client发出的请求,send参数为request请求和响应的接收类型
		HttpResponse<String> response = client.send(
			request, HttpResponse.BodyHandlers.ofString()
		);
		System.out.println(response.statusCode());// 输出响应的状态码
		System.out.println(response.body());// 响应内容
	}

	// 异步Get方法
	private static void  asynGet(String uri) throws Exception{
		HttpClient client = HttpClient.newHttpClient();
		// 通过uri的方式创建一个request请求,参数为uri,调用build方法创建
		HttpRequest request = HttpRequest.newBuilder().uri(
			URI.create(uri)
		).build();
		// 与同步Get不同的是,异步Get使用 CompleteableFuture来接收返回值
		CompleteableFuture<HttpResponse<String>> future = 
			client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
		// 当future执行完成时
		future.whenComplete(
			(respon, ex) -> {
				if (ex != null){ // 如果有异常,抛出
					ex.printStackTrace();
				} else {
					System.out.println(respon.getStatusCode());
					System.out.println(respon.body());
				}
			}
		).join(); // 如果运行在main线程中,不阻塞获取不到结果
	}
	
	public static void main(String[] args) throws Exception{
		String uri = "具体uri";
		sysnGet(uri);
	}
}

Lambda参数的本地变量语法

允许var作为声明隐式类型的lambda表达式的形参时使用

目标:将隐式类型的lambda表达式中的形参声明的语法 与 局部变量声明的语法对齐

java11之前:

  • var作为关键字,但只能当作局部变量,不能当作类变量
  • 使用时要赋初始值
  • 并且var只是编译器做类型推断,赋初始值后,var的类型即已经确定,不能再更改

java11中:它最大的作用就是可以在lambda表达式参数上使用注解

public class Test{
	private static void lambdaWithVar(){
		List<Integer> nums = Arrays.asList(9,2,4,5);
		nums.sort(
			(@NutNULL var s1, @NutNULL var s2) -> { // 必须都是var变量
				// 排序判断逻辑
			}
		);
	}
}

启动单文件源代码程序

增强Java启动程序以运行作为单个Java源代码文件提供的程序

直接使用 java ***.java 运行源文件,不通过编译成的class文件运行

改进Aarch64内联函数

改进现有的字符串和数组h函数,并在Aarch64处理器上为java.lang.Math sin、cos和log函数实现新的内联函数

目标:专用的CPU架构可以提高应用程序的性能

Math.sin() cos() log()三个方法性能提高大概8-9倍

新增常用的API

String:

  • strip:可以去掉Unicode空格(trim不可以)
  • isBlank:字符串为空或仅包含空格返回false
  • lines:返回Stream< String> ,字符串中行的流,由换行符去分割字符串
  • repeat(int count):将字符串重复count次返回
  • stripLeading:去掉字符串中的前导空格(就是正文前面的空格)
  • stripTrailing:去掉字符串中的尾随空格

File:

  • ReadString(Path path):将内容读为String
  • WriteString(Path path)
public static void main(String[] args){
	String path = "PATH";
	// 参数为写入的文件路径、内容、编码
	Files.writeString(Path.of(path),  "content", StandardCharsets.UTF_8);
	
	String content = Files.readString(Path.get(path), StandardCharsets.UTF_8);
}

List:

  • 静态of()方法:List<String> list = List.of("a", "b"); 此方法生成的是不可变对象
  • 通过集合创建数组:例如String数组:String[] str = list.toArray(String::new);

删除了 Thread中的destory和stop方法

Java12(预览特性)

增强的switch语句

扩展switch语句,使其可以用作语句或表达式,并且"传统"或"简化"两种都可以使用

public static void main(String[] args){
	int result = 1;
	switch (result) {
		case 0 -> System.out.println(1);
		case 1 -> System.out.println(2);
		default -> System.out.println(3);
	}
	// 支持返回值
	result = swith(result){
		case 0 -> 1;
		case 1 -> 2;
		default -> 3;
	};
}
命令 javac --release 12 --enable-preview -Xlint:preview 文件名.java 编译   注意文件中不能有包名
     java --enable-preview 文件名  执行

微基准测试

Microbenchmark 作为常规性能测试的一部分,在JDK源码中添加一些基础的微基准测试

目标:可以基于 Java Microbenchmark Harness (JMH) 轻松测试JDK的性能

默认的类数据共享

在64位平台上使用默认类列表,增强了JDK生成的类共享(CDS),改善了开箱即用的启动时间

在多个JVM间共享核心类,减少内存占用

对G1垃圾收集器的增强

如果G1垃圾收集器有可能超过预期的暂停时间,则可以使用中止选项

如果应用程序活动非常低,G1应该在合理的时间段内释放未使用的Java堆内存

目标: 可以中止可选部分的回收以达到停顿时间目标;可以在空闲时间自动将Java堆内存返还给操作系统

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值