Jdk14新特性部分精解

JEP 364: ZGC 垃圾回收机制

zgc垃圾回收机制con很早以前就听说了这个概念,从jdk14开始zgc进入预览版本,也意味着jdk15后,zgc将成为java运行环境的默认垃圾回收器。

开启ZGC方法
编译的过程增加如下的选项
–with-jvm-features=zgc
在java参数文件,添加如下参数
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC
http://openjdk.java.net/jeps/364
http://openjdk.java.net/jeps/365

JEP 363: 移除 并发标记修改(CMS)垃圾回收器

http://openjdk.java.net/jeps/363

再通过-XX:+UseConcMarkSweepGC使用CMS 垃圾回收器将会发生如下错误:
Java HotSpot™ 64-Bit Server VM warning: Ignoring option UseConcMarkSweepGC;
support was removed in

JEP 368: 文本块 二次预览

http://openjdk.java.net/jeps/368

这个特性比较简单,针对长文本,SQL,在旧版本的处理方式是

String html = "<html>\n" +
              "    <body>\n" +
              "        <p>Hello, world</p>\n" +
              "    </body>\n" +
              "</html>\n";

显然用+的方式处理显得比较的冗余
新版本助攻采用的是如下方式,通过3个双引号括起来,之前jdk13是采用,但是在后台果断放弃掉了,所以,这里建议大型开发团队在更新jdk的时候,一定要审慎,避免出现这种尴尬的情况

String html=`
	 <html>
		<body>
	         <p>Hello, world</p>
	     </body>
	 </html>
`;
String html = """
              <html>
                  <body>
                      <p>Hello, world</p>
                  </body>
              </html>
              """;

那么问题来了,如果需要拼接一些变量应该怎么办呢,我们记得,在Groovy或者python中是可以类似如下的场景的

username='jjj'
age=18
str='this student:$username,age:$age'

这样直接替换的,一来简明易懂,但是java在这方面处理比较麻烦,但是还是有方法下面提供2个方法

方法1

String code = """
              public void print(""" + type + """
               o) {
                  System.out.println(Objects.toString(o));
              }
              """;
             

方法2

String code = """
              public void print($type o) {
                  System.out.println(Objects.toString(o));
              }
              """.replace("$type", type);

方法3

String code = String.format("""
              public void print(%s o) {
                  System.out.println(Objects.toString(o));
              }
              """, type);
              

方法4

String source = """
                public void print(%s object) {
                    System.out.println(Objects.toString(object));
                }
                """.formatted(type);

怎么样,是不是很麻烦,笔者也是这么觉得的。
另外java还提供3个方法,有兴趣的读者自行研究

String::stripIndent(): used to strip away incidental white space from the text block content
String::translateEscapes(): used to translate escape sequences
String::formatted(Object… args): simplify value substitution in the text block

JEP 305: instanceof 的扩展

//传统的instanceof尝尝会 是如下的几个步骤
//1.判断是否为目标类型
//2.如果是,转化为对应目标类型
//3.处理

Object obj="123";
if(obj instanceof String){
    String s= (String) obj;
    System.out.println(s);
}else{
    System.out.println("unexpected type of object");
}

新版本的处理方式可以如下,instanceof类型后加一个变量,然后,在括号里的代码快

if(obj instanceof String s){
    System.out.println(s);
}else{
    System.out.println("unexpected type of object");
}

http://openjdk.java.net/jeps/305

JEP 358: 扩展空指针异常详细

http://openjdk.java.net/jeps/358

JEP 359: 新数据类型Records(预览特性)

http://openjdk.java.net/jeps/359

简述

Records是一个新的概念,也是一个新的关键字

他的作用是简化程序员书写的代码,针对Javabean 的书写,功能类似于scala的case,kotlin的data。c#中的record

代码

/**
 * jdk14书写方式只需要在括号中声明javabean属性
 * 就会自动的帮我们生成对应名称的属性和方法,
 * 以及toString,equals,方法
 */
record Range(int x,int y){
}

//编译后的代码
static final class Range extends java.lang.Record {
	private final int x;
	private final int y;
	public Range(int x, int y) { /* compiled code */ }
	public java.lang.String toString() { /* compiled code */ }
	public final int hashCode() { /* compiled code */ }
	public final boolean equals(java.lang.Object o) { /* compiled code */ }
	public int x() { /* compiled code */ }
	public int y() { /* compiled code */ }
}

//使用实例代码
var r=new Range(7,8);
//自动提供了toString方法
System.out.println(r.toString());
//自动提供了equals方法
System.out.println(r.equals(new Range(8,7)));
//通过属性获取属性
System.out.println(r.x+":"+r.x);
//通过方法获取属性
System.out.println(r.x()+":"+r.y());

//对字段的放射方法
Arrays.asList(r.getClass().getRecordComponents()).forEach(it->{
    String name = it.getName();
    System.out.println(name);
});

//用于通过反射判断一个对象是否为record类型的对象
System.out.println(r.getClass().isRecord());


//同样的,他也是支持自己手动的去处理构造函数逻辑,代码如下
record Range(int lo, int hi) {
  public Range {
    if (lo > hi)  /* referring here to the implicit constructor parameters */
      throw new IllegalArgumentException(String.format("(%d,%d)", lo, hi));
  }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值