【JDK】JDK17新特性小记

如果你在寻找长期支持并且性能稳定的 JDK 版本,我建议选择 JDK 17 LTS(Long-Term Support)。JDK 17 是 OpenJDK 的 LTS 版本,它提供了长期的支持和更新,通常会得到多年的维护。

JDK 17 LTS 提供了许多性能优化和改进,同时也包括了新的功能和增强。此外,作为一个 LTS 版本,它将得到长期的支持和更新,包括安全修复、性能改进和其他维护。这使得 JDK 17 成为一个值得考虑的稳定和可靠的选择,无论是用于生产环境还是其他用途。

当然,在选择 JDK 版本时,还要考虑你的具体需求和环境。但总的来说,JDK 17 LTS 是一个很好的选择,既提供了稳定性和性能,又能够获得长期的支持。

JDK11->JDK12->JDK15->JDK11

switch语句增强

JDK12->JDK17(多值)

多值判断处理

String name = switch(name){
	case "三年","四年" -> "一楼";
	case "五年","六年" -> "二楼";
	default -> "未知";
};

多行代码处理

String name = switch(name){
	case "三年","四年" -> {
		System.out.println("一楼");
		yield "一楼";
	};
	case "五年","六年" -> {
		System.out.println("二楼");
		yield "二楼";
	};
	default -> {
		System.out.println("未知")
		yield "未知";
	};
};

支持对象类型匹配

private String typeSwith(Object o){
 return switch(type){
 	case null -> "type is null";
 	case Integer i -> String.format("Integer i : %s", i);
 	case String  s -> String.format("String  s : %s", s);
 	default -> o.toString();
 };
}

字符串拼接解决

  • 斜杆【\】置于行尾,用来将两行连接为一行
  • 斜杆斯【\s】单个空白字符
 String html = """
 		<html>
 			<body>
 				<h1>Hello, JDK17 to %s<\h1>
 			<\body>
 		<\html>
		""";
		System.out.println(String.format(html,"Lucky"));

instanceof增强

是否符合哪个类型,不在使用强转,直接匹配当做该类型处理,增强代码可读性

JDK14->JDK16->JDK17

 Object ojb=1;
 if(obj instanceof Integer i){
 	System.out.println(i.intValue());
 } else if (obj instanceof Sgtring s){
 	System.out.println(s.charAt(0));
 }

密封类

密封类(Sealed Classes)

限制子类继承,修饰父类和接口特定的类型,防止子类变父类

 //父水果 > 苹果 橘子
 public abstract sealed class Fruit permits Apple, Orange {}
 //子-> 苹果(使用关键字final)
 public final class Apple extends Fruit {}
 //子-> 橘子(使用关键字)
 public non-sealed class Apple extends Orange {}
 //使用区别:
 //关键字final:无法再被子类继承
 //关键字non-sealed:可以再被子类继承
 //注意:
 //1、必须在同包里面com.lucky.xx:Fruit.java Apple.java Orange.java 
 //2、子类直接继承密封类
 //优点:安全、可控
 //1、密封类更加的安全,可以限制子类继承,限制了不必要的继承
 //2、密封类更加的可控,密封类限制范围,只能包下面类继承,减少代码的复杂性,更加易于维护

Record类

类型属性只读对象,可以用在场景比如:坐标。

它可以帮助我们构造全参的构造方法,提供只读的属性方法,未提供设置属性的方法。

// class变成record, 属性不在大括号里面,而在将方法声明参数里面
public record Coordinate(String longitude, String latitude){
}
// class编译文件
public record Coordinate(String longitude, String latitude){
	public Coordinate(String longitude, String latitude) {
    	this.longitude = longitude;
    	this.latitude = latitude;
    }
    public String longitude { return this.longitude; }
    public String latitude { return this.latitude ; }
}
// 使用熟悉需要new时候就要设置好属性

使用熟悉需要new时候就要设置好属性

public class CoordinateDemo {
	public static void main(String[] args){
		Coordinate coordinate1 = new Coordinate("x","y");
		Coordinate coordinate2 = new Coordinate("x","y");
		System.out.println(coordinate1.equals(coordinate2));
		// 返回对象(属性)相等:true
		// 因为底层进行record除了帮助我们生成全参构造方法、只读属性以外,还会帮忙重写equals法\hashCode法\toString方法
	}
}

优化空指针异常

JDK14->JDK17

原先只知道哪一行,然后猜哪一项对象空,现在直接告诉我们哪一个对象为null

CoordinateDemo.java::11

Cannot invoke "xxx.CoordinateDemo.longitude()" because the return value of "xxxx...longitude()" is null

ZGC垃圾收集器

JDK11诞生->JDK15转正->JDK17成熟
好处:垃圾回收不卡顿,java开发不用担心。
STW:垃圾回收触发的时候,我们jvm内存会冻结,所以线程停止运行,发生卡顿。减少卡顿时间,ZGC小于毫秒,堆内存设置很大,触发GC速度减少,提升性能。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

掘金者说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值